Redis Hash Slot Calculator

Paste keys and get the slot Redis Cluster will route each one to. The slot is CRC16 of the key masked to 16,384, and a hash tag narrows what gets hashed, which is the whole mechanism behind co-locating keys.

Only used for the node column. An even split is a guess: the real ranges come from CLUSTER NODES, and after any resharding they will not be even.

Paste below, or drop a file anywhere on this panel

Or drop a file anywhere on this panel. Nothing is uploaded: the analysis runs in this tab.

The answer appears here

Paste on the left and press Hash. Nothing leaves this tab.

Examples

Real input you can load into the tool above. Each one shows a different thing going wrong, because that is what the tool is for.

A tag that works

Two keys sharing a hash tag land in the same slot, which is what makes a multi-key command over them legal

{user1000}:profile
{user1000}:sessions
{user1000}:cart

Braces that do nothing

Empty braces are not a tag, so the whole key is hashed and the co-location the author expected does not happen

{}user:1000:profile
{}user:1000:sessions

Untagged siblings

Keys that look related are spread across slots, so MGET over them is rejected

user:1000:profile
user:1000:sessions
user:1000:cart

Common mistakes

These are the ones that fail silently. The config is accepted, nothing raises an error, and the consequence arrives later.

  1. Writing `{}` as a hash tag

    Empty braces are not a tag. Redis hashes the whole key including the braces, so keys the author believes are co-located are spread across slots.

    Instead:A tag needs at least one byte between the braces. `{user1000}:profile`, never `{}user1000:profile`.

  2. Assuming an even slot split means an even key split

    Slots are the unit of assignment, not of work. A tag used by a large tenant puts all of that tenant's keys in one slot, and no rebalance can separate them.

    Instead:Choose the tag so it partitions the data, usually per user or per tenant, not per batch or per job.

  3. Reading the node column as the real topology

    Slot-to-node assignment lives in the cluster and changes with every resharding. Nothing computed in a browser can know it.

    Instead:Use CLUSTER NODES or CLUSTER SLOTS for the actual mapping. The node column here only illustrates distribution.

The slot is the routing decision, and the tag is the only lever on it

Redis Cluster does not hash keys to nodes. It hashes them to one of 16,384 slots, and slots are assigned to nodes. That indirection is what makes resharding possible without rehashing every key, and it is why co-location has to be expressed in the key name itself.

CRC16, masked, and nothing else

HASH_SLOT = CRC16(key) mod 16384, using the XMODEM variant: polynomial 0x1021, initial value zero, no reflection and no final XOR. There is no seed, no per-cluster salt and no configuration. The same key gives the same slot on every Redis Cluster that has ever existed, which is why this can be computed here with no server.

A hash tag replaces the key with a substring

If a key contains a { followed later by a }, with at least one byte between them, Redis hashes ONLY what is between them. {user1000}:profile and {user1000}:sessions both hash user1000, so both land in the same slot and a multi-key command over them is legal. Without the braces they are two unrelated keys in two unrelated slots.

Three ways a tag silently does nothing

It is the FIRST { and then the FIRST } after it, so {a}{b} hashes a and nothing else. Empty braces are not a tag, so {}foo hashes the whole key including the braces. A { with no } after it is not a tag either. In all three cases Redis reports no error and the key is simply distributed as though the braces were ordinary characters, which is the failure this page exists to make visible.

Keys are bytes

The CRC is computed over the UTF-8 bytes of the key, not its characters. A key containing any non-ASCII character hashes differently than a naive implementation that walks JavaScript string indices would suggest, and a client that gets this wrong routes to the wrong node.

What this cannot see

It cannot tell you which node owns a slot. Slot-to-node assignment lives in the cluster and changes with every resharding, so the node column here assumes an even split purely to illustrate distribution. For the real mapping, use CLUSTER NODES or CLUSTER SLOTS against your cluster. It also cannot know whether your cluster is running in cluster mode at all: on a standalone Redis, slots are not used and every key is local.

More redis tools

Redis Hash Tag Tester Will these keys survive a multi-key command? Redis RESP Protocol Decoder Read what the server actually sent Redis RESP2 vs RESP3 Reply Decoder What the same reply looks like on each protocol Redis Command to RESP Exactly what your client puts on the socket Redis Glob Pattern Tester Redis globs are not shell globs Redis Connection URL Parser The path is the database number Redis Memory Unit Converter 1g and 1gb are not the same number Redis TTL Converter -1 and -2 are not durations Redis Stream ID Parser The first half is a millisecond timestamp redis.conf Validator Will Redis start with this file? Redis Production Config Linter The settings that cause incidents redis.conf to CONFIG SET Which of these can you change without a restart? Redis ACL Rule Decoder What does this user actually get? Redis ACL Validator Find the rule that does nothing Redis INFO Analyzer The numbers INFO does not print Redis SLOWLOG Analyzer What blocked everyone else Redis CLUSTER NODES Parser Read the topology, and find the gap Redis Cluster Slot Distribution Who owns how much, and what is missing Redis Keyspace Notification Flags Why your events never arrive Redis Memory Calculator The encoding decides, not the data Redis Key Count to Memory The fixed cost per key Redis Encoding Threshold Calculator One field more, several times the memory Redis Bitmap Memory Calculator Sized by the highest bit, not the set ones Redis HyperLogLog Calculator 12 KB whether you count a thousand or a billion Redis Cluster Sizing Only 60% of each node is usable Redis RDB and AOF Size Calculator The fork needs memory, not disk Redis Replication Bandwidth Calculator How long the backlog actually covers Redis Connection Pool Calculator More connections is not more throughput Redis Pipeline Calculator It removes round trips, not work Redis Cache Hit Rate Calculator 99% to 90% is ten times the backend load Redis Eviction Policy Simulator volatile- with no TTLs is noeviction Redis Cost Estimator Your rates, so nothing goes stale Redis Config File Generator A redis.conf with the reasons in it Redis ACL Generator A user that can do exactly one job Redis Maxmemory Config Generator The limit, and the headroom it needs Redis Persistence Config Generator How much you can afford to lose Redis Lua Script Generator Atomic, and short enough to stay that way Redis TLS Config Generator Encrypted, and the old port actually closed Redis Sentinel Config Generator Failover that can actually be authorised Redis Cluster Config Generator Three primaries, and the bus port open Redis Docker Compose Generator Local Redis that is not on the internet Redis Client Config Generator Timeouts on both sides, and a sane pool Redis MEMORY STATS Analyzer Which number actually matters Redis Bigkeys Output Analyzer Elements are not bytes Redis CLIENT LIST Analyzer Find the connection hurting you Redis LATENCY Report Analyzer An empty report may mean nothing was recorded Redis Keyspace Prefix Analyzer Which key family is growing Redis SET Command Builder A plain SET clears the TTL Redis ZRANGE Query Builder REV reverses the argument order Redis SCAN Iteration Planner COUNT is a hint, not a page size Redis Key Name Validator Legal is not the same as workable Redis Cluster Compatibility Checker Works now, breaks when you shard

Elsewhere on the site