-
redis(WRONGTYPE Operation against a key holding the wrong kind of value)
前提是: key-list類型的數(shù)據(jù),存為了key-value形式
則使用rightPop取出列表數(shù)據(jù)時(shí)會(huì)報(bào)錯(cuò)
改為使用key-list存數(shù)據(jù),依然會(huì)報(bào)錯(cuò)
解決方法: 刪除之前存錯(cuò)格式的數(shù)據(jù)
-
redis的管道操作
Redis管道技術(shù)可以在服務(wù)端未響應(yīng)時(shí),客戶端繼續(xù)向服務(wù)端發(fā)送請(qǐng)求,并最終一次性讀取所有服務(wù)端的響應(yīng)。
所有在管道內(nèi)拿不到redis操作的值
-
使用scan代替keys (scan命令不能在管道中使用)
因?yàn)閗eys命令會(huì)一次性地遍歷整個(gè)數(shù)據(jù)庫(kù)來(lái)獲取所有與給定模式相匹配的鍵,所以隨著數(shù)據(jù)庫(kù)包含的鍵值對(duì)越來(lái)越多,執(zhí)行速度也會(huì)越來(lái)越慢
scan命令以漸進(jìn)的方式,分多次遍歷整個(gè)數(shù)據(jù)庫(kù),并返回匹配給定模式的鍵。

scan命令使用的算法可以保證,遍歷從開(kāi)始到結(jié)束期間,一直存在于數(shù)據(jù)庫(kù)里面的鍵肯定會(huì)被遍歷到。但中途被刪除或者中途添加的鍵是否會(huì)被遍歷到則是不確定的。另外,命令可能會(huì)返回同一個(gè)鍵多次。
-
對(duì)一個(gè)已經(jīng)帶有過(guò)期時(shí)間的key執(zhí)行
EXPIRE命令,新指定的過(guò)期時(shí)間會(huì)取代舊的過(guò)期時(shí)間
如果不希望在每次更新值的時(shí)候更新過(guò)期時(shí)間,可以在執(zhí)行expire命令之前通過(guò)TTL命令來(lái)判斷對(duì)應(yīng)key是否已經(jīng)設(shè)置了過(guò)期時(shí)間或是否過(guò)期。TTL命令返回給定key的剩余生存時(shí)間(秒),key不存在返回-2,key存在但沒(méi)有設(shè)置過(guò)期時(shí)間返回-1//RedisTemplate的getExpire內(nèi)部封裝的就是TTL命令 if (routerRedisTemplate.getExpire(key) < 0) { //設(shè)置100s的過(guò)期時(shí)間 routerRedisTemplate.expire(key, 100, TimeUnit.SECONDS); } -
SET命令:如果key已經(jīng)持有其他值,set會(huì)覆寫舊值,無(wú)視類型。
如果不希望string類型覆蓋其他類型的RedisKey,可以在set之前通過(guò)TYPE命令判斷key的類型if (routerRedisTemplate.hasKey(key) && Objects.equals(DataType.STRING,routerRedisTemplate.type(key))) { addRedisStringKey(key, value, expireTime); }