使用spring data redis已經很長一段時間了,在項目使用過程當中仍是犯了一些常見的錯誤,如今總結一下,避免本身之後再犯相同的錯誤。java
之前在項目中主要使用的expire()這個設置key超時時間的方法,在最近的項目中,想讓某個key在某個時間點過時,好比按照日的排行榜,在次日排行榜就沒有意思,能夠設置當日的key在次日的零點過時。mysql
在使用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); }
public void expireAt(String key, Date deadLine){ final byte[] rawKey = rawKey(key); redisTemplate.execute(connection -> connection.expireAt(rawKey, deadLine.getTime() / 1000), true); }
在使用reverseRange(long start, long end)過程當中,在項目中當成mysql的分頁處理,把返回數據大小直接賦值給end,致使返回的數據一直有問題。 用方法返回數據,包括start和end位置的數據,通常傳入第二個參數爲pageStart + pageSize -1redis
在使用Hash,Zset等數據類型時,沒有先檢查一下緩存的key存在與否,而是直接使用,致使程序異常,報出空指針。spring