遇到大key、熱key問題,主要是去拆分
大key問題
業務場景中經常會有各種大key的情況, 比如:
1. 單個簡單的key儲存的value很大(例如排行榜資訊,key是固定的,value排行榜幾十萬的資料)
2. hash、set、zset、list中儲存過多的元素(以萬為單位)
由於redis是單執行緒執行的,如果一次操作的value很大會對整個redis的響應時間造成負面影響,所以,業務上能拆則拆,
解決方案:
1. 現在本地計算最後儲存在哪個key中,計算出key的hash值,預設是通過(pin)的hash值,模除100,然後確認存在那個key上面
2. 取得時候,同樣也需要計算,即
newhashkey = hashkey + (hash(field) % 10000);
hset(newhashkey, field, value);
hget(newhashkey, field)
熱key問題:
解釋:熱門的key值,被頻繁的訪問,例如秒殺的資訊,導致redis直接死掉
解決方案: 通過把熱門的key,放在不同的伺服器,即通過redis分片的策略,線上的redis一般都是集群進行部署,對於redis-cluster模式,熱點的key會導致部分分片的負載非常高而被拖垮
1. 可以將熱key,通過輪詢放在不同的伺服器,
2. 查詢的時候,同樣按照輪詢,查詢不同的伺服器,(然後通過拼接各台伺服器的資料)降低單台伺服器的壓力
一、快取讀熱點key問題:
某個熱點快取model讀取流量極大。帶來問題:
讀快取問題:讀流量集中到某key,導致指定快取機器壓力過大
寫快取問題:快取失效時,大量執行緒穿透構建快取,帶來db和服務壓力。
解決:讀快取問題將快取在分布式服務機器做二次快取
備份熱點key:即將熱點key+隨機數,隨機分配至redis其他節點中。這樣訪問熱點key的時候就不會全部命中到一台機器上了。
限流熔斷保護。
寫快取問題使用互斥鎖(mutex key),只讓乙個執行緒構建快取,其他執行緒等待構建快取的執行緒執行完,重新從快取獲取資料就可以了(如下圖)。
redis上不設定過期時間,過期時間存在key對應的value裡,如果發現要過期了,通過乙個後台的非同步執行緒進行快取的構建,也就是「邏輯」過期。對於效能非常友好,唯一不足的就是構建快取時候,其餘執行緒(非構建快取的執行緒)可能訪問的是老資料。
二、快取大key問題
redis使用過程中經常會有各種大key的情況, 比如單個簡單的key儲存的value很大。
由於redis是單執行緒執行的,如果一次操作的value很大會對整個redis的響應時間造成負面影響,導致io網路擁塞。
解決:將整存整取的大物件,分拆為多個小物件。可以嘗試將物件分拆成幾個key-value, 使用multiget獲取值,這樣分拆的意義在於分拆單次操作的壓力,將操作壓力平攤到多個redis例項中,降低對單個redis的io影響;
redis的大key和熱key問題
redis的大key和熱key實際上就是經常被訪問的key或者占用空間比較大的key。有什麼影響?舉個栗子,比如說某個明星出軌了,這個明星的搜尋量就會暴增,對redis造成很大的衝擊。redis檢視大key命令 redis cli bigkeys redis檢視熱key命令 redis cli ho...
Redis為什麼快,熱key解決
redis的速度非常的快,單機的redis就可以支撐每秒10幾萬的併發,相對於mysql來說,效能是mysql的幾十倍。速度快的原因主要有幾點 完全基於記憶體操作 c語言實現,優化過的資料結構,基於幾種基礎的資料結構,redis做了大量的優化,效能極高 使用單執行緒,無上下文的切換成本 基於非阻塞的...
原創 談談redis的熱key問題如何解決
講了幾天的資料庫系列的文章,大家一定看煩了,其實還沒講完。以下省略一萬字 今天我們換換口味,來寫redis方面的內容,談談熱key問題如何解決。其實熱key問題說來也很簡單,就是瞬間有幾十萬的請求去訪問redis上某個固定的key,從而壓垮快取服務的情情況。其實生活中也是有不少這樣的例子。比如xx明...