be-hase blog

うぇーい!うぇいーーーい!!

Redis Cluster での Lua script に関して

Redis Cluster の Slot に関して

Redis Cluster は slot(shard) が 16384個あり、それぞれの node がその slot を複数保持している。 ある key がどの slot に割当られるのかは、以下の計算で行われる。

slot_num = CRC16(key) mod 16384

また、key に {...} を使用することで slot の計算に使われる部分を指定することができる。

  • {userId10000}:score
  • {userId10000}:friends

は、同じ slot に含まれる。

Lua script with Redis Cluster

Redis Clusterでも、 KEYS が全て同じ slot なら Lua script が使える 。

例えば、こういうのは大丈夫。

> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 {key1}hoge {key1}bar first second
1) "{key1}hoge"
2) "{key1}bar"
3) "first"
4) "second"

が、 keys に異なるslotが含まれると redis cluster は処理することができない。

> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 {key1}hoge {key2}bar first second
(error) CROSSSLOT Keys in request don't hash to the same slot