Redis使用過(guò)程中踩到的坑

  1. 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ù)

  2. redis的管道操作

    Redis管道技術(shù)可以在服務(wù)端未響應(yīng)時(shí),客戶端繼續(xù)向服務(wù)端發(fā)送請(qǐng)求,并最終一次性讀取所有服務(wù)端的響應(yīng)。

    所有在管道內(nèi)拿不到redis操作的值

  3. 使用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ù),并返回匹配給定模式的鍵。

Redis的keys和scan命令.png

scan命令使用的算法可以保證,遍歷從開(kāi)始到結(jié)束期間,一直存在于數(shù)據(jù)庫(kù)里面的鍵肯定會(huì)被遍歷到。但中途被刪除或者中途添加的鍵是否會(huì)被遍歷到則是不確定的。另外,命令可能會(huì)返回同一個(gè)鍵多次。

  1. 對(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);
    }
    
  2. 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);
    }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容