搜尋

首頁  >  問答  >  主體

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

Long expireTime=redisTemplate.boundValueOps(key).getExpire();

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

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

PHP中文网PHP中文网2888 天前392

全部回覆(1)我來回復

  • 迷茫

    迷茫2017-04-17 17:36:12

    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 設計與實現》第一版,裡面有原理解釋,有興趣的可以搜尋看下

    回覆
    0
  • 取消回覆