使用spring data redis已經(jīng)很長一段時間了刨仑,在項目使用過程中還是犯了一些常見的錯誤郑诺,現(xiàn)在總結(jié)一下,避免自己以后再犯相同的錯誤杉武。
1. expireAt() 設(shè)置超時時間錯誤
以前在項目中主要使用的expire()這個設(shè)置key超時時間的方法辙诞,在最近的項目中,想讓某個key在某個時間點過期轻抱,比如按照日的排行榜飞涂,在第二天排行榜就沒有意思,可以設(shè)置當(dāng)日的key在第二天的零點過期祈搜。
1.1 問題描述
在使用expireAt()中较店,發(fā)覺設(shè)置過期時間之后,過期時間是一個特別大的時間容燕,感覺不太對梁呈,就用命令行試了一下,發(fā)現(xiàn)沒有問題蘸秘,懷疑可能是spring data redis框架的問題官卡,順著看了一下代碼,應(yīng)為使用的是redis cluster集群模式醋虏,在BinaryJedisCluster.java的pexpireAt居然使用的是pexpire()方法寻咒,應(yīng)該用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)過程中,在項目中當(dāng)成mysql的分頁處理颈嚼,把返回數(shù)據(jù)大小直接賦值給end毛秘,導(dǎo)致返回的數(shù)據(jù)一直有問題。
用方法返回數(shù)據(jù)阻课,包括start和end位置的數(shù)據(jù)叫挟,一般傳入第二個參數(shù)為pageStart + pageSize -1
3.校驗key是否存在
在使用Hash,Zset等數(shù)據(jù)類型時,沒有先檢查一下緩存的key存在與否柑肴,而是直接使用霞揉,導(dǎo)致程序異常,報出空指針晰骑。