Redis hash slot 的位置是否會影響分散結果

這篇文章會提到關於 Redis cluster 的內容,如果不太清楚還是建議先去了解一下。


今天遇到一個狀況,當我們在使用 redis cluster 時,按照官網的範例通常 key 會是這樣的格式 IAMKEY{SLOT},那如果將 slot 位置改變到 key 中間,算出來的 hash slot 會不同嗎?


實驗開始

Step 1 啟動 Redis

先啟用 redis (看你是要使用 instance 還是 docker)
我比較習慣把常用的服務寫在一個 docker-compose yml 內,這樣每次都能用到全新的,也不用各別一一啟動。

1
2
3
4
5
6
7
8
9
version: "3.7"
services:
redis:
image: redis
container_name: redis-testdc
ports:
- "16377:6379"
environment:
PASSWORD: pass.123

Step 2 連上 redis

redis-cli -h localhost -p 16377

Step 3 測試 Cluster key slot

1
2
localhost:16377> CLUSTER KEYSLOT ABC
(error) ERR This instance has cluster support disabled

馬上就遇到問題了,因為預設的 redis cluster 是關閉的,因此我們需要調整 redis.conf 內的設定,改為啟用 cluster-enabled yes。不過我們是使用 docker-compose,所以還是要改為指令方式,於是在 yml 加上指令。

1
2
3
4
5
6
7
8
9
10
version: "3.7"
services:
redis:
image: redis
container_name: redis-testdc
ports:
- "16377:6379"
environment:
PASSWORD: pass.123
command: redis-server --cluster-enabled yes

Step 4 測試囉

就容我直接貼上實際測試的結果了

localhost:16377> cluster keyslot abc
(integer) 7638
localhost:16377> cluster keyslot def
(integer) 16148
localhost:16377> cluster keyslot abc:{12345}
(integer) 5228
localhost:16377> cluster keyslot def:{12345}
(integer) 5228
localhost:16377> cluster keyslot a:{12345}:bc
(integer) 5228


結論是 CRC16 計算只會認大括弧 {}內的值,不管它在哪裡都會是一樣的結果。

Reference:

  • 作者: MingYi Chou
  • 版權聲明: 轉載不用問,但請註明出處!本網誌均採用 BY-NC-SA 許可協議。