熱點 Key 指單個 Key 被高并發訪問(如爆款商品),導致 Redis 壓力驟增。解決方案應針對 “單個 Key 高并發”:
- 分片緩存:將熱點 Key 分散到不同 Redis 節點(如按一致性哈希算法分片)。
- 本地緩存:在應用層緩存熱點數據(如 Caffeine),減少 Redis 壓力。
- 增加緩存副本:為熱點數據增加緩存副本,將熱點數據復制到多個緩存節點上,分散訪問壓力。(例如,使用 Redis 的主從復制,將熱點數據存儲在多個從節點上,分散讀請求。)
熱點 Key 的產生原因(除 Redis 宕機外)
- 熱點 Key 的核心原因是突發流量或熱門事件,例如:
- 突發活動:秒殺、直播帶貨導致某個商品 Key 被高頻訪問。
- 熱點事件:微博熱搜話題對應的緩存 Key。
- 數據傾斜:數據庫中某類數據天然訪問量高(如高頻查詢的用戶 ID)。
一致性hash了解過嗎?
一致性哈希是一種用于分布式系統中的負載均衡算法,它的核心目標是:在節點數量發生變化時,盡量減少數據遷移,同時保持數據的均勻分布。
- 主要目的是將數據均勻分布到多個節點上,并在節點增減時盡可能減少數據的重新分配。
核心原理
-
哈希環(Hash Ring):
- 一致性哈希把整個哈希值空間組織成一個環狀結構(0 ~ 232 - 1)。
-
節點映射:
- 每個節點通過哈希函數(如 FNV、MD5 等)被映射到環上的一個點。
-
數據映射:
- 數據項(key)同樣通過哈希函數映射到環上。
- 每個數據項存儲在順時針方向遇到的第一個節點上。
節點變動對數據影響最小
-
增加節點:
- 新節點插入環后,只接管其順時針方向上第一個節點的部分數據,其余數據不受影響。
-
刪除節點:
- 節點下線后,其數據由順時針方向的下一個節點接管。
這保證了在節點動態增減的情況下,只需遷移小部分數據,極大提升了系統的可擴展性與穩定性。
應用場景
- 分布式緩存(如 Redis Cluster)
- 負載均衡(如 Nginx+Consistent Hash)
- 分布式存儲(如 Cassandra、Amazon Dynamo)
刪除大key的方式
- 分批刪除:將大key分批刪除,使用
SCAN
迭代獲取大key中的元素,逐個刪除
HSCAN bigkey 0 COUNT 100
HDEL bigkey f1 f2 f3 ...
- 異步刪除:利用redis4.0引入的
UNLINK
代替DEL
,在后臺進行刪除,減少阻塞
UNLINK bigkey
- 設置過期時間:為大key設置過期時間,等過期在后臺自己刪除
EXPIRE bigkey 60
- 使用lua腳本:使用lua腳本代替發大量操作,減少網絡IO
-- 分批刪除 set 中的成員(每次刪100個)
local members = redis.call('SRANDMEMBER', KEYS[1], 100)
for i=1,#members doredis.call('SREM', KEYS[1], members[i])
end
return #members
https://github.com/0voice