spring data redis 項目使用問題彙總

使用spring data redis已經很長一段時間了,在項目使用過程當中仍是犯了一些常見的錯誤,如今總結一下,避免本身之後再犯相同的錯誤。java

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

之前在項目中主要使用的expire()這個設置key超時時間的方法,在最近的項目中,想讓某個key在某個時間點過時,好比按照日的排行榜,在次日排行榜就沒有意思,能夠設置當日的key在次日的零點過時。mysql

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 -1redis

3.校驗key是否存在

在使用Hash,Zset等數據類型時,沒有先檢查一下緩存的key存在與否,而是直接使用,致使程序異常,報出空指針。spring

相關文章
相關標籤/搜索