事の始まり
以前案件でRedis(ElastiCache)をクラスターモードを有効を用いる時Mgetができない問題に陥った。
その際にそもそもRedisってなんだろ(案件で使う前に考えろって話は置いときましょう。。。)と思い調べることにした。
ハッシュスロット
redisがなんなのかって話は置いておこう。
キーの値をCRC16のチェックサム(データの信頼性を検査するための算出値)に16834の剰余である。
その値がハッシュスロットに入る。(スロットはノード番号と思ってたら良いかと)
ノード
ハッシュスロットに入った値がノードの箇所を示しており、そのノード内からキーを検索する。そしてキーに紐づく値を取得するといった流れになっている。
Mgetできなかった理由
ではなぜMgetできなかったのか。それはこちらのエラーになる。
ERR CROSSSLOT Keys in request don't hash to the same slot
と出てくる。つまりクラスターモードを有効にした場合、ノード間を渡って値を取得してきているがそれができないとのことらしい。
ハッシュタグ
ではどう行なったのかというともう片方に寄せてしまおう作戦である。
ハッシュタグ({ } で囲まれた文字列)を利用することで{ } 内の文字列のみがハッシュスロットの計算に使用される。
そのため、setした値はハッシュタグを用いることで特定のノード内に保管されることになる。