node.js - 在 Redis 中存储事件时间线

标签 node.js data-structures redis sortedset

我想在 Redis 的时间轴中存储事件列表。我正在考虑一个以 1970 年以来的秒数作为分数的排序集,允许快速查找和范围搜索。

问题是我希望这些事件中的每一个都代表一个对象,带有几个键(可能大约 3 个),所以我将存储一组排序的 ID - 然后应用程序将根据 ID 查找散列.

所以对话会是这样的:

> ZRANGEBYSCORE events start end 
1) "16"
2) "17"
> HGETALL events:16
1) "key1"
2) "val1"
...
> HGETALL events:17
...

有没有更好的方法来组织或做一些事情来避免应用程序为每个结果单独调用。是否可以在 redis-server 端完成一切以避免这种开销?这甚至是一个大问题吗?

附言。我正在使用 Node 客户端,但我的问题也适用于其他语言。

最佳答案

一个明显的解决方案是按值工作而不是按引用工作。因此,您的 zset 可以存储序列化对象,而不是存储对这些对象的引用。使用 Node ,JSON 很容易使用。

现在,如果您需要保留当前结构(因为例如您的一些对象由各种 zset 共享),那么您需要考虑 rountrips 而不是命令。 Redis 中昂贵的是往返,而不是 O(1) 命令本身的执行。

HGETALL 不支持可变参数(即您只能检索一个哈希对象)。但是 Redis 非常擅长处理流水线命令,由于 node 的异步特性,这在 node_redis 驱动程序中特别容易做到。因此,在您的示例中,您只需要两次往返:第一次执行 ZRANGEBYSCORE,第二次执行所有 HGETALL 命令(即,在发出第二个命令之前不要等待第一个 HGETALL 命令的结果)。这将非常有效。

对于当前的 Redis 版本 (2.4),无法消除第二次往返。

关于node.js - 在 Redis 中存储事件时间线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8672943/

相关文章:

node.js - 如何使用同一 Twitter 应用程序对来自一个域的多个主机名进行 Twitter 身份验证?

node.js - Dialogflow - 多个代理。添加响应 (nodejs)

javascript - 如何使用 native JavaScript 合并数组内的对象

javascript 相当于 java 的 Map.getKey()

node.js - session 更新不会在请求之间持续存在 - nodejs/expressjs/redis/heroku

javascript - 如何模拟 Node redis模块的createClient方法

javascript - 你如何通过npx而不是npm start运行electronjs?

algorithm - 如何在线性时间内构建后缀树?

phpredis 错误在 Linux 中找不到类 Redis

redis - 当您不在 Redis 中取消监视 WATCH 的键时会发生什么