Redis?Key使用{}原因分析
Redis集群介紹
Redis集群是一個提供在多個Redis間節(jié)點間共享數(shù)據(jù)的程序集,Redis集群能夠?qū)崿F(xiàn)key的分片,分片能使key均勻地分布到集群的機器上去,能保證數(shù)據(jù)的一致性。
使用Redis集群需要注意的點
從Redis單實例切換到twemproxy集群時,有些需要注意的地方。
1、不支持的方法:
KEYS、MIGRATE、SCAN等
2、支持但需特殊處理的方法:
MSET、SINTERSTORE、SUNIONSTORE、ZINTERSTORE、ZUNIONSTORE等
對于不支持的方法,在使用時需要尋找替代方案。
Redis集群的數(shù)據(jù)分片
Redis集群沒有使用一致性hash,而是引入了哈希槽的概念。
Redis集群有16384個哈希槽,每個key通過CRC16校驗后對16384取模來決定放置哪個槽。集群的每個節(jié)點負責(zé)一部分hash槽,舉個例子,比如當前集群有3個節(jié)點,那么:
節(jié)點 A 包含 0 到 5500號哈希槽。
節(jié)點 B 包含5501 到 11000 號哈希槽。
節(jié)點 C 包含11001 到 16384號哈希槽。
這種結(jié)構(gòu)很容易添加或者刪除節(jié)點。比如如果我想新添加個節(jié)點D, 我需要從將節(jié)點 A、B、C中的部分槽到D上。如果我想移除節(jié)點A,需要將A中的槽移到B和C節(jié)點上,然后將沒有任何槽的A節(jié)點從集群中移除即可。 由于從一個節(jié)點將哈希槽移動到另一個節(jié)點并不會停止服務(wù),所以無論添加刪除或者改變某個節(jié)點的哈希槽的數(shù)量都不會造成集群不可用的狀態(tài)。
MSET
單實例上的MSET是一個原子性(atomic)操作,所有給定key都會在同一時間內(nèi)被設(shè)置,某些給定key被更新而另一些給定key沒有改變的情況,不可能發(fā)生。
而集群上雖然也支持同時設(shè)置多個key,但不再是原子性操作。會存在某些給定 key 被更新而另外一些給定key沒有改變的情況。其原因是需要設(shè)置的多個key可能分配到不同的機器上。
SINTERSTORE、SUNIONSTORE、ZINTERSTORE、ZUNIONSTORE
這四個命令屬于同一類型。它們的共同之處是都需要對一組key進行運算或操作,但要求這些key都被分配到相同機器上。這就是分片技術(shù)的矛盾之處:即要求key盡可能地分散到不同機器,又要求某些相關(guān)聯(lián)的key分配到相同機器。
Hash Tags
解鈴還需系鈴人,解決方法還是從分片技術(shù)的原理上找。
分片,就是一個hash的過程:對key做md5,sha1等hash算法,根據(jù)hash值分配到不同的機器上。為了實現(xiàn)將key分到相同機器,就需要相同的hash值,即相同的key(改變hash算法也行,但不簡單)。但key相同是不現(xiàn)實的,因為key都有不同的用途。例如user:user1:ids
保存用戶的tweets ID,user:user1:tweets
保存tweet的具體內(nèi)容,兩個key不可能同名。
仔細觀察user:user1:ids
和user:user1:tweets
,兩個key其實有相同的地方,即user1。能不能拿這一部分去計算hash呢?
這就是Hash Tag,允許用key的部分字符串來計算hash。當一個key包含{}
的時候,就不對整個key做hash,而僅對{}
包括的字符串做hash。假設(shè)hash算法為sha1。對user:{user1}:ids
和user:{user1}:tweets
,其hash值都等同于sha1(user1)。
HashTag可能會使過多的key分配到同一個slot中,造成數(shù)據(jù)傾斜影響系統(tǒng)的吞吐量,務(wù)必謹慎使用。
以上就是Redis Key使用{}原原因分析的詳細內(nèi)容,更多關(guān)于Redis Key使用{}的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Redis報錯:Could not create server TCP 
這篇文章主要介紹了Redis報錯:Could not create server TCP listening socket 127.0.0.1:6379: bind:解決方法,是安裝與啟動Redis過程中比較常見的問題,需要的朋友可以參考下2023-06-06Redis 對比 Memcached 并在 CentOS 下進行安裝配置詳解
Redis 是一個開源、支持網(wǎng)絡(luò)、基于內(nèi)存、鍵值對的 Key-Value 數(shù)據(jù)庫,本篇文章主要介紹了Redis 對比 Memcached 并在 CentOS 下進行安裝配置詳解,有興趣的可以了解一下。2016-11-11redis的list數(shù)據(jù)類型相關(guān)命令介紹及使用
本文主要介紹了redis的list數(shù)據(jù)類型相關(guān)命令介紹及使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01