Quero usar operações com várias chaves em um cluster autoprojetado do Amazon ElastiCache (Redis OSS) com o modo de cluster ativado. Mas recebo o erro “CROSSSLOT Keys in request don’t hash to the same slot”.
Breve descrição
Você recebe o erro a seguir quando suas chaves não estão no mesmo slot de hash, mesmo estando armazenadas no mesmo nó:
“CROSSSLOT Keys in request don't hash to the same slot”
Para implementar operações com várias chaves em um cluster ElastiCache (Redis OSS) fragmento com o modo de cluster ativado, faça o hash das chaves no mesmo slot de hash.
Nos conjuntos de exemplos a seguir, “myset2” e “myset” estão no mesmo nó:
172.31.62.135:6379> scan 0
1) "0"
2) 1) "myset"
2) "myset2"
Mas uma operação com várias chaves não é suportada:
172.31.62.135:6379> SUNION myset myset2(error) CROSSSLOT Keys in request don't hash to the same slot
Essa operação não é suportada porque as chaves não estão no mesmo slot de hash. Os dois conjuntos estão em dois slots diferentes, 560 e 7967:
172.31.62.135:6379> CLUSTER KEYSLOT myset(integer) 560
172.31.62.135:6379> CLUSTER KEYSLOT myset2(integer) 7967
Resolução
Método 1
É possível usar uma biblioteca de cliente do Redis que fornece suporte para clusters do Redis com o modo de cluster ativado. Para obter mais informações, consulte a especificação do cluster Redis no site do Redis.
O exemplo a seguir usa redis-cli para obter chaves de slots localizados em fragmentos diferentes. Isso resulta em um erro CROSSSLOT:
redis-cli -c -h RedisclusterCfgEndpointRedisclusterCfgEndpoint:6379> mget key1 key2
(error) CROSSSLOT Keys in request don't hash to the same slot
Ao usar o redis-py-cluster para obter chaves de slots localizados em fragmentos diferentes, você recebe a saída correta:
>>> from rediscluster import RedisCluster>>> startup_nodes = [{"host": "RedisclusterCfgEndpoint", "port": "6379"}]
>>> rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True,skip_full_coverage_check=True)
>>> print(rc.mget("key1","key2"))
Método 2
Ao criar chaves para operações com várias chaves em um cluster que tem o modo de cluster ativado, force as chaves para o mesmo slot de hash. É possível usar hashtags para forçar as chaves a entrarem no mesmo espaço de hash. Quando a chave contém um {...} padrão, somente a substring entre as chaves, { e }, é criptografada para calcular o slot de hash.
Veja a seguir um exemplo de vários conjuntos com hash no mesmo slot de hash. As chaves {user1}:myset e {user1}:myset2 são codificadas no mesmo slot de hash. Somente o usuário1 é usado para calcular o slot de hash.
172.31.62.135:6379> CLUSTER KEYSLOT {user1}:myset(integer) 8106
172.31.62.135:6379> CLUSTER KEYSLOT {user1}:myset2
(integer) 8106
172.31.62.135:6379> SUNION {user1}:myset {user1}:myset2
1) "some data for myset"
2) "some data for myset2"
Depois de fazer o hash de ambos os conjuntos no mesmo slot de hash, é possível realizar uma operação com várias chaves.