redis装备集群中的事件

qybjjes1  于 2021-06-10  发布在  Redis
关注(0)|答案(1)|浏览(372)

我有一个redis集群,配置如下:

91d426e9a569b1c1ad84d75580607e3f99658d30 127.0.0.1:7002@17002 myself,master - 0 1596197488000 1 connected 0-5460
9ff311ae9f413b48578ff0519e97fef2ced57b1e 127.0.0.1:7003@17003 master - 0 1596197490000 2 connected 5461-10922
4de4d36b968bd0b5b5dc8023cb00a5a2ab62effc 127.0.0.1:7004@17004 master - 0 1596197492253 3 connected 10923-16383
a32088043c31c5d3f20828bfe06306b9f0717635 127.0.0.1:7005@17005 slave 91d426e9a569b1c1ad84d75580607e3f99658d30 0 1596197490251 1 connected
b5e9ec7851dfd8dc5ab0cf35c230a0e716dd934c 127.0.0.1:7006@17006 slave 9ff311ae9f413b48578ff0519e97fef2ced57b1e 0 1596197489000 2 connected
a34cc74321e1c75e4cf203248bc0883833c928c7 127.0.0.1:7007@17007 slave 4de4d36b968bd0b5b5dc8023cb00a5a2ab62effc 0 1596197492000 3 connected

我想通过监听redis gears的键操作来创建一个包含集群中所有键的集合,并将键名存储在一个名为 keys .
为此,我运行redis gears命令

RG.PYEXECUTE "GearsBuilder('KeysReader').foreach(lambda x: execute('sadd', 'keys', x['key'])).register(readValue=False)"

它可以工作,但前提是更新的密钥存储在密钥的同一节点上 keys 例子:
在我的集群配置中 keys 是存储un节点 91d426e9a569b1c1ad84d75580607e3f99658d30 (第一个节点)。
如果我跑:

SET foo bar
SET bar foo
SMEMBERS keys

结果如下:

127.0.0.1:7002> SET foo bar
-> Redirected to slot [12182] located at 127.0.0.1:7004
OK
127.0.0.1:7004> SET bar foo
-> Redirected to slot [5061] located at 127.0.0.1:7002
OK
127.0.0.1:7002> SMEMBERS keys
1) "bar"
2) "keys"
127.0.0.1:7002>

第一个关键字名称 foo 未保存在集合中 keys .
是否可以将其他节点上的键名保存在 keys 配备redis gears?
redis版本:6.0.6
redis gears版本:1.0.1
谢谢。

bvhaajcl

bvhaajcl1#

如果密钥被写入不包含“keys”密钥的shard,则需要确保通过重新分区操作将其移动到另一个shard(https://oss.redislabs.com/redisgears/operations.html#repartition),所以这应该起作用:

RG.PYEXECUTE "GearsBuilder('KeysReader').repartition(lambda x: 'keys').foreach(lambda x: execute('sadd', 'keys', x['key'])).register(readValue=False)"

重新分区操作将把记录移动到正确的分片,并且“sadd”将成功。
另一个选择是维持一套每个碎片和收集他们使用另一个齿轮功能。为此,需要使用hashtag函数(https://oss.redislabs.com/redisgears/runtime.html#hashtag)以确保创建的集属于当前碎片。因此,以下注册将为每个碎片保留一个集:

RG.PYEXECUTE "GearsBuilder('KeysReader').foreach(lambda x: execute('sadd', 'keys{%s}' % hashtag(), x['key'])).register(mode='sync', readValue=False)"

请注意,sync模式告诉redisgears不要开始分布式执行,这样按键应该快得多。
然后收集所有值:

RG.PYEXECUTE "GB('ShardsIDReader').flatmap(lambda x: execute('smembers', 'keys{%s}' % hashtag())).run()"

第一种方法适用于读密集型用例,第二种方法适用于写密集型用例。根据您的用例,您需要选择正确的方法。

相关问题