> 文档中心 > Redis过期数据的删除策略以及淘汰策略——简单记忆方式

Redis过期数据的删除策略以及淘汰策略——简单记忆方式


Redis过期数据的删除策略——简单记忆方式

  1. 惰性删除 :只会在取出 key 的时候才对数据进行过期检查。这样对 CPU 最友好,但是可能会造成太多过期 key 没有被删除。
  2. 定期删除 : 每隔一段时间抽取一批 key 执行删除过期 key 操作。并且,Redis 底层会通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响。

定期删除对内存更加友好,惰性删除对 CPU 更加友好。两者各有千秋,所以 Redis 采用的是 定期删除+惰性/懒汉式删除 。

即使有两种删除策略,也还是会发生有大量的key删除不到的情况,导致Redis内存满了之后无法存储新的数据,所以这时候就需要淘汰策略来做事了。

Redis 提供 6 种数据淘汰策略:

  1. volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  2. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  3. volatile-lfu(least frequently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰
  4. allkeys-lru(least recently used):当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)
  5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  6. allkeys-lfu(least frequently used):当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的 key

从以上策略总结出几个要点:
在这里插入图片描述

还有两种比较特殊的淘汰策略可以单独记忆:

  1. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  2. no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错(直接摆烂)。这个应该没人使用吧!

但是Redis默认的淘汰策略是 no-eviction,惊不惊喜,意不意外。
可以通过redis.conf中的maxmemory-policy配置淘汰策略

# The default is:## maxmemory-policy noeviction