????????要知道什么是數據傾斜就的搞清楚redis是怎么存儲和訪問數據的。數據會按照一定的規則分布到不同槽上,然后槽又落在不同的機器節點上。比如把key進行crc16函數計算后的值對槽取模,然后槽會分配到不同的節點上。然后存取都會到對應的節點上去進行處理。
? ? ? ? 傾斜可以分為兩類:
? ? ? ? 1,存儲傾斜。指不同節點上存儲的數據量很不均勻,如一臺存的很多,一臺存的很少。
? ? ? ? 2,訪問傾斜。數據存儲都差不多,但是訪問很傾斜的打到一臺節點上。
? ? ? ? 為什么會造成存儲傾斜呢?
? ? ? ? 1,bigkey導致。bigkey的意思就是key的value非常大。存了很大的字符串或者集合。解決辦法就是把數據分開存儲到多個key上即可。
? ? ? ? 2,槽分配不均勻導致。redis有16000多個槽,數據會存儲在這些槽上,實際這些槽會分布到具體的實體機器上。這個分配是可以手動的,如果哪臺機器性能較好,完全可以多分配些槽上去。
? ? ? ? 3,哈希標簽(Hash Tag)方式。hashTag的意思是在key中加一對括號。比如user:{123},那么計算槽時就只會用123計算,而不是整個user:{123}計算。
? ? ? ? 訪問傾斜又是怎么回事呢?
????????訪問傾斜其實就是典型的熱點數據。比如用redis做博客,明星發布了一個什么吃瓜消息后。同時幾十萬上百萬的請求都想看這個新聞,那么這個訪問就發生了傾斜。如果請求都打到一臺機器上,肯定完蛋。
? ? ? ? 怎么應對熱點數據?
? ? ? ? 其實也是要將數據分開存儲到不同的機器上,讓更多的機器來抗壓力。數據怎么存儲多份呢?
key | 槽 | 機器 |
key=熱點事件:XX明星結婚:隨機key1 | 1024 | 1 |
key=熱點事件:XX明星結婚:隨機key2 | 2048 | 2 |
key=熱點事件:XX明星結婚:隨機key3 | 3096 | 3 |
然后訪問的時候隨機的帶上當時存儲的隨機key就可以把請求分攤到多臺機器上了。