Redis过期策略和内存淘汰机制

前言

通过EXPIRE key seconds 命令来设置 数据的过期时间。返回1表明设置成功,返回0表明key不存在或者不能成功设置过期时间。在key上设置了过期时间后key将在指定的秒数后被自动删除。被指定了过期时间的key在Redis中被称为是不稳定的。

虽然给key设置了过期时间,但是有些操作会导致过期时间被清除。具体有哪些操作给一个传送门:Redis键过期命令使用注意事项

键过期删除策略

Redis key 过期删除的策略有三种:

  • 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key。
  • 主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key。
  • 当前已用内存超过 maxmemory 限定时,触发主动清理策略。

被动删除(惰性删除)
只有key被操作时(如get),Redis才会被动检查该key是否过期,如果过期则删除并且返回NIL。
1、这种删除策略对CPU是友好的,删除操作只有在不得不的情况下才会进行,不会在其他expire key上浪费无畏的CPU时间
2、但是这种策略对内存不友好,一个key已经过期,但是在它被操作之前不会被删除,仍然占据内存空间。如果有大量的过期键存在但是又很少被访问到,那会造成大量的内存空间浪费。

只有被动删除是不够的,因为可能存在一些key永远不会被访问到,这些设置了过期时间的key也是需要在过期后被删除的,我们甚至可以将这种情况看做是一种内存泄露。(无用的垃圾数据占用了大量的内存,而服务器却不会自己去释放它们,对于运行状态的Redis非常依赖于内存,所以出现了主动删除来解决问题)

主动删除(定时删除)
主动删除也叫定时删除,指的是Redis定期触发的清理策略。
在Redis 2.6版本中,程序规定 serverCron 每秒运行10次,平均每100毫秒运行一次。从Redis 2.8开始,用户可以通过修改 hz 选项来调整 serverCron 的每秒执行次数。(具体看redis.conf 配置文件中关于 hz 参数设置的说明)

serverCron 是由Redis的事件框架驱动的定位任务,这个定时任务会调用activeExpireCycle 函数,针对每个 db 在限制的时间 REDIS_EXPIRELOOKUPS_TIME_LIMIT内尽可能多的删除过期key,之所以要限制时间是为了防止过长时间的阻塞影响redis的正常运行。主动删除策略弥补了被动删除策略在内存上的不友好。

hz 调大将会提高Redis主动淘汰的频率,如果Redis存储中包含很多冷数据占用内存过大的话,可以考虑将这个值调大,但Redis作者建议这个值不要超过100.

其中timelimit 和 server.hz是一个倒数的关系,hz 配置的越大,timelimit 就越小。即每秒钟期望的主动淘汰频率越高,则每次淘汰最长占用时间就越短。

当Redis运行在主从模式时,只有主结点才会执行上述两种键过期删除策略,然后把删除操作“del key ”同步到从结点。

内存淘汰机制

当前已用内存超过 maxmemory 限定时,触发主动清理策略
1、noeviction:默认策略,永不过期。当mem_used 内存已经超过 maxmemory 的设定,添加报错。对于所有的读写请求,都会触发redis.c/freeMemoryIfNeeded(void)函数来清理超出的内存。
注意:这个清理过程是阻塞的,直到清理出足够的内存空间。所以如果在达到 maxmemory 并且调用方还在不断写入的情况下,可能会触发主动清理策略,导致请求会有一定的延迟。
2、volatile-ttl:在设置了过期时间的所有键中,抛弃存活时间最短的数据。
3、allkeys-random:在所有键中,随机抛弃。
4、volatile-random:在设置了过期时间的所有键中,随机抛弃。
5、allkeys-lru:在所有键中,选取最近最少使用的数据抛弃。
6、volatile-lru:在设置了过期时间的键中,选取最近最少使用的数据抛弃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值