redis的过期和内存淘汰策略
参考链接
redis 使用过期策略: 定期过期+惰性过期
redis 默认使用的内存淘汰策略:noeviction
过期策略
redis的过期策略就是指,key过期后,redis的处理机制。redis的过期的策略通常有3种,定时过期,惰性过期,定期过期
定时过期
对有过期时间的key都开启一个定时器,到过期时间后就立即删除。
优点:及时释放内存(对内存友好)
缺点:会占用大量的cup资源去处理过期数据,从而影响缓存的响应时间和吞吐量。
惰性过期
访问(所有键的读写)key是,才做key的过期判断,如果过期则删除,
优点:最大化的节省CPU资源。
缺点:对内存不够友好,极端情况下,过期的key都没有被访问,导致占用大量的内存。
代码文件:db.c/expireIfNeeded
定期过期
周期性的去抽样删除过期的key,(expires 字典中key)是前两种的策略的一种折中的方案。
使用定期删除是随机抽样的,所以不能删除所有过期的数据,可能会有”漏网之鱼“,还存在在redis中的。
代码文件和配置文件
expire.c/activeExpireCycle
redis.conf/hz
内存淘汰策略
当我们使用 reids内存到达阀值了时候, 就使用 内存淘汰策略 来 ”释放内存“,
# maxmemory <bytes> 配置内存阈值
# maxmemory-policy noeviction
前提:当内存不足以容纳新写入数据时
不进行淘汰的策略
- noeviction(默认策略)
不会对缓存数据进行淘汰,只是会返回一个错误,
会进行淘汰的策略
在所有的数据中筛选
- allkeys-lru(最近最少使用)
使用lru算法移出key
- allkeys-random
随机移出一个key
- allkeys-lfu
使用lfu算法移出key
在设置过期时间的数据中筛选
- volatile-lru
使用lru算法移出key
- volatile-random
随机移出一个key
- volatile-lfu
使用lfu算法移出key
- volatile-ttl
更早过期的key,优先被删除,根据过期时间先后进行删除,越早过期的越先被删除
总结
过期策略强调的是对过期键的操作,
内存淘汰测试强调的是,当内存不足是,如何 删除数据(使用那种机制),来释放内存。