Redis 中 key已经过期了,但为什么内存并没有释放?

redis 2022年12月27日 517

我们在使用Redis时,都是迟永set命令。

set命令常见方式:set key value

其实,我们还可以设置key的有效期,比如:set tian 666 ex 100。

此时,如果我们想修改key的值,但只是单纯地使用set命令,而没有加上过期时间的参数:

set tian 999

那么这个key的过期时间将会被擦除,也就是永久不过期了。

我们可以同命令TTL来查看过期时间:

TTL tian

注意:返回-1表示永久有效。

导致这个问题的原因在于,set命令如果不设置过期时间,那么Redis会自动擦除这个key的过期时间的。

如果我们发现Redis的内存持续增长,而且很多key原理设置了过期时间的,后来发现过期时间丢了,很可能就是因为这个原因导致的。

这时候我们的Redis中就会存在大量不过期的key了,慢慢的消耗内存资料。

所以,我们在使用set命令时,如果刚开始设置了过期时间,那么,之后再修改这个key的时候,请务必一定加上过期时间的参数,避免过期时间丢失问题。

还有一种情况,key过期了导致内存没释放,那就是Redis处理过期key的策略。

Redis对于过期key的处理策略有两种:

惰性删除
定时删除
惰性删除:当读或写一个已经过期的key时候,会触发惰性删除策略,判断key是否已经过期,如果过期了直接删除掉这个key。

定时删除:由于惰性删除策略无法保证冷数据(很久没有用的数据)被及时删除,所以,Redis会定期(默认100毫秒)主动淘汰一批已经过期的key,这里的一批只是部分过期key,所以,可能会出现key已经过期了,但是还没有被清理掉的情况,从而导致内存并没有被释放。


关注微信公众号『PHP学习网

第一时间了解最新网络动态
关注博主不迷路~

PHP学习网:站内收集的部分资源来源于网络,若侵犯了您的合法权益,请联系我们删除!
分享到:
赞(0)

文章评论

您需要之后才可以评论

PHP学习网

PHP学习网