前段時間的一個項目Memcache
緩存切換到Redis
緩存,作了些Redis緩存方面的調研與學習,在學有所得的同時向你們分享些學到的乾貨。java
爲何緩存技術選型最後選擇了Redis
呢,結合項目的實際狀況由一下幾點考量的git
緩存數據的持久化,因爲Memcache
數據儲存在內充中,宕機或重啓memcache服務後緩存數據丟失github
集羣的高可用性,Memcache自身並無實現集羣功能,是經過客戶端實現的。Redis集羣在負債均衡,數據丟失容錯處理都作得比前者要好。redis
(Memcache與Redis技術選型比較不是本文重點,如想詳細瞭解能夠搜索相關博文)
api
瞭解redis集羣數據分片咱們能夠從如下這三個問題入手緩存
redis
集羣中key
是如何分佈到各個節點?key
所在節點?Redis集羣有16384
個哈希槽(hash slot)
,每一個key
經過CRC16
校驗後對16384取模來決定放置哪一個槽.集羣的每一個節點負責一部分hash slot。舉個例子,好比當前集羣有3個節點,那麼:分佈式
hash solt
.hash solt
.hash slot
.這種結構很容易添加或者刪除節點. 好比若是我想新添加個節點D, 我須要從節點 A, B, C中得部分槽到D上. 若是我想移除節點A,須要將A中的槽移到B和C節點上,而後將沒有任何槽的A節點從集羣中移除便可. 因爲從一個節點將哈希槽移動到另外一個節點並不會中止服務,因此不管添加刪除或者改變某個節點的哈希槽的數量都不會形成集羣不可用的狀態.學習
客戶端在查找key的所在節點時也是經過CRC16
校驗後對16384取模。故此具體某個key存放在哪一個hash sort
是固定的。code
Redis集羣中自身沒有實現分佈式鎖,但咱們能夠經過SET命令的特性實現分佈式鎖cdn
如下是Java版本的實例
獲取分佈式鎖的實現
釋放分佈式鎖的實現
學無止境,這段時間會陸續對前期的學習成果作些梳理並與你們分享,在給你們分享乾貨的同時,才疏學淺還望你們大刀予以斧正。也歡迎關注個人掘金或簡書,名稱爲柴碼