【问题标题】:Redis Gears events in cluster集群中的 Redis Gears 事件
【发布时间】:2020-08-02 15:21:08
【问题描述】:

我有一个 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 齿轮监听键操作来创建一个包含集群中所有键的集合,并将键名称存储在名为 keys 的 redis 集合中。

为了做到这一点,我运行了这个 redis gears 命令

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

它有效,但前提是更新的密钥存储在密钥keys的同一节点上

例子:

在我的集群配置中,键 keys 是 store un node 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 齿轮设置?

Redis 版本:6.0.6

Redis 齿轮版本:1.0.1

谢谢。

【问题讨论】:

    标签: redis redis-cluster redisgears


    【解决方案1】:

    如果密钥被写入不包含“密钥”密钥的分片,您需要确保通过重新分区操作 (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'会成功。

    另一种选择是为每个分片维护一个集合,并使用另一个 Gear 功能收集它们。为此,您需要使用主题标签函数 (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)"
    

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

    然后收集所有的值:

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

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

    【讨论】:

    • 非常感谢它有效。补充信息:对于自建集群,您需要运行 RG.REFRESHCLUSTER 命令。否则向 RG.PYEXECUTE 的注册不会传播到其他节点。
    猜你喜欢
    • 1970-01-01
    • 2015-08-26
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 2020-02-24
    • 1970-01-01
    • 2020-07-01
    相关资源
    最近更新 更多