redis的常見(jiàn)用法和問(wèn)題之緩存擊穿、緩存穿透、緩存雪崩詳解
本文為總結(jié)用于復(fù)習(xí)和查詢(xún)
包含redis的常用操作和緩存相關(guān)問(wèn)題
Redis定義
Redis存儲(chǔ)的是key-value結(jié)構(gòu)的數(shù)據(jù),key生成字符串類(lèi)型。
Redis的value的常用數(shù)據(jù)類(lèi)型
字符串string

哈希hash:類(lèi)似于java中的HashMap結(jié)構(gòu)

列表list:按照插入順序排序,可以有重復(fù)元素,類(lèi)似java中的LinkedList

集合set:無(wú)序集合,沒(méi)有重復(fù)元素,類(lèi)似java中的HashSet

有序集合sorted set / zset:集合中每個(gè)元素關(guān)聯(lián)一個(gè)score,根據(jù)score升序排列,沒(méi)有重復(fù)元素。

Redis常用命令
通用命令
- keys pattern 查找所有符合給定模式pattern的key
- exists key 檢查給定的key是否存在(返回1表示鍵存在,返回0表示鍵不存在)
- type key 返回指定key所存儲(chǔ)的值的類(lèi)型
- del key 用于在key存在是刪除key
字符串操作命令
- set key value 設(shè)置指定key的值為value
- get key 獲取指定key的值
- setex key seconds value 設(shè)置指定key的值,并將key的過(guò)期時(shí)間設(shè)置為seconds秒
- setnx key value 只有在key不存在時(shí)設(shè)置key的值
哈希操作命令
- hset key field value 將哈希表key中的字段field設(shè)為value
- hget key field 獲取存儲(chǔ)在哈希表key中的field字段的值
- hdel key field 刪除存儲(chǔ)在哈希表中的指定字段
- hkeys key 獲取哈希表key中的所有字段
- hvals key 獲取哈希表key中所有值
列表操作命令
- lpush/rpush key value1 [value2] 將一個(gè)或多個(gè)值插入到列表的頭部/尾部
- lpop/rpop key 移除并獲取列表頭部/尾部元素
- lrange key start stop 獲取列表指定范圍內(nèi)的元素
- start:區(qū)間起始位置(從 0 開(kāi)始計(jì)數(shù))。支持負(fù)數(shù),表示從列表末尾倒數(shù)(例如 -1 表示最后一個(gè)元素)。
- stop:區(qū)間結(jié)束位置(包含在內(nèi))。同樣支持負(fù)數(shù)。
- lrange mylist 0 -1 返回所有元素,等同于
- llen key 獲取列表的長(zhǎng)度
- lindex key index 用于獲取列表key中指定索引位置index的元素
- lrem key count value 用于從列表key中移除元素的命令。該命令根據(jù)指定的值和數(shù)量,從列表的頭部或尾部開(kāi)始移除匹配的元素。
count:移除元素的數(shù)量,具體含義如下:
- count > 0:從列表頭部開(kāi)始,移除最多count個(gè)與value相等的元素。
- count < 0:從列表尾部開(kāi)始,移除最多count的絕對(duì)值個(gè)與value相等的元素。
- count = 0:移除列表中所有與value相等的元素。
value:要移除的元素值。
集合操作命令
- sadd key member1 [member2] 向集合key添加一個(gè)或多個(gè)成員
- smembers key 獲取集合key中的所有成員
- scard key 獲取集合key中的成員的數(shù)量
- sinter key1 [key2] 返回給定所有集合的交集
- sunion key1 [key2] 返回給定所有集合的并集
- srem key member1 [member2] 刪除集合key中的一個(gè)或多個(gè)成員
有序集合操作命令
- zadd key score 1 member1 [score2 member2] 向有序集合添加一個(gè)或多個(gè)成員
- zrange key start stop [withscores] 返回指定區(qū)間的成員,加上withscores顯示成員對(duì)應(yīng)的score
- zincrby key increment member 給有序集合key中指定成員的分?jǐn)?shù)加increment
- zrem key member1 [member2…] 移除有序集合中的一個(gè)或多個(gè)成員
緩存穿透問(wèn)題解決方案
什么是緩存穿透:指客戶(hù)端請(qǐng)求的數(shù)據(jù)在緩存redis中和數(shù)據(jù)庫(kù)中都不存在,導(dǎo)致大量請(qǐng)求到數(shù)據(jù)庫(kù),從而導(dǎo)致數(shù)據(jù)庫(kù)壓力驟增
解決方案
緩存空對(duì)象:對(duì)數(shù)據(jù)庫(kù)查詢(xún)結(jié)果為空的請(qǐng)求,返回空值,并緩存null到redis且設(shè)置ttl,即key:null
需設(shè)置好ttl,避免長(zhǎng)期占用內(nèi)存
布隆過(guò)濾器:在緩存之前加一層布隆過(guò)濾器,預(yù)先將數(shù)據(jù)庫(kù)中所有存在的 key 加載到布隆過(guò)濾器中。
什么是布隆過(guò)濾器過(guò)濾器:布隆過(guò)濾器是一種空間效率極高的概率型數(shù)據(jù)結(jié)構(gòu),用于判斷一個(gè)元素是否存在于一個(gè)集合中。
核心特點(diǎn):
高效省空間:相比哈希表,它用位數(shù)組 + 多個(gè)哈希函數(shù)實(shí)現(xiàn),占用內(nèi)存極小,適合海量數(shù)據(jù)場(chǎng)景。
概率性結(jié)果:
不存在則一定不存在(100% 準(zhǔn)確);
存在則可能存在(有一定誤判率,無(wú)法完全避免)。
不支持刪除:元素加入后無(wú)法移除,否則會(huì)影響其他元素的判斷(部分變種支持刪除,但復(fù)雜度高)。
工作原理:
初始化一個(gè)長(zhǎng)度為 m 的位數(shù)組,所有位初始化為 0;
選取 k 個(gè)獨(dú)立的哈希函數(shù);
添加元素:將元素通過(guò) k 個(gè)哈希函數(shù)計(jì)算出 k 個(gè)索引,把位數(shù)組對(duì)應(yīng)索引的位設(shè)為 1;
查詢(xún)?cè)兀簩⒃赝ㄟ^(guò) k 個(gè)哈希函數(shù)計(jì)算索引,若所有對(duì)應(yīng)位都是 1,則判斷 “可能存在”;只要有一個(gè)位是 0,則判斷 “一定不存在”。
攔截流程:
客戶(hù)端發(fā)起請(qǐng)求,先經(jīng)過(guò)布隆過(guò)濾器判斷 key 是否存在; 若布隆過(guò)濾器判斷 key 不存在 → 直接返回空結(jié)果,不訪問(wèn)緩存和數(shù)據(jù)庫(kù); 若布隆過(guò)濾器判斷 key 可能存在 → 再走正常流程:查緩存 → 緩存未命中查數(shù)據(jù)庫(kù) → 數(shù)據(jù)庫(kù)查到則回寫(xiě)緩存。
使用布隆過(guò)濾器的注意事項(xiàng):
- 誤判率處理:
布隆過(guò)濾器的誤判會(huì)導(dǎo)致 “不存在的 key 被判斷為可能存在”,此時(shí)請(qǐng)求仍會(huì)打到數(shù)據(jù)庫(kù),但這種情況概率低,且可以通過(guò)調(diào)整位數(shù)組長(zhǎng)度 len 和哈希函數(shù)個(gè)數(shù) k 降低誤判率(len越大、k 適中,誤判率越低)。 - 數(shù)據(jù)同步:
當(dāng)數(shù)據(jù)庫(kù)中新增 / 刪除 key 時(shí),需要同步更新布隆過(guò)濾器(刪除操作需注意布隆過(guò)濾器不支持直接刪除的問(wèn)題,可通過(guò)定時(shí)重建布隆過(guò)濾器解決)。 - 適用場(chǎng)景:
適合海量數(shù)據(jù)、key 不常變動(dòng)、可以容忍低誤判率的場(chǎng)景(如:電商商品 ID、用戶(hù) ID 過(guò)濾)。
緩存擊穿問(wèn)題解決方案
什么是緩存擊穿:指高并發(fā)場(chǎng)景下,某個(gè)熱點(diǎn)數(shù)據(jù)的緩存突然失效(例如過(guò)期),導(dǎo)致大量請(qǐng)求直接穿透緩存層,直接請(qǐng)求到數(shù)據(jù)庫(kù),可能導(dǎo)致數(shù)據(jù)庫(kù)短時(shí)間內(nèi)承受巨大的壓力。
解決方案:
- 互斥鎖:當(dāng)緩存失效時(shí),只允許一個(gè)線(xiàn)程去查詢(xún)數(shù)據(jù)庫(kù)并重建緩存,其他線(xiàn)程等待。可以使用分布式鎖(如Redis的setnx)實(shí)現(xiàn)互斥。

- 優(yōu)點(diǎn):沒(méi)有額外的內(nèi)存消耗;保證了一致性;實(shí)現(xiàn)簡(jiǎn)單;
- 缺點(diǎn):線(xiàn)程需要等待;可能死鎖
- 邏輯過(guò)期:為熱點(diǎn)數(shù)據(jù)設(shè)置邏輯過(guò)期時(shí)間,而非物理過(guò)期。緩存本身不主動(dòng)失效,但在緩存中存儲(chǔ)一個(gè)過(guò)期時(shí)間字段。當(dāng)發(fā)現(xiàn)數(shù)據(jù)過(guò)期時(shí),異步觸發(fā)緩存更新。

- 優(yōu)點(diǎn):線(xiàn)程無(wú)需等待,性能較好
- 缺點(diǎn):不能保證一致性;有額外的內(nèi)存消耗;實(shí)現(xiàn)較復(fù)雜
緩存雪崩問(wèn)題解決方案
什么是緩存雪崩:指緩存系統(tǒng)在某一時(shí)刻出現(xiàn)大規(guī)模失效或宕機(jī),導(dǎo)致大量請(qǐng)求直接涌向數(shù)據(jù)庫(kù),引發(fā)系統(tǒng)性能急劇下降甚至崩潰的現(xiàn)象。
解決方案:
- 給不同的key的ttl設(shè)置隨機(jī)值
- 部署 Redis 集群或哨兵模式,確保單點(diǎn)故障時(shí)自動(dòng)切換
- 給業(yè)務(wù)添加多級(jí)緩存
- 給緩存業(yè)務(wù)添加降級(jí)限流策略
BitMap
什么是BitMap:Bitmap是Redis中一種特殊的數(shù)據(jù)結(jié)構(gòu),基于字符串類(lèi)型實(shí)現(xiàn),但每個(gè)位可以單獨(dú)操作。適用于需要高效存儲(chǔ)和操作大量布爾值的場(chǎng)景。最大上限是512M,轉(zhuǎn)換成bit是2^32個(gè)bit位
BitMap的常見(jiàn)用法
- setbit key offet value 向指定位置offet存入一個(gè)0或1
- getbit key offet 獲取指定位置offet的bit值
- bitcount key [start end] 統(tǒng)計(jì)指定范圍內(nèi)bit為1的數(shù)量
- bitpos key bit [start] [end] 查詢(xún)指定范圍內(nèi)第一個(gè)0或1出現(xiàn)的二進(jìn)制位的位置
總結(jié)
到此這篇關(guān)于redis的常見(jiàn)用法和問(wèn)題之緩存擊穿、緩存穿透、緩存雪崩的文章就介紹到這了,更多相關(guān)redis緩存擊穿、緩存穿透、緩存雪崩內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot項(xiàng)目redis緩存異常實(shí)戰(zhàn)案例詳解(提供解決方案)
redis基本上是高并發(fā)場(chǎng)景上會(huì)用到的一個(gè)高性能的key-value數(shù)據(jù)庫(kù),屬于nosql類(lèi)型,一般用作于緩存,一般是結(jié)合數(shù)據(jù)庫(kù)一塊使用的,但是在使用的過(guò)程中可能會(huì)出現(xiàn)異常的問(wèn)題,這篇文章主要介紹了springboot項(xiàng)目redis緩存異常實(shí)戰(zhàn)案例詳解(提供解決方案),需要的朋友可以參考下2025-05-05
Redis中Stream詳解及應(yīng)用小結(jié)
Redis Streams是Redis 5.0引入的新功能,提供了一種類(lèi)似于傳統(tǒng)消息隊(duì)列的機(jī)制,但具有更高的靈活性和可擴(kuò)展性,本文給大家介紹Redis中Stream詳解及應(yīng)用小結(jié),感興趣的朋友一起看看吧2025-07-07
使用Redis控制表單重復(fù)提交和控制接口訪問(wèn)頻率方式
這篇文章主要介紹了使用Redis控制表單重復(fù)提交和控制接口訪問(wèn)頻率方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06
Redis+Caffeine如何構(gòu)建高性能二級(jí)緩存
這篇文章主要介紹了Redis+Caffeine如何構(gòu)建高性能二級(jí)緩存問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-05-05
redis 實(shí)現(xiàn)登陸次數(shù)限制的思路詳解
這篇文章主要介紹了redis 實(shí)現(xiàn)登陸次數(shù)限制的思路詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
Redis源碼與設(shè)計(jì)剖析之網(wǎng)絡(luò)連接庫(kù)
這篇文章主要為大家介紹了Redis源碼與設(shè)計(jì)剖析之網(wǎng)絡(luò)連接庫(kù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09

