在集群模式下查询Redis中的多个键

qlvxas9a  于 7个月前  发布在  Redis
关注(0)|答案(2)|浏览(91)

我在集群模式下使用Redis(6个节点,3个主节点和3个从节点),我使用SE.Redis,但是,不像往常一样支持在不同散列槽中具有多个键的命令
所以我使用HashTags来确保某个键属于使用{}的特定散列槽。例如,我有两个键,如cacheItem:{1}cacheItem:{94770}
我设置这些键使用(每个键在一个单独的请求):

SEclient.Database.StringSet(key,value)

字符串
这个工作正常,
但现在我想查询属于多个哈希槽的key1和key2

SEclient.Database.StringGet(redisKeys);


上面的将失败并抛出异常,因为这些键属于多个散列槽
在查询键时,我不能确保我的键属于同一个哈希槽,这个例子只是2个键,我有数百个键,我想查询。
所以我有以下几个问题:
我如何查询多个键,当它们属于不同的哈希槽?什么是最好的做法呢?
我应该在我这边计算哈希槽,然后在每个哈希槽上发送单独的请求吗?
我可以在我的场景中使用TwemProxy吗?
任何帮助高度赞赏

nafvub8i

nafvub8i1#

我不能和SE.Redis说话,但你走在正确的道路上。你要么需要:

  • 对每个键进行单独的请求,以确保它们到达正确的集群节点,或者...
  • 预先计算每个密钥所属的分片+服务器,按主机分组。然后将带有这些密钥的MGET请求发送给拥有它们的每个主机

预计算需要你(或你的客户)预先知道集群拓扑(哈希槽所有者)和Redis键哈希方法(别担心,它很简单,而且有很好的文档记录)。

  • 你可以从Redis中查询集群信息来获得拥有的插槽。
  • 基本的哈希算法是HASH_SLOT=CRC16 (key) mod 16384。搜索一下,你可以找到任何语言的代码。请记住,使用哈希标签会使这变得更加复杂!参见:https://redis.io/commands/cluster-keyslot

一些Redis集群客户端会通过内部魔法为你做这件事(例如Java中的Letterfly),但它们并不都是平等的。
还要注意的是,集群拓扑结构基本上可以随时更改,上述工作是复杂的。为了持久,如果你得到跨插槽错误,你需要重试。或者你可以只对单个键发出多个请求,因为它更容易维护。

qlzsbp2j

qlzsbp2j2#

按哈希槽分组:

var keyList = keys.GroupBy(k => _redisConnection.GetHashSlot(k));

字符串
然后使用您最喜欢的批量命令处理每个keyGroup:

foreach (var keyGroup in keyList)
{

相关问题