在Redis中存储事件时间表

我想在Redis的时间表中存储事件列表。 我正在考虑自1970年以来的sorting集,以秒为单位进行评分,允许快速查找和范围search。

问题是,我希望每个事件代表一个对象,用几个键(大概3个也许),所以我会存储一个有序的一组ID – 应用程序然后将查找基于ID的哈希。

所以谈话会是这样的:

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

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

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

一个显而易见的解决scheme是按价值工作,而不是参照工作。 所以你的zset可以存储序列化的对象,而不是在这些对象上存储引用。 使用节点,JSON很容易使用。

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

HGETALL不支持可变参数(即只能检索一个哈希对象)。 但是Redis在处理stream水线命令方面非常擅长,由于节点的asynchronous特性,从node_redis驱动程序执行起来特别容易。 所以在你的例子中,你只需要2次往返:第一次执行ZRANGEBYSCORE,第二次执行所有的HGETALL命令(即在发出第二个HGETALL命令之前,不要等待第一个HGETALL命令的结果)。 这将是非常有效的。

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

你可以使用JSON.stringify()将对象串化并存储为一个string,然后用JSON.parse()