redis-过期和内存淘汰策略

95 阅读2分钟

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,优先被删除,根据过期时间先后进行删除,越早过期的越先被删除

总结

过期策略强调的是对过期键的操作,

内存淘汰测试强调的是,当内存不足是,如何 删除数据(使用那种机制),来释放内存。