数据库面试题——redis中key过期了但内存没有释放

在使用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的处理一般有惰性删除和定时删除两种策略

  1. 惰性删除:当读/写一个已经过期的key时,会触发惰性删除策略,判断key是否过期,如果过期了直接删除掉这个key
  2. 定时删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期(默认每100ms)主动淘汰一批已过期的key,这里的一批只是部分过期key,为什么只删除一部分呢?想一想假如 redis 存了几十万个 key ,每隔100ms就遍历所有的设置过期时间的 key 的话,就会给 CPU 带来很大的负载,所以可能会出现部分key已经过期但还没有被清理掉的情况,导致内存并没有被释放

如果有兴趣了解更多相关内容,欢迎来我的个人网站看看:瞳孔的个人空间

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值