有趣的Redis:数据明明都过期了,为啥还占着内存?

在这里插入图片描述

介绍

我们可以给Redis中的key设置过期时间,那么当key过期了,它在什么时候会被删除呢?

如果让我们写Redis过期策略,我们会想到如下三种方案

  1. 定时删除,在设置键的过期时间的同时,创建一个定时器。当键的过期时间来临时,立即执行对键的删除操作
  2. 惰性删除,每次获取键的时候,判断键是否过期,如果过期的话,就删除该键,如果没有过期,则返回该键
  3. 定期删除,每隔一段时间,对键进行一次检查,删除里面的过期键

定时删除策略对CPU不友好,当过期键比较多的时候,Redis线程用来删除过期键,会影响正常请求的响应

惰性删除读CPU是比较有好的,但是会浪费大量的内存。如果一个key设置过期时间放到内存中,但是没有被访问到,那么它会一直存在内存中

定期删除策略则对CPU和内存都比较友好

Redis中key的过期策略

redis过期key的删除策略选择了如下两种

  1. 惰性删除
  2. 定期删除

惰性删除

客户端在访问key的时候,对key的过期时间进行校验,如果过期了就立即删除

定期删除

Redis会将设置了过期时间的key放在一个独立的字典中,定时遍历这个字典来删除过期的key,遍历策略如下

  1. 每秒进行10次过期扫描,每次从过期字典中随机选出20个key
  2. 删除20个key中已经过期的key
  3. 如果过期key的比例超过1/4,则进行步骤一
  4. 每次扫描时间的上限默认不超过25ms,避免线程卡死

因为Redis中过期的key是由主线程删除的,为了不阻塞用户的请求,所以删除过期key的时候是少量多次。源码可以参考expire.c中的activeExpireCycle方法

所以我们在项目中要设置key的过期时间为一个随机范围,不能都在同一时间过期,不然频繁的扫描过期字典会造成客户端的请求出现卡顿

扫描二维码关注公众号,回复: 12271768 查看本文章

同时也就明白,数据数据明明都过期了,但是还占用着内存

参考博客

《Redis深度历险》老钱

猜你喜欢

转载自blog.csdn.net/zzti_erlie/article/details/112139064
今日推荐