redis-熱key大key
BIG KEY
作者:w08e
Big key , hot key 傻傻分不清楚
什么是大key
Redis 中的 "大 Key" 通常指的是一個占用較大內存空間的鍵(Key)。這可能會對 Redis 的性能產生負面影響,因為大 Key 可能導致內存碎片化、刪除延遲以及網絡傳輸時間延長等問題。
大 Key 可能出現在不同的場景中,例如:
- 大型字符串
- 大型列表
- 大規模哈希表
可以通過redis內置bigkeys 獲取整體統計情況
風險
大 Key 可能會導致以下問題:
-
內存碎片化:大 Key 占用的內存塊較大,可能導致內存碎片化,從而影響 Redis 的內存使用效率。
-
網絡傳輸延遲:傳輸大 Key 的數據可能會導致較長的網絡傳輸時間,特別是在進行備份、遷移或從節點同步等操作時。
-
刪除阻塞:在刪除大 Key 的過程中,可能會導致其他操作的響應時間變長。這是因為在刪除大 Key 時,需要遍歷鍵中的所有元素,并在內部進行相應的清理操作。在此期間,其他操作會等待刪除操作完成。
-
持久化延遲:如果 Redis 實例使用了持久化機制(如 RDB 快照或 AOF 日志),刪除大 Key 可能會導致持久化操作的延遲,因為持久化過程也需要處理大 Key 的數據。
解決

HOT KEY
什么是熱key
與大 Key 一樣,熱 Key 沒有一個明確定義,通常情況下,當某個 Key 的請求頻率顯著高于其他 Key 時,我們就可以將其視為熱 Key。
熱 Key 可能會引發多種問題,包括占用大量的 CPU 資源從而影響 Redis 的吞吐量,或者在集群中可能導致流量不均衡,形成讀寫熱點問題等。
Redis 從版本 4.0 開始引入了 hotkey 命令,允許通過客戶端的 redis-cli --hotkeys 命令掃描庫中的所有熱點 Key。
解決
-
讀寫分離
-
熱key備份
我們可以將熱 Key 復制到多個 Redis 實例,并在請求時隨機選擇一個備份實例來分散請求壓力。
比如,假如現有熱 Key "foo",我們將其復制到三個分片中,分別叫做 foo_1、foo_2 與 foo_3,當請求 "foo" 時,我們為其隨機添加一個后綴,從而實現分散請求壓力的效果:
-
二級緩存
對于一些熱 Key,我們可以考慮使用一些本地緩存工具(比如 Guava 或 Ehcache) 直接將其緩存到 JVM 內存中,從根本上避免對 Redis 造成壓力。
不過,這種方案下緩存會占用額外的運行時內存,因此需要有選擇進行緩存,以避免占用過多內存資源。并且當與 Redis 緩存共用時,也要考慮數據一致性問題。

浙公網安備 33010602011771號