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最近最少使用淘汰

posted @   PerfectLi  阅读(94)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示