Redis过期key的删除策略
使用redis desktop manager操作redis,当键值对过期后,再使用get命令获取时,键值对已经不存在了,当时产生疑虑,是redis自动删除了吗?如果是的话是过期立马就删除吗?
之前用Shiro+SSM写过一个项目,shiro中的session是保存在内存中的,shiro可以配置类似定时任务来检查session是否过期并进行删除;后来为解决负载均衡下重复登录的问题将session保存在了redis中,redis会将过期后的session删除,那么这两者又有什么不同呢?
1.shiro中的session过期删除机制(之前有博客介绍过,此处主要说下session的删除)
shiro中默认是要删除过期的session的,如下
session删除有两种情况
(1)点击退出登录,触发删除session
删除时判断了默认为true的boolean变量
(2)session过期后的删除,这种模式下过期的session是不会自动删除的,通过session定时检测器,拿到所有的session,遍历每一个session,通过比较session的上一次操作的时间和当前时间的差值是否大于session的
有效期,如果大,则过期,调用删除方法
2.redis过期key的删除策略
(1)立即删除:在设置key的过期时间时,创建一个回调函数,当过期时间到达时,由时间处理器自动执行key的删除操作,立即删除可以保证数据的最大新鲜度,可以立即释放内存空间,但是立即删除短时间内会占用大量CPU,对CPU是最不友好的
(2)惰性删除: key过期了就过期了,不管,当读/写key时,检查key的过期时间,如果已经过期了,再删除,这样过期的key会造成内存的大量浪费
(3)定时删除:每隔一段时间对expires字典(设置了过期时间的key的集合)进行检查,删除里面过期的key,并限制删除操作的时长(25ms)和频率,来进一步减少删除操作对CPU的影响
定时删除对于以上两种策略是个折中的办法,
定时删除相关配置:hz 10 每秒执行10次后台任务,这些任务包括:
随机抽取100个设置了过期时间的key,检测是否过期(不是全部检查,防止卡死)
删除所有发现的过期的Key
若删除的key超过25个(检查数量的25%),则重复步骤1
redis会在hz的频率下(每秒执行N次后台任务,在一定时间限制内(25ms)尽可能多的删除过期的key)
redis目前使用的过期key删除策略是: 惰性删除加上定期删除,两者配合使用(注意不是立即删除,感觉上是,但实际并不是)