redis Key的过期淘汰机制
温馨提示:
本文最后更新于 2022年06月14日,已超过 532 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
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种数据淘汰策略:
- volatile-lru :从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。
- volatile-ttl :从已设置过期时间的数据集中挑选将要过期的数据淘汰。
- volatile-random :从已设置过期时间的数据集中任意选择数据淘汰。
- allkeys-lru :当内存不足以容纳新写入数据时移除最近最少使用的key。
- allkeys-random :从数据集中任意选择数据淘汰。
- no-enviction(默认) :当内存不足以容纳新写入数据时,新写入操作会报错。
一般情况下,推荐使用 volatile-lru 策略,对于配置信息等重要数据,不应该设置过期时间,这样Redis就永远
不会淘汰这些重要数据。对于一般数据可以添加一个缓存时间,当数据失效则请求会从DB中获取并重新存入Redis
中。
正文到此结束
- 本文标签: redis
- 本文链接: https://blog.wangqi2020.top/article/29
- 版权声明: 本文由王祁原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权