summaryrefslogtreecommitdiff
path: root/redis/crc.py
diff options
context:
space:
mode:
Diffstat (limited to 'redis/crc.py')
-rw-r--r--redis/crc.py24
1 files changed, 24 insertions, 0 deletions
diff --git a/redis/crc.py b/redis/crc.py
new file mode 100644
index 0000000..7d2ee50
--- /dev/null
+++ b/redis/crc.py
@@ -0,0 +1,24 @@
+from binascii import crc_hqx
+
+# Redis Cluster's key space is divided into 16384 slots.
+# For more information see: https://github.com/redis/redis/issues/2576
+REDIS_CLUSTER_HASH_SLOTS = 16384
+
+__all__ = [
+ "key_slot",
+ "REDIS_CLUSTER_HASH_SLOTS"
+]
+
+
+def key_slot(key, bucket=REDIS_CLUSTER_HASH_SLOTS):
+ """Calculate key slot for a given key.
+ See Keys distribution model in https://redis.io/topics/cluster-spec
+ :param key - bytes
+ :param bucket - int
+ """
+ start = key.find(b"{")
+ if start > -1:
+ end = key.find(b"}", start + 1)
+ if end > -1 and end != start + 1:
+ key = key[start + 1: end]
+ return crc_hqx(key, 0) % bucket