我在集群模式下使用Redis(6个节点,3个主节点和3个从节点),我使用SE.Redis,但是,不像往常一样支持在不同散列槽中具有多个键的命令
所以我使用HashTags来确保某个键属于使用{}
的特定散列槽。例如,我有两个键,如cacheItem:{1}
,cacheItem:{94770}
我设置这些键使用(每个键在一个单独的请求):
SEclient.Database.StringSet(key,value)
字符串
这个工作正常,
但现在我想查询属于多个哈希槽的key1和key2
SEclient.Database.StringGet(redisKeys);
型
上面的将失败并抛出异常,因为这些键属于多个散列槽
在查询键时,我不能确保我的键属于同一个哈希槽,这个例子只是2个键,我有数百个键,我想查询。
所以我有以下几个问题:
我如何查询多个键,当它们属于不同的哈希槽?什么是最好的做法呢?
我应该在我这边计算哈希槽,然后在每个哈希槽上发送单独的请求吗?
我可以在我的场景中使用TwemProxy吗?
任何帮助高度赞赏
2条答案
按热度按时间nafvub8i1#
我不能和SE.Redis说话,但你走在正确的道路上。你要么需要:
预计算需要你(或你的客户)预先知道集群拓扑(哈希槽所有者)和Redis键哈希方法(别担心,它很简单,而且有很好的文档记录)。
HASH_SLOT=CRC16 (key) mod 16384
。搜索一下,你可以找到任何语言的代码。请记住,使用哈希标签会使这变得更加复杂!参见:https://redis.io/commands/cluster-keyslot一些Redis集群客户端会通过内部魔法为你做这件事(例如Java中的Letterfly),但它们并不都是平等的。
还要注意的是,集群拓扑结构基本上可以随时更改,上述工作是复杂的。为了持久,如果你得到跨插槽错误,你需要重试。或者你可以只对单个键发出多个请求,因为它更容易维护。
qlzsbp2j2#
按哈希槽分组:
字符串
然后使用您最喜欢的批量命令处理每个keyGroup:
型