redis基础04-redis的过期策略和淘汰策略
redis是内存缓存,内存设备的内容不是无限量的,所以就有两个问题必须要讨论:1-缓存数据过期怎么清除;2-内存如果满了要怎么保证redis服务正常运行。
redis最大内存配置
maxmemory <bytes> #最大使用内存
1.redis的过期策略
存储到redis的数据过期了,redis是怎么清除的?redis不可能随时查询每个key,判断缓存数据是否过期了。
redis提供了两种过期策略:
1.定期删除
定期删除,定期删除是指Redis默认每隔 100ms 就 随机抽取 一些设置了过期时间的key,检测这些key是否过期,如果过期了就将其删除。
- 两个关键点:
- 随机抽取,设置了过期时间的key。并不是实时查询所有的设置了过期时间的key
- key如果过期了将其删除,没有过期的忽略掉。那么就存在已经过期,但是没有被清理的缓存。
- 配置
#用于提高LRU/TTL算法的精准度,在自动清理内存时,指定的数字越大,CPU消耗就越多,默认为5。
maxmemory-samples 5
问题1:为什么不实时删除过期redis数据
1.实时查询所有key的过期状态,当redis数据量较大的时候,会占用cpu资源专门去处理过期,对CPU资源是一种浪费
2.为了避免资源浪费,所以配置定时随机抽取设置过期时间key进行判断
问题2:如果key已经过期了很久,但是每次随机获取的key都没有不包含这个key,那这个过期key缓存,怎么处理
2.惰性删除
针对上面定期删除的“漏网之鱼”的key,redis提供了其他的策略。
惰性删除:在获取某个key之前先判断这个key是不是过期了,如果过期了对这个key进行删除。
问题1:当redis数据量比较大,定期删除和惰性删除。还是会有很多过期key漏掉,导致过期key过多,导致内存不足的情况。
1.首先要判断redis设置的最大内存是否合理:一般推荐Redis设置内存为最大物理内存的四分之三
2.如果设置合理的时候,这种时候就要引入redis的淘汰策略
2.redis的淘汰策略
redis提供的了淘汰策略主要有以下几种:
- volatile-lru # LRU算法删除过期key
- allkeys-lru # LRU算法删除key(不区分过不过期)
- volatile-random # 随机删除过期key
- allkeys-random # 随机删除key(不区分过不过期)
- volatile-ttl # 删除快过期的key
- noeviction # 禁止删除key,这如果内存不足,会直接返回错误。默认配置
- allkeys-lfu #
- volatile-lfu #
lru算法
lfu算法
lfu算法是根据数据访问的频率来选择被淘汰数据的
- 配置
maxmemory-policy volatile-lru
淘汰策略执行的过程:
- 客户端执行一条命令,导致Redis需要增加数据(比如set key value);
- Redis会检查内存使用情况,如果内存使用超过 maxmemory,就会按照配置的置换策略maxmemory-policy删除一些key;
- 再执行新的数据的set操作;
3.总结
1.redis的过期策略一般是:主动删除+惰性删除
2.redis的淘汰策略一般是:allKeys-lru,对所有key最近最少使用淘汰
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)