我想在Redis的时间轴中存储一系列事件。我正在考虑将自1970年以来的秒数作为分数的排序集,允许快速查找和范围搜索。
问题是我希望每个事件都代表一个对象,带有几个键(大约3个),所以我会存储一组有序的ID - 然后应用程序会根据ID查找哈希值。
所以谈话会像这样:
> ZRANGEBYSCORE events start end
1) "16"
2) "17"
> HGETALL events:16
1) "key1"
2) "val1"
...
> HGETALL events:17
...
是否有更好的方法来组织或执行避免应用程序为每个结果单独调用的事情。可以在redis服务器端完成所有工作以避免这种开销吗?它甚至是一个大问题吗?
PS。我正在使用节点客户端,但我的问题也适用于其他语言。
答案 0 :(得分:2)
一个显而易见的解决方案是按值工作而不是通过引用工作。因此,您的zset可以存储序列化对象,而不是将引用存储在这些对象上。使用节点,JSON易于使用。
现在,如果你需要保留当前结构(因为你的某些对象是由各种zset共享的),那么你需要考虑rountrips而不是命令。 Redis的代价是往返,而不是O(1)命令本身的执行。
HGETALL不支持可变参数(即您只能检索一个哈希对象)。但Redis非常擅长处理流水线命令,由于节点的异步特性,这在node_redis驱动程序中尤其容易。因此在您的示例中,您只需要2次往返:第一次执行ZRANGEBYSCORE,第二次执行所有HGETALL命令(即,在发出第二个HGETALL命令之前不要等待第一个HGETALL命令的结果)。这将非常有效。
使用当前的Redis版本(2.4),无法消除第二次往返。
答案 1 :(得分:1)
您可以对对象进行字符串化并将其存储为JSON.stringify()
的字符串,然后使用JSON.parse()