Redis 的 内存回收策略

Redis 内存回收策略

定时删除

在设置键的过期时间时,创建一个定时事件,当过期时间到达时,由事件处理器自动执行键的删除操作。

优点:对内存是最友好的:因为它保证过期键会在第一时间被删除,过期键所消耗的内存会立即被释放。

缺点:它对CPU 时间是最不友好的:因为删除操作可能会占用大量的CPU 时间

惰性删除

放任键过期不管,但是在键被访问时要检查键是否过期,如果过期的话就删除它并返回空;如果没过期就返回键值

优点:对CPU 时间来说是最友好的:它只会在键被访问时检查,如果过期就进行删除

缺点:它对内存是最不友好的:如果一个键已经过期但却没有被访问,它占用的内存就不会被释放

定期删除

每隔一段时间,对expires 字典进行检查,删除里面的过期键。

定期删除是上面两种策略的一种折中:

  • 它每隔一段时间执行一次删除操作,并通过限制删除操作执行的时长和频率,籍此来减
    少删除操作对CPU 时间的影响。
  • 另一方面,通过定期删除过期键,它有效地减少了因惰性删除而带来的内存浪费。

删除策略采用的是惰性删除 + 定期删除,这两个策略相互配合,可以很好的合理利用CPU 时间和节约内存空间之间取得平衡

原理

  • 消极方法(惰性删除):过期就删除:在主键被访问的时候,如果发现他已经失效,那么就删除它。
  • 积极方法(定期删除):周期性的从设置过期时间的key中选择一部分失效的key进行删除,对于那些未被查询的key,即便过期,被动方式也无法清除。因此redis 会周期性的随机测试一些key,已过期的key将会被删除。redis每秒会进行10次操作。
    • 随机测试20个带有timeout信息的key
    • 如果随机测试获得的20个key超过25%的key被删除,则重复执行整个流程

淘汰策略

通过设置 maxmemory-policy 来修改最大内存淘汰策略, 默认是 noeviction .

动态修改配置

127.0.0.1:6379> config set maxmemory-policy volatile-lru
  • volatile-lru : 只有设置了 ttl 的 进行 lru (最近最久未使用)
  • allkeys-lru : 所有的key 都进行 lru(最近最久未使用)
  • volatile-lfu :只有设置了 ttl 的 进行(最不常用的)
  • allkeys-lru : 所有的key 都进行 (最不常用的)
  • volatile-random : 只有设置了 ttl 的 进行 (随机)
  • allkeys-random : 所有的key 都进行 (随机))
  • volatile-ttl : 将设置了ttl 且马上要过期的删除
  • noeviction : 不做淘汰,所有申请内存的命令都会报错

过期键对AOF 、RDB 和复制的影响

针对 Redis 的持久化 AOF 和 RDB 两种方式的分析,请参考 Redis 持久化分析 文章

更新后的 RDB 文件

在创建新的RDB 文件时,程序会对键进行检查,过期的键不会被写入到更新后的RDB 文件中。因此,过期键对更新后的RDB 文件没有影响。

更新后的 AOF 文件

在键已经过期,但是还没有被惰性删除或者定期删除之前,这个键不会产生任何影响,AOF 文件也不会因为这个键而被修改。

当过期键被惰性删除或者定期删除之后,程序会向AOF 文件追加一条DEL 命令,来显式地记录该键已被删除。

例如:存在message 键已经过期,get message 时,发现过期了

  1. 从数据库中删除message ;
  2. 追加一条DEL message 命令到AOF 文件;
  3. 向客户端返回NIL 。

AOF 重写

和RDB 文件类似,当进行AOF 重写时,程序会对键进行检查,过期的键不会被保存到重写后的AOF 文件。因此,过期键对重写后的AOF 文件没有影响。

数据复制

当服务器带有附属节点时,过期键的删除由主节点统一控制:

  • 如果服务器是主节点,那么它在删除一个过期键之后,会显式地向所有附属节点发送一个DEL 命令。
  • 如果服务器是附属节点,在执行客户端发送的读命令时,即使碰到过期键也不会将过期键删除,而是继续像处理未过期的键一样来处理过期键;当接到从主节点发来的DEL 命令之后,附属节点才会真正的将过期键删除掉。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值