> 文章列表 > Redis过期键的删除策略

Redis过期键的删除策略

Redis过期键的删除策略

在这里插入图片描述

文章目录

  • 1 问题背景
  • 2 过期键删除策略
  • 3 Redis的实现
  • 4 内存淘汰策略

1 问题背景

项目中用到Redis,得了解下Redis过期键的删除策略,他是否能做到实时删除的?

参考自《Redis的设计与实现》这个PDF电子书

2 过期键删除策略

针对过期键的删除策略,有以下3种(这并不代表Redis就用了这3种):

  1. 定时删除。给每个键都设置一个定时器,时间一到就删除该键。缺点是占用CPU资源。
  2. 惰性删除。查询该键的时候,先判断是否过期,过期则删除并返回null值给客户端。缺点是不能实时删除,会占用内存资源
  3. 定期删除。每隔一段时间去扫描键,并删除过期键。难点是确定删除操作执行的时长以及频率。删除操作太频繁或时长太长,定期删除会退化成定时删除,会过多占用CPU时间。删除操作执行太少或时长太短,作用又会和惰性删除一样,出现内存浪费的情况。

3 Redis的实现

采用惰性删除+定期删除。

4 内存淘汰策略

背景:由于Redis采用定期+惰性的过期策略,是无法做到实时删除已过期的键,随着时间推移,服务器的内存将会被占用完。因此我们需要一种策略,当内存满了的时候,怎么腾出内存空间给Redis使用。

Redis提供的内存淘汰策略如下:

  1. noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键(Redis默认使用该策略)

  2. allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键

  3. volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键

  4. allkeys-random:加入键的时候如果过限,从所有key随机删除

  5. volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐

  6. volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键

  7. volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键

  8. allkeys-lfu:从所有键中驱逐使用频率最少的键

解释:LRU是最近最久未使用,LFU是最近最少使用。