-
redis(WRONGTYPE Operation against a key holding the wrong kind of value)
前提是: key-list類型的數(shù)據(jù),存為了key-value形式
則使用rightPop取出列表數(shù)據(jù)時會報錯
改為使用key-list存數(shù)據(jù),依然會報錯
解決方法: 刪除之前存錯格式的數(shù)據(jù)
-
redis的管道操作
Redis管道技術(shù)可以在服務(wù)端未響應(yīng)時,客戶端繼續(xù)向服務(wù)端發(fā)送請求,并最終一次性讀取所有服務(wù)端的響應(yīng)。
所有在管道內(nèi)拿不到redis操作的值
-
使用scan代替keys (scan命令不能在管道中使用)
因為keys命令會一次性地遍歷整個數(shù)據(jù)庫來獲取所有與給定模式相匹配的鍵,所以隨著數(shù)據(jù)庫包含的鍵值對越來越多,執(zhí)行速度也會越來越慢
scan命令以漸進(jìn)的方式,分多次遍歷整個數(shù)據(jù)庫,并返回匹配給定模式的鍵。
scan命令使用的算法可以保證,遍歷從開始到結(jié)束期間,一直存在于數(shù)據(jù)庫里面的鍵肯定會被遍歷到。但中途被刪除或者中途添加的鍵是否會被遍歷到則是不確定的。另外,命令可能會返回同一個鍵多次。
-
對一個已經(jīng)帶有過期時間的key執(zhí)行
EXPIRE
命令,新指定的過期時間會取代舊的過期時間
如果不希望在每次更新值的時候更新過期時間,可以在執(zhí)行expire
命令之前通過TTL
命令來判斷對應(yīng)key是否已經(jīng)設(shè)置了過期時間或是否過期。TTL
命令返回給定key的剩余生存時間(秒),key不存在返回-2,key存在但沒有設(shè)置過期時間返回-1//RedisTemplate的getExpire內(nèi)部封裝的就是TTL命令 if (routerRedisTemplate.getExpire(key) < 0) { //設(shè)置100s的過期時間 routerRedisTemplate.expire(key, 100, TimeUnit.SECONDS); }
-
SET命令:如果key已經(jīng)持有其他值,set會覆寫舊值,無視類型。
如果不希望string類型覆蓋其他類型的RedisKey,可以在set之前通過TYPE
命令判斷key的類型if (routerRedisTemplate.hasKey(key) && Objects.equals(DataType.STRING,routerRedisTemplate.type(key))) { addRedisStringKey(key, value, expireTime); }