我们在使用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已经过期了,但是还没有被清理掉的情况,从而导致内存并没有被释放。