开发者社区> 问答> 正文

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

Long expireTime=redisTemplate.boundValueOps(key).getExpire();
        int countNow = Integer.valueOf(redisTemplate.boundValueOps(key).get());

获取超时时间expiretime 为0
但是我他妈的居然能拿到key对应的值,是不是redis存磁盘了,还是redis删除数据的机制原因?测试的能行,生产环境就不行了!!

展开
收起
爵霸 2016-03-09 09:06:52 4730 0
1 条回答
写回答
取消 提交回答
  • 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-07-17 18:55:17
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Redis在唯品会的应用实践——架构演进与功能定制 立即下载
微博的Redis定制之路 立即下载
云数据库Redis版的开源之路 立即下载