26

我希望能够在我的 redis 集合中进行任何更改时运行回调。回调将键和值作为输入。这样的事情可能吗?

谢谢?

4

5 回答 5

28

更新:无论谁在读这篇文章——这些都是古老的答案,请忽略它们。您需要的是已经存在多年的 Redis Keyspace Notifications。见https://redis.io/topics/notifications

于 2012-05-20T20:57:22.520 回答
17

两种选择:

  1. 使用MONITOR命令 - 它跟踪到达 Redis 的每个命令,您可以分析并查看何时触及您的集合。

  2. 如果您“拥有”写入集合的代码,请向您的其他代码(您的回调)发出信号。您可以为此使用Redis Pub/Sub频道。

编辑Redis 实际上将在 2.8 版本中实现此功能。请参阅 Antirez 的博客文章:Redis 键空间更改通知系统

于 2012-05-20T20:56:10.173 回答
12

您还可以使用同步命令像追随者一样连接到 Redis 服务器。查看Redis 复制的工作原理?快速介绍。

同步命令的输出有两个阶段。在第一阶段,服务器返回数据库 dump.rdb 文件。一旦文件发送完毕,它就开始在 Redis 协议中发送命令,该协议也是 AOF 格式。

这是您可以做什么的高级图片:

  1. 连接到 Redis 服务器并发出SYNC命令
  2. 保存并解析 dump.rdb 文件。构建初始数据集。基于 node.js的rdb 解析器可用
  3. 解析后面的命令。由于它们采用 Redis 协议,因此您可以从现有的 Redis 库开始。
  4. 对于您收到的每个命令,调用回调

看起来工作量很大,但你应该能够很容易地破解它。它也将成为一个很好的开源库!

编辑:同步 v/s 监视器

  1. Monitor是一个调试命令。响应格式可以(并且已经)随着时间而改变(d)。Sync用于Master -> Slave的复制,所以会得到更好的支持
  2. Monitor将发出所有命令,包括只读命令。Sync只会让你修改数据的命令。
  3. Monitor将记录在 lua 脚本中执行的各个命令。Sync只会传输整个lua脚本,所以你必须自己解析脚本。这确实是一个交易破坏者sync
  4. Monitor将记录不成功的Sync命令,只记录修改数据的命令。例如,该命令del non-existing-key将由监视器记录,但在您运行同步时不会显示。
于 2012-05-21T02:48:38.400 回答
5

2017年

现在有一个可以与node-redis模块一起使用的发布/订阅机制。请参阅此处的特定文档。(也适用redis-mock于测试)

您可以有多个订阅者(听众)到同一个频道,在您的情况下,这将是您收藏的关键。

快速示例:(有关实施细节,请参阅上述文档)

sub.subscribe('myCollection');
sub.on('message', (channel, data) => {
    // this is the callback you talked about
    console.log(`${channel} is now ${data}`);
});

// ... later on ...

pub.publish('myCollection', [1,2,3])
// console will output:
// myCollection is now [1,2,3]
于 2017-08-18T16:32:16.470 回答
0
<dependency>
    <groupId>com.moilioncircle</groupId>
    <artifactId>redis-replicator</artifactId>
    <version>2.5.0</version>
</dependency>

如果您使用的是 java. redis-replicator实现redis复制协议。更多细节请参考参考资料

于 2017-03-06T14:00:29.363 回答