免费注册个人网站,网站开发 制作,东莞手机网站制作公司,windows同步wordpress参考#xff1a;面试官#xff1a;为什么 Redis 不立刻删除已经过期的数据#xff1f;
目录
1.Redis 给缓存数据设置过期时间有什么用#xff1f;
2.Redis 是如何判断数据是否过期的呢#xff1f;
3.Redis 过期 key 删除策略了解么#xff1f;
4.大量 key 集中过期怎… 参考面试官为什么 Redis 不立刻删除已经过期的数据
目录
1.Redis 给缓存数据设置过期时间有什么用
2.Redis 是如何判断数据是否过期的呢
3.Redis 过期 key 删除策略了解么
4.大量 key 集中过期怎么办 1.Redis 给缓存数据设置过期时间 在日常中短信验证码一般只在 1 分钟内有效用户登录的 Token 可能只在 1 天内有效超过过期时间就会失效。上面的例子就是Redis 给缓存数据设置过期时间的一个业务场景那么Redis 给缓存数据设置过期时间有什么好处因为内存是有限且珍贵的如果不对缓存数据设置过期时间那内存占用就会一直增长最终可能会导致 OOM 问题。通过设置合理的过期时间Redis 会自动删除暂时不需要的数据为新的缓存数据腾出空间。 有助于缓解内存的消耗。 #设置过期时间命令 expire命令setex 命令expire key 60 # 数据在 60s 后过期pexpire key 60000 # 命令 pexpire 设置 key 在 60000 毫秒即 60 秒后过期#设置过期时间命令 setex 命令setex key 60 value # 数据在 60s 后过期, seyex 将 key 设置为 value并在 60 秒后过期psetex key 60000 value #使用 PSETEX 指定毫秒为单位的过期时间#查看过期时间命令ttl命令ttl key # 查看数据还有多久过期# 移除一个键的过期时间,使其永久存储有效persist 命令persist my_key 注Redis 中除了字符串类型有自己独有设置过期时间的命令 setex 外其他方法都需要依靠 expire 命令来设置过期时间 。 OOM 问题Out Of Memory 当 JVM 因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时就会抛出这个错误。 分配过少JVM 初始化内存小业务使用了大量内存或者不同 JVM 区域分配内存不合理 代码漏洞某一个对象被频繁申请不用了之后却没有被释放导致内存耗尽 内存泄漏申请使用完的内存没有释放导致虚拟机不能再次使用该内存此时这段内存就泄露了。因为申请者不用了而又不能被虚拟机分配给别人用久而久之内存空间会越来越小。 内存溢出申请的内存超出了 JVM 能提供的内存大小此时称之为溢出如果内存泄漏持续存在最后一定会溢出两者是因果关系。 2.Redis 判断数据是否过期 Redis 通过一个叫做过期字典redisDB 结构的 expires 字典保存了数据库中所有键的过期时间该字典被称为过期字典可以看作是 hash 表来保存数据过期的时间。过期字典的键一个指针指向 redisDB中的某个 key(键对象)过期字典的值是一个 long long 类型的整数这个整数保存了 key 所指向的数据库键的过期时间毫秒精度的 UNIX 时间戳。 在查询一个 key 的时候Redis 首先检查该 key 是否存在于过期字典中时间复杂度为 O(1)如果不在就直接返回在的话需要判断一下这个 key 是否过期过期直接删除 key 然后返回 null。 3.Redis 过期 key 删除策略 常用的过期数据的删除策略 惰性删除只会在取出/查询 key 的时候才对数据进行过期检查。这种方式对 CPU 最友好但是可能会造成太多过期 key 没有被删除。 好处是如果我们设置了过期时间的key 数量非常庞大的话挨个遍历检查是非常耗时的会严重影响性能。Redis 设计这种策略的目的是为了平衡内存和性能。 定期删除周期性地随机从设置了过期时间的 key 中抽查一批然后逐个检查这些 key 是否过期过期就删除 key。相比于惰性删除定期删除对内存更友好对 CPU 不太友好。 延迟队列把设置过期时间的 key 放到一个延迟队列里到期之后就删除 key。这种方式可以保证每个过期 key 都能被删除但维护延迟队列太麻烦队列本身也要占用资源。 因为在key 多的情况下一个延迟队列可能无法容纳修改 key 的过期时间就需要调整期在延迟队列中的位置还需要引入并发控制。 定时删除每个设置了过期时间的 key 都会在设置的时间到达时立即被删除。这种方法可以确保内存中不会有过期的键但是它对 CPU 的压力最大因为它需要为每个键都设置一个定时器。 Redis 采用的是定期删除惰性/懒汉式删除 结合的策略 定期删除对内存更加友好惰性删除对 CPU 更加友好二者结合起来使用既能兼顾 CPU 友好又能兼顾内存友好。 Redis 的定期删除过程 随机的周期性地随机从设置了过期时间的 key 中抽查一批并不能够保证所有过期键都会被立即删除。这就是为什么有的 key 过期了并没有被删除。而且Redis 底层还会通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响。 因此定期删除会受到执行时间和过期 key 的比例的影响 如果删除操作的执行时间已经超过了阈值就会中断这一次定期删除循环以避免使用过多的 CPU 时间。 如果这一批过期的 key 比例超过一个比例就会重复执行此删除流程以更积极地清理过期 key。相应地如果过期的 key 比例低于这个比例就会中断这一次定期删除循环避免做过多的工作而获得很少的内存回收。 Redis 7.2 版本每次随机抽查数量是 20 也就是说每次会随机选择 20 个设置了过期时间的 key 判断是否过期。Redis 7.2 版本的执行时间阈值是 25ms过期 key 比例设定值是 **10%**。 4.大量 key 集中过期 如果存在大量 key 集中过期的问题可能会使 Redis 的请求延迟变高。 尽量避免 key 集中过期在设置键的过期时间时尽量随机一点。 对过期的 key 开启 lazyfree 机制修改 redis.conf 中的 lazyfree-lazy-expire参数即可这样会在后台异步删除过期的 key不会阻塞主线程的运行。