为了账号安全,请及时绑定邮箱和手机立即绑定

spring data redis 超时设置无效的问题

spring data redis 超时设置无效的问题

神不在的星期二 2019-03-12 13:15:38
Long expireTime=redisTemplate.boundValueOps(key).getExpire();        int countNow = Integer.valueOf(redisTemplate.boundValueOps(key).get());获取超时时间expiretime 为0但是我他妈的居然能拿到key对应的值,是不是redis存磁盘了,还是redis删除数据的机制原因?测试的能行,生产环境就不行了!!
查看完整描述

1 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

redis服务器,集群设置,主从,从的没有数据,原因未知。用虚拟的一台,作数据漂移到主redis服务器,set进去的key在主服务器不可见,虚拟的一台也看不打,但是能取到,从的redis服务没有数据。关键是能通过method获取到expiretime为零,但是能取到key对应的值。现在乜有其他redis服务器了,数据存去哪了,为什么expire为零,还是能获取key对应的值???
最后关掉了从的redis,重启主服务器,把IP指向主redis服务器之后,问题解决。
原因不明。
数据飘去哪了?

补充:
如果你设置了一个有过期时间的key-value的不稳定key,那么请注意!如果用了setexpiretime为0的方法去删除key的方式,有可能redis不会立即删除。
用spring data redis 的hasKey的方法来判断是否存在键,然后你就掉坑里了,因为即使expiretime为0,这个key,很可能还没有被删除掉,
redis对过期键采用了lazy expiration:在访问key的时候判定key是否过期,如果过期,则进行过期处理。其次,每秒对volatile keys 进行抽样测试,如果有过期键,那么对所有过期key进行处理。
这个巡视速度,跟什么设置有关,效率怎么样,我们一无所知。所以,当你设置了不稳定的key,而且又要用hasKey,做判断时,请注意,要获取key的过期时间expiretime,自己再做判断。

《Redis 设计与实现》第一版,里面有原理解释,感兴趣的可以搜索看下


查看完整回答
反对 回复 2019-04-17
  • 1 回答
  • 0 关注
  • 688 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信