Redis.key过期&淘汰策略

一、Redis 内存过期策略

1、过期删除策略的类型

1.1)定时删除

在设置某个 key 的过期时间同时,创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的操作。

优点:定时删除对内存是最友好的,能够保存内存的 key 一旦过期就能立即从内存中删除;

缺点:对 CPU 最不友好,在过期键比较多的时候,删除过期键会占用一部分 CPU 时间,对服务器的响应时间和吞吐量造成影响。


1.2)惰性删除

设置该 key 过期时间后,我们不去管它,当需要该 key 时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该 key。

优点:对 CPU 友好,我们只会在使用该键时才会进行过期检查,对于很多用不到的 key 不用浪费时间进行过期检查;

缺点:对内存不友好,如果一个键已经过期,但是一直没有使用,那么该键就会一直存在内存中,如果数据库中有很多这种使用不到的过期键,这些键便永远不会被删除,内存永远不会释放,从而造成内存泄漏。


1.3)周期删除

每隔一段时间,我们就对一些 key 进行检查,删除里面过期的 key。

优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除,也能有效释放过期键占用的内存。

缺点:难以确定删除操作执行的时长和频率。如果执行的太频繁,定期删除策略变得和定时删除策略一样,对CPU不友好。如果执行的太少,那又和惰性删除一样了,过期键占用的内存不会及时得到释放。另外最重要的是,在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这个键的值,这是业务不能忍受的错误。


2、过期删除策略的使用

通过前面讨论的三种过期删除策略,可以发现单一使用某一策略都不能满足实际需求,所以实际的应用都是组合使用的,

而 Redis 使用的过期删除策略就是:惰性删除和定期删除两种策略的组合。

Redis 的惰性删除策略由 db.c/expireIfNeeded 函数实现,所有键读写命令执行之前都会调用 expireIfNeeded 函数对其进行检查,如果过期,则删除该键,然后执行键不存在的操作;

未过期则不作操作,继续执行原有的命令。

Redis 的定期删除策略由 redis.c/activeExpireCycle 函数实现,函数以一定的频率运行,每次运行时,都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键。

需要注意的是: Redis 的定期删除策略并不是一次运行就检查所有的库、所有的键,而是随机检查一定数量的键。

定期删除函数的运行频率,

在 Redis2.6 版本中,规定每秒运行 10 次,大概 100ms 运行一次。

在 Redis2.8 版本后,可以通过修改配置文件 redis.conf 的 hz 选项来调整这个次数:

hz 10

才这个参数的上面注释可以看出,建议不要将这个值设置超过100,一般使用默认的10,只有当在需要非常低延迟的场景才设置为100。


3、过期删除策略的问题

虽然 Redis 采用了惰性删除和定期删除两种策略,但对于一些永远使用不到的键,并且经过多次定期删除也没有被选定到并删除,那么这些键就会一直驻留在内存中。

所以,这时候就需要使用 Redis 的内存淘汰策略来解决了。


二、Redis 内存淘汰策略

1、设置 Redis 最大内存

在配置文件 redis.conf 中,可以通过参数 maxmemory <bytes> 来设定最大内存:

maxmemory <bytes>

不设定该参数默认是无限制的,但是通常会设定其为物理内存的四分之三。


2、内存淘汰策略

当使用的内存大于 maxmemory 时,由于 Redis 是部署在物理机上的,内存不可能无限扩充的,当内存达到设定的界限后,就会触发 Redis 主动淘汰内存方式:

触发 Redis 内存淘汰策略的具体策略要根据实际业务情况进行选取

共8种策略:

volatile-lru:利用 LRU 算法,移除设置过过期时间的 key (LRU:最近使用 Least Recently Used );

allkeys-lru:利用 LRU 算法,移除任何key (和上一个相比,删除的 key 包括设置过期时间和不设置过期时间的),通常使用该方式;


volatile-lfu:

allkeys-lfu:

lfu的全称是 leastly frequently used,最近最少使用,也就是挑选出最近使用次数最少的key。

使用次数也是通过redisObject中的lru字段记录的。

我们之前说过lru有24位,其中前16位用于记录最近访问时间time,单位是分钟、后8位用于记录访问次数counter。


volatile-random:移除设置过过期时间的随机key ;

allkeys-random:无差别的随机移除;


volatile-ttl:移除即将过期的 key (minor TTL);

noeviction:不移除任何 key,只是返回一个写错误 ,默认选项,一般不会选用。


在 redis.conf 配置文件中,可以设置 maxmemory-policy 来设置内存淘汰方式:

maxmemory-policy noeviction


参考:Redis.key过期&淘汰策略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值