Redis中大Key與熱Key的解決方案
一、定義
1.1、什么是大key
大 key指的是一個鍵中包含了大量的數(shù)據(jù)。(總結(jié)一個字就是大)占用空間:
大key通常指的是一個鍵包含了大量的數(shù)據(jù),使得該鍵對應(yīng)值的占用的內(nèi)存超出了正常范圍。這個大小的閾值并不是固定的,而是相對于 Redis 實例的可用內(nèi)存而言。當一個鍵的大小超出了 Redis 實例可用內(nèi)存時,就可以認為它是一個大key。操作耗時:如果對一個 key 的操作所需的時間過長,導(dǎo)致性能下降或者影響其他請求的處理速度,也可以說這個 key 是
大key。因為這種情況通常是由于該 key 下包含了大量的數(shù)據(jù)。
1.2、什么是熱key
熱 key指的是頻繁訪問的鍵。(總結(jié)就是熱,訪問頻繁。)頻繁訪問:在某一段時間內(nèi)被頻繁訪問的 key 就是
熱key。業(yè)務(wù)方面:比如商城促銷的場景下,某個商品的緩存可能就會成為
熱key。這種情況下熱key反應(yīng)的不僅是該鍵的訪問頻率高,還反映了用戶對某個業(yè)務(wù)功能的熱度。性能方面:
熱key的頻繁訪問造成 Redis 的 CPU 占用率過高,造成響應(yīng)時間延長或者請求阻塞,從而造成系統(tǒng)崩潰。
key 的大與不大,熱與不熱要根據(jù)自己的業(yè)務(wù),從實際情況進行評估。
二、影響
2.1、大 key 的影響
- 內(nèi)存消耗: 在進行緩存時降低緩存的效率,占用大量的內(nèi)存空間,使得 Redis 的內(nèi)存消耗急劇增加,還可能導(dǎo)致 Redis 實例的內(nèi)存資源不足,甚至出發(fā)內(nèi)存淘汰策略,從而影響系統(tǒng)的正常運行。
- 性能下降:處理大的 key,會耗費更多的 CPU 時間以及帶寬,導(dǎo)致 Redis 性能下降。由于 Redis 還是單線程的,處理
大key的操作進而會阻塞其他請求的處理,從而影響系統(tǒng)性能。 - 持久化效率降低: 在進行持久化操作時,
AOF與RDB都會因為該大key耗費更多的時間,從而延遲持久化時間,分布式環(huán)境下甚至會造成緩存不一致。 - 網(wǎng)絡(luò)傳輸延遲:
大key在進行網(wǎng)絡(luò)傳輸時會增加網(wǎng)絡(luò)傳輸?shù)难舆t,在分布式環(huán)境下進行數(shù)據(jù)同步時可能會造成數(shù)據(jù)的不一致。
2.2、熱 key 的影響
- CPU占用率高: 因為是
熱key,所以 CPU 一直占用,進而導(dǎo)致Redis實例的CPU負載增加。 - 請求阻塞:如果 key 有訪問優(yōu)先級,
熱key的存在可能導(dǎo)致請求隊列中其他的請求被阻塞。 - 響應(yīng)時間延長:因為
熱key,其他的請求被阻塞了造成響應(yīng)時間延長。 - 性能不均衡:流量訪問造成突刺,系統(tǒng)性能的不均衡。
2.3、小結(jié)
大key 與 熱key 都會給 Redis 實例造成一系列的影響,如內(nèi)存占用過高,CPU 負載增加,持久化時間變長,性能下降等。
三、原因分析
3.1、大 key 產(chǎn)生的原因
產(chǎn)生 大key 的原因有很多種,下面咱就一起看一下工作中經(jīng)常遇到的這幾種。
3.1.1、存儲大量數(shù)據(jù)
存儲了大量數(shù)據(jù)也是我們經(jīng)常遇到 大key 的最多的原因了。
比如 String 類型直接保存了一個大的文本或者二進制數(shù)據(jù);Hash 結(jié)構(gòu)中存儲大量的鍵值對。
- String
SET zuiyu_large_text_key "very large text content..."
- Hash
HMSET zuiyu_large_hash_key field1 value1 field2 value2 ... fieldN valueN
3.1.2、緩存時間設(shè)置不合理
緩存時間設(shè)置不合理這個造成 大key 的原因大概是個隱藏挺深的老 bug,有的業(yè)務(wù)場景,使用 Redis 緩存數(shù)據(jù),業(yè)務(wù)是定時往該 key 上寫數(shù)據(jù),由于該 key 是沒有設(shè)置緩存時間的造成這個 key 隨著時間的流逝,占用的內(nèi)存越來越多,對于該點,只需要設(shè)置一個合理的過期時間即可。
前提是多次寫入不是覆蓋,而是追加才會有該問題。
SETEX zuiyu_key_with_expiry value 3600 # 設(shè)置過期時間為3600秒
3.1.3、數(shù)據(jù)結(jié)構(gòu)使用不當
在使用 List 數(shù)據(jù)結(jié)構(gòu)存儲數(shù)據(jù)時,重復(fù)的添加數(shù)據(jù),造成該 key 越來越大,實際上業(yè)務(wù)是不需要有重復(fù)的數(shù)據(jù)存在的。
- List
LPUSH zuiyu_large_list_key value
3.1.4、小結(jié)
大key 的產(chǎn)生根本原因就是在一個 key 下面存儲的數(shù)據(jù)多了。
3.2、熱 key 產(chǎn)生的原因
3.2.1、熱門數(shù)據(jù)
熱key 的產(chǎn)生一般意味著系統(tǒng)訪問火爆了,但是火爆的只是其中一個點或者n個點。類似微博中某個明星的瓜,當上頭條的時候,大量的人去訪問,造成了該明星所對應(yīng)的 key 成為 熱key。
3.2.2、頻繁的更新
某些業(yè)務(wù)場景,單位時間內(nèi)一直頻繁的對 key 進行更新,該 key 也會成為 熱key。
3.2.3、熱門搜索
類似于第一中的熱門數(shù)據(jù),產(chǎn)生了熱門數(shù)據(jù),該數(shù)據(jù)對應(yīng)的熱門關(guān)鍵詞也被大量的用戶去搜索,造成該關(guān)鍵詞被頻繁訪問,最終導(dǎo)致該 key 也稱為 熱key。
3.2.4、小結(jié)
熱key 的產(chǎn)生無外乎熱門數(shù)據(jù),熱門數(shù)據(jù)產(chǎn)生的熱門關(guān)鍵詞以及對同一個 key 在某段時間內(nèi)的頻繁訪問。
四、解決方案
4.1、大key的解決方案
- 合理的數(shù)據(jù)結(jié)構(gòu)
- 合理的緩存時間
大key進行拆分為多個小key- 定期對
大key進行清理
4.2、熱key的解決方案
- 合理的緩存淘汰策略
- 熱點數(shù)據(jù)分片
將熱點數(shù)據(jù)分散到不同的Redis實例,提升系統(tǒng)的吞吐量。
- 緩存預(yù)熱
在系統(tǒng)啟動或者活動高峰開啟之前進行緩存預(yù)熱,提前將需要的數(shù)據(jù)加載到緩存,減少熱點數(shù)據(jù)首次訪問的時間。
- 隨機緩存失效時間
避免大量的key同一時間批量失效,造成緩存雪崩與緩存穿透。
- 緩存穿透
使用布隆過濾器進行緩存請求過濾,防止無效請求進入到緩存層。
五、總結(jié)
針對 大key 我們要盡可能的避免同一個 key 下大量的數(shù)據(jù)。 針對 熱key 我們要合理設(shè)置過期時間,增加布隆過濾器等技術(shù)實現(xiàn)無效請求過濾,對即將到來的數(shù)據(jù)進行緩存預(yù)熱、熱點數(shù)據(jù)分片處理。
以上就是Redis中大Key與熱Key的解決方案的詳細內(nèi)容,更多關(guān)于Redis大Key與熱Key的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Redis過期事件監(jiān)聽器的完整實現(xiàn)步驟
要使用 Redis 過期事件監(jiān)聽器來更新數(shù)據(jù)庫狀態(tài),我們需要確保 Redis 的事件通知已啟用,并實現(xiàn)監(jiān)聽器來捕獲過期的鍵,并根據(jù)需要更新數(shù)據(jù)庫,本文給大家介紹了Redis過期事件監(jiān)聽器的完整實現(xiàn)步驟,需要的朋友可以參考下2024-10-10
SpringMVC集成redis配置的多種實現(xiàn)方法
這篇文章主要介紹了SpringMVC集成redis配置的多種實現(xiàn)方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
Redis利用原子操作(INCR,DECR)實現(xiàn)分布式計數(shù)器
在分布式系統(tǒng)中,由于多個服務(wù)實例需要共享和修改同一個計數(shù)值,實現(xiàn)一個準確、高效的分布式計數(shù)器至關(guān)重要,下面我們就來看看具體實現(xiàn)方法吧2025-07-07
Redis Scan 命令使用教程(高效遍歷海量數(shù)據(jù)的方法)
Scan 是 Redis 2.8 版本引入的迭代式遍歷命令,主要用于遍歷 Redis 中的鍵集合或集合類型(如 Hash、Set、Sorted Set)的元素,本文將從基礎(chǔ)介紹、實現(xiàn)原理、實操方式到實踐總結(jié),全面講解 Scan 命令的使用,感興趣的朋友跟隨小編一起看看吧2025-09-09

