Redis 过期删除策略和内存淘汰策略

Redis 过期删除策略和内存淘汰策略

过期删除策略

Redis 是可以对 key 设置过期时间的,过期键值删除策略 就是将已过期的键值对删除的机制。

给key设置设置过期时间

  • expire : 设置 key 在 n 秒后过期。
  • set ex :设置键值对的时候,同时指定过期时间

可以通过 ttl ,查看key的过期时间;也可以使用 persist 取消key的过期时间,这个key就会永久存在。

如何判定 key 已过期了

Redis中有一个过期字典,保存所有key的过期时间。

字典实际上是哈希表,当redis查询某个key的时候,会先检查该key是否存在字典表中。如果不在,就正常读取值;否则就获取该key的过期时间跟系统比较有无过期。

流程图如下:

Redis 过期删除策略和内存淘汰策略_第1张图片

过期删除策略有哪些

  • 定时删除:在设置 key 的过期时间时,同时创建一个定时事件,当时间到达时,由事件处理器自动执行 key 的删除操作。
    • 优点:可以尽快释放内存。
    • 缺点:会占用更多的CPU时间去监控删除过期的key。
  • 惰性删除:不主动删除过期键,每次从数据库访问 key 时,都检测 key 是否过期,如果过期则删除该 key。
    • 优点:占用较少CPU时间
    • 缺点:如果过期的key一直没有被访问就会造成内存浪费
  • 定期删除:每隔一段时间「随机」从数据库中取出一定数量的 key 进行检查,并删除其中的过期key。
    • 优点:通过限制删除操作执行的时长和频率,来减少删除操作对 CPU 的影响,同时也能删除一部分过期的数据减少了过期键对空间的无效占用 。
    • 缺点:难以确定删除操作执行的时长和频率。

Redis 的过期删除策略

Redis 选择惰性删除+定期删除这两种策略配和使用, 以求在合理使用 CPU 时间和避免内存浪费之间取得平衡。

Redis 在访问或者修改 key 之前,都会调用 expireIfNeeded 函数对其进行检查,检查 key 是否过期:

  • 如果过期,则删除该 key,至于选择异步删除,还是选择同步删除,根据 lazyfree_lazy_expire 参数配置决定,然后返回 null 客户端;
  • 如果没有过期,不做任何处理,然后返回正常的键值对给客户端;

在 Redis 中,默认每秒进行 10 次过期检查一次数据库,此配置可通过 Redis 的配置文件 redis.conf 进行配置,配置键为 hz 它的默认值是 hz 10。 每轮抽查时,会随机选择 20 个 key 判断是否过期。

内存淘汰策略

当 Redis 的运行内存已经超过 Redis 设置的最大内存之后,则会使用内存淘汰策略删除符合条件的 key。

在配置文件 redis.conf 中,可以通过参数 maxmemory 来设定最大运行内存,只有在 Redis 的运行内存达到了我们设置的最大运行内存,才会触发内存淘汰策略

Redis 内存淘汰策略

  • 不进行数据淘汰的策略 :不淘汰任何数据,当运行内存超过最大设置内存时,禁止写入数据,可以查询和删除。
  • volatile-random:随机淘汰设置了过期时间的任意键值。
  • volatile-ttl :优先淘汰更早过期的键值。
  • volatile-lru :淘汰所有设置了过期时间的键值中,最久未使用的键值 。
  • volatile-lfu(Redis 4.0 后新增的内存淘汰策略 ):淘汰所有设置了过期时间的键值中,最少使用的键值。
  • allkeys-random :随机淘汰任意键值。
  • allkeys-lru :淘汰整个键值中最久未使用的键值。
  • allkeys-lfu:淘汰整个键值中最少使用的键值。

可以通过 config get maxmemory-policy 命令查看当前 Redis 的内存淘汰策略。

修改Redis 内存淘汰策略

  1. 通过config set maxmemory-policy <策略>命令设置。它的优点是设置之后立即生效,不需要重启 Redis 服务,缺点是重启 Redis 之后,设置就会失效。

  2. 通过修改 Redis 配置文件修改,设置maxmemory-policy <策略>,它的优点是重启 Redis 服务后配置不会丢失,缺点是必须重启 Redis 服务,设置才能生效。

你可能感兴趣的:(redis)