在使用Redis时,肯定经常使用SET命令,SET除了可以设置key-value之外,还可以设置key的过期时间,此时如果想修改key的值,但只是单纯地使用SET命令,而没有加上过期时间的参数,那这个key 的过期时间将会被擦除,就像下面这样
ubuntu_docker:0>SET hello world EX 100
"OK"
ubuntu_docker:0>TTL hello
"90"
ubuntu_docker:0>TTL hello
"85"
ubuntu_docker:0>SET hello world2
"OK"
ubuntu_docker:0>TTL hello
"-1"
ubuntu_docker:0>
如果发现Redis的内存持续增长,而且很多key原来设置了过期时间,后来发现过期时间丢失了,很有可能是因为这个原因导致的。这时 Redis 中就会存在大量不过期的key,消耗过多的内存资源。所以,在使用SET命令时,如果刚开始就设置了过期时间,那么之后修改这个key,也务必要加上过期时间的参数,避免过期时间丢失问题
Redis对于过期key的处理一般有惰性删除和定时删除两种策略
- 惰性删除:当读/写一个已经过期的key时,会触发惰性删除策略,判断key是否过期,如果过期了直接删除掉这个key
- 定时删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期(默认每100ms)主动淘汰一批已过期的key,这里的一批只是部分过期key,为什么只删除一部分呢?想一想假如 redis 存了几十万个 key ,每隔100ms就遍历所有的设置过期时间的 key 的话,就会给 CPU 带来很大的负载,所以可能会出现部分key已经过期但还没有被清理掉的情况,导致内存并没有被释放
如果有兴趣了解更多相关内容,欢迎来我的个人网站看看:瞳孔的个人空间