文章目录

  • redis的过期淘汰策略
  • redis对于过期键有三种清除策略:
  • LRU(least recently used)算法
  • LFU(least frequently used) 算法
  • 具体应用案例
  • 对于主从缓存过期


redis的过期淘汰策略

redis对于过期键有三种清除策略:

  1. 被动删除: 当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key (垃圾key如果没访问,则不会删除)
  2. 主动删除: 由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key
  3. 当前已用没存超过maxmemory限定时,触发主动删除策略

主动删除策略在Redis 4.0 之前一共实现了6种内存淘汰策略,在 4.0 之后,又增加了2种策略,总共8种

a) 针对设置了过期时间的key做处理

  1. volatile-ttl: 在筛选时,会针对已设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除。
  2. volatile-random: 在设置了过期时间的键值对中,进行随机删除。
  3. volatile-lru: 会使用LRU算法筛选设置了过期时间的键值对删除
  4. volatile-lfu: 会使用LFU算法筛选设置了过期时间的键值对删除。

b) 针对所有的key做处理

  1. allkeys-random: 所有键值对随机删除
  2. allkeys-lru: 使用lRU算法在所有数据中筛选删除
  3. allkeys-lfu: 使用LFU算法在所有数据中筛选删除

c) 不处理

  1. noeviction: 不会剔除任何数据,拒绝所有写入操作并返回客户端信息(error)OOM command not allowed when used memory,此时redis只响应读操作。

LRU(least recently used)算法

最近最少使用,淘汰很久没有被访问过的数据,以最近一次访问时间做参考

LFU(least frequently used) 算法

最不经常使用,淘汰最近一段时间被访问最少的数据,以次数做参考

如何配置

#配置maxmemory
maxmemory 100mb
#配置淘汰策略
maxmemory-policy allkeys-lru

具体应用案例

大多数情况推荐使用volatile-lru

如果Mysql里有 2000W 数据,而Redis中只能存 20W 数据,如何保证redis中的数据都是热点数据?

方案:
只能存储 20w 条数据,那肯定要保证redis存储的都是热点数据,即:被频繁访问到的数据;并且要保证Redis的内存能够存放20w数据,要计算出Redis内存的大小。

(1) 保留热点数据:对于保留 Redis 热点数据来说,我们可以设定 Redis 的key过期时间结合内存淘汰策略来实现,比如,使用allkeys-lfu(以次数为准,越高越热)淘汰策略,该淘汰策略是从 Redis 的数据中挑选最近最少使用的数据删除,这样频繁被访问的数据就可以保留下来了

(2)保证 Redis 只存20w的数据:1个中文占2个字节,假如1条数据有100个中文,则1条数据占200字节,20w数据乘以200个字节 (200000 * 200 = 40000000),约等于4000万个字节,大于等于38M,所以要保证能存20w数据,Redis 需要38M的内存,对应的内存设定之后,一旦数据满了就可以触发我们的数据淘汰策略,保证数据存储满足20w且为热点数据。

对于主从缓存过期

从节点接收到主节点的del命令,从节点删除从库中的键值