Explaining and Using Hash Tags
Hash Tag Design
Multi-key operations, such as those using the MSET command or Lua scripts, are atomic. All specified keys are executed at the same time. However, in a cluster, each key is hashed to a given shard, and multi-key operations are no longer atomic. The keys may be allocated to different slots. As a result, some keys are updated, while others are not. If there is a hash tag, the cluster determines which slot to allocate a key based on the hash tag. Keys with the same hash tag are allocated to the same slot.
Using Hash Tags
Only the content between the first left brace ({) and the following first right brace (}) is hashed.
For example:
- In keys {user1000}.following and {user1000}.followers, there is only one pair of braces. user1000 will be hashed.
- In key foo{}{bar}, there is no content between the first { and the first }. The whole key foo{}{bar} will be hashed as usual.
- In key foo{{bar}}zap, {bar (the content between the first { and the first }) is hashed.
- In key foo{bar}{zap}, bar is hashed because it is between the first pair of { and }.
Hash Tag Example
When the following operation is performed:
EVAL "redis.call('set',KEYS[1],ARGV[1]) redis.call('set',KEYS[2],ARGV[2])" 2 key1 key2 value1 value2
The following error is displayed:
ERR 'key1' and 'key2' not in the same slot
You can use a hash tag to solve this issue:
EVAL "redis.call('set',KEYS[1],ARGV[1]) redis.call('set',KEYS[2],ARGV[2])" 2 {user}key1 {user}key2 value1 value2
Feedback
Was this page helpful?
Provide feedbackThank you very much for your feedback. We will continue working to improve the documentation.