原创

redis Key的过期淘汰机制

温馨提示:
本文最后更新于 2022年06月14日,已超过 675 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

Key的过期淘汰机制

Redis可以对存储在Redis中的缓存数据设置过期时间,比如我们获取的短信验证码一般十分钟过期,我们这时候就
需要在验证码存进Redis时添加一个key的过期时间,但是这里有一个需要格外注意的问题就是:并非key过期时间到
了就一定会被Redis给删除。

定期删除

Redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 Key,检查其是否过期,如果过期就删除。为什么是
随机抽取而不是检查所有key?因为你如果设置的key成千上万,每100毫秒都将所有存在的key检查一遍,会给CPU
带来比较大的压力。

惰性删除

定期删除由于是随机抽取可能会导致很多过期 Key 到了过期时间并没有被删除。所以用户在从缓存获取数据的时
候,redis会检查这个key是否过期了,如果过期就删除这个key。这时候就会在查询的时候将过期key从缓存中清除。

内存淘汰机制

仅仅使用定期删除 + 惰性删除机制还是会留下一个严重的隐患:如果定期删除留下了很多已经过期的key,而且用
户长时间都没有使用过这些过期key,导致过期key无法被惰性删除,从而导致过期key一直堆积在内存里,最终造成
Redis内存块被消耗殆尽。那这个问题如何解决呢?这个时候Redis内存淘汰机制应运而生了。Redis内存淘汰机制提
供了6种数据淘汰策略:

  1. volatile-lru :从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。
  2. volatile-ttl :从已设置过期时间的数据集中挑选将要过期的数据淘汰。
  3. volatile-random :从已设置过期时间的数据集中任意选择数据淘汰。
  4. allkeys-lru :当内存不足以容纳新写入数据时移除最近最少使用的key。
  5. allkeys-random :从数据集中任意选择数据淘汰。
  6. no-enviction(默认) :当内存不足以容纳新写入数据时,新写入操作会报错。

一般情况下,推荐使用 volatile-lru 策略,对于配置信息等重要数据,不应该设置过期时间,这样Redis就永远
不会淘汰这些重要数据。对于一般数据可以添加一个缓存时间,当数据失效则请求会从DB中获取并重新存入Redis
中。

正文到此结束
本文目录