首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >集群中的Redis Gears事件

集群中的Redis Gears事件
EN

Stack Overflow用户
提问于 2020-07-31 20:31:44
回答 1查看 140关注 0票数 1

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

代码语言:javascript
复制
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齿轮监听密钥操作来创建一个包含集群中所有密钥的集合,并将密钥名称存储在一个名为keys的redis集合中。

为此,我运行这个redis gears命令

代码语言:javascript
复制
RG.PYEXECUTE "GearsBuilder('KeysReader').foreach(lambda x: execute('sadd', 'keys', x['key'])).register(readValue=False)"

它可以工作,但前提是更新后的密钥存储在密钥keys的相同节点上

示例:

在我的集群配置中,关键字keys是store un node 91d426e9a569b1c1ad84d75580607e3f99658d30 (第一个节点)。

如果我运行:

代码语言:javascript
复制
SET foo bar
SET bar foo
SMEMBERS keys

我得到了以下结果:

代码语言:javascript
复制
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中。

是否可以将其他节点上的关键字名称与redis齿轮一起保存在keys集合中?

Redis版本: 6.0.6

Redis gears版本: 1.0.1

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-02 14:27:40

如果键被写到一个不包含‘key’键的分片中,你需要确保通过重新分区操作(https://oss.redislabs.com/redisgears/operations.html#repartition)将它移动到另一个分片中,所以这应该是有效的:

代码语言:javascript
复制
RG.PYEXECUTE "GearsBuilder('KeysReader').repartition(lambda x: 'keys').foreach(lambda x: execute('sadd', 'keys', x['key'])).register(readValue=False)"

重新分区操作会将记录移动到正确的分片,'sadd‘将会成功。

另一种选择是为每个分片维护一个集合,并使用另一个Gear函数收集它们。为此,您需要使用散列标签函数(https://oss.redislabs.com/redisgears/runtime.html#hashtag)来确保创建的集合属于当前分片。因此,下面的注册将为每个分片维护一个集合:

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

请注意,同步模式告诉RedisGears不要启动分布式执行,以这种方式跟随键应该会快得多。

然后收集所有的值:

代码语言:javascript
复制
RG.PYEXECUTE "GB('ShardsIDReader').flatmap(lambda x: execute('smembers', 'keys{%s}' % hashtag())).run()"

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63191884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档