1. 程式人生 > >spring data redis 專案使用問題彙總

spring data redis 專案使用問題彙總

使用spring data redis已經很長一段時間了,在專案使用過程中還是犯了一些常見的錯誤,現在總結一下,避免自己以後再犯相同的錯誤。

1. expireAt() 設定超時時間錯誤

以前在專案中主要使用的expire()這個設定key超時時間的方法,在最近的專案中,想讓某個key在某個時間點過期,比如按照日的排行榜,在第二天排行榜就沒有意思,可以設定當日的key在第二天的零點過期。

1.1 問題描述

在使用expireAt()中,發覺設定過期時間之後,過期時間是一個特別大的時間,感覺不太對,就用命令列試了一下,發現沒有問題,懷疑可能是spring data redis框架的問題,順著看了一下程式碼,應為使用的是redis cluster叢集模式,在BinaryJedisCluster.java的pexpireAt居然使用的是pexpire()方法,應該用pexpireAt()才對
  @Override
  public Long pexpireAt(final byte[] key, final long millisecondsTimestamp) {
    return new JedisClusterCommand<Long>(connectionHandler, maxAttempts) {
      @Override
      public Long execute(Jedis connection) {
        return connection.pexpire(key, millisecondsTimestamp);
      }
    }.runBinary(key);
  }

1.2 解決辦法

    public void expireAt(String key, Date deadLine){
        final byte[] rawKey = rawKey(key);
        redisTemplate.execute(connection -> connection.expireAt(rawKey, deadLine.getTime() / 1000), true);  
    }

2. zset的reverseRange問題

在使用reverseRange(long start, long end)過程中,在專案中當成mysql的分頁處理,把返回資料大小直接賦值給end,導致返回的資料一直有問題。
用方法返回資料,包括start和end位置的資料,一般傳入第二個引數為pageStart + pageSize -1

3.校驗key是否存在

在使用Hash,Zset等資料型別時,沒有先檢查一下快取的key存在與否,而是直接使用,導致程式異常,報出空指標。