Redis的缓存回收策略&过期淘汰策略

167 阅读2分钟

Redis的内存回收主要依赖缓存回收策略和过期。

1 过期淘汰

1.1 定时删除 对于每一个设置了过期时间的key都会创建一个定时器,一旦到达过期时间就立即删除。 缺点:对CPU很不友好,影响redis的吞吐量和响应时间。

1.2 惰性删除

访问的时候判断是否过期。

缺点:对内存很不友好。

1.3 定期删除

定时来扫描,可以控制时间间隔和每次扫描的时间,对CPU和内存做了个平衡。

在Redis中,同时使用了惰性删除和定期删除。

1.4 删除key 一般情况下,效率会非常高。但是在如果是个大对象的情况下,比如是个包含了千万个元素的hashmap下,那么单线程就会卡顿。在后来的版本中,redis使用后台线程进行删除,异步回收内存。

在判断key需要过期之后,真正删除key的过程是先广播expire事件到从库和AOF文件中,然后在根据redis的配置决定立即删除还是异步删除。

内存淘汰策略

  • noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错。

  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间(server.db[i].dict)中,移除最近最少使用的 key(这个是最常用的)。

  • allkeys-random:当内存不足以容纳新写入数据时,在键空间(server.db[i].dict)中,随机移除某个 key。

  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间(server.db[i].expires)中,移除最近最少使用的 key。

  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间(server.db[i].expires)中,随机移除某个 key。

  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间(server.db[i].expires)中,有更早过期时间的 key 优先移除。