アーカイブ

Archive for 2017年12月

StackExchangeでクラスター構成のRedisにTransactionで値を登録する場合はHashTagを使う

こんなコードをクラスター化されたRedisに対して実行すると

こんな例外が発生します。

StackExchange.Redis.RedisCommandException: Multi-key operations must involve a single slot; keys can use ‘hash tags’ to help this, i.e. ‘{/users/12345}/account’ and ‘{/users/12345}/contacts’ will always be in the same slot
場所 StackExchange.Redis.ServerSelectionStrategy.Select(Message message)
場所 StackExchange.Redis.ConnectionMultiplexer.TryPushMessageToBridge[T](Message message, ResultProcessor`1 processor, ResultBox`1 resultBox, ServerEndPoint& server)
場所 StackExchange.Redis.ConnectionMultiplexer.ExecuteAsyncImpl[T](Message message, ResultProcessor`1 processor, Object state, ServerEndPoint server)
場所 StackExchange.Redis.RedisTransaction.ExecuteAsync(CommandFlags flags)
場所 WindowsFormsApplication2.Form1.d__1.MoveNext() 場所 c:\users\sugiyama\documents\visual studio 2015\Projects\WindowsFormsApplication2\WindowsFormsApplication2\Form1.cs:行 36

エラーメッセージにある通り、Multi-keyに対する更新は対象となるデータがすべて同じスロットにある必要があるので、ハッシュタグでくくりましょうねとの事。

ハッシュタグでくくるとなんで同一のスロットに保存されるかはこのドキュメントが詳しい
Premium Azure Redis Cache の Redis クラスタリングの構成方法
https://docs.microsoft.com/ja-jp/azure/redis-cache/cache-how-to-premium-clustering#how-are-keys-distributed-in-a-cluster

という事で、こんなキー構成にするか、トランザクションを諦めるしかないようです。

広告
カテゴリー:ASP.NET タグ: