在Redis上聚合值

时间:2014-04-12 19:46:36

标签: redis

我正在使用Redis来跟踪每个房间,每栋楼的事件访问次数, 我需要在这样的层次结构中显示它们。您可以查看每个房间的所有活动,但也可以缩小并获得每个建筑物的活动总数。

每栋建筑都有唯一的名称,例如:公屋和大楼内的每个房间都有一个独特的号码,例如101,212。

有人请告知架构和最佳方法来存储访问事件并在Redis上聚合它们。

例如,我的等级是PRH:101:5,PRH:212:6,我希望能够有效地显示:101(5),212(6)和PRH(11)。

1 个答案:

答案 0 :(得分:2)

我将我的答案分成两部分,因为一些新的Redis功能即将发布,但尚未发布。

Redis 2.8.8及更早版本

使用Hash Set redis数据类型,HINCRBYHGET

递增计数器时,请执行以下操作:

HINCRBY building PRH 1
HINCRBY room:PRH 101 1
# The hash set nor the member doesn't have to exist beforehand.
# If you need atomicity, bundle these commands in a Lua script. Parameterized, avoid Lua SHA1 changes to minimize Lua server-side mem usage.
# Alternative for atomicity: use MULTI+EXEC

在几个增量之后,您可以在两个级别进行查询:

HGET building PRH 
# this gives you after 10 increments: PRH=10


HGET room:PRH 101
# this gives you after 5 increments to this room: PRH:101=5

Redis 2.9.x(未来)

如果数字很大,并且它与估算相关,标准误差为0.81%是可以接受的,那么您可以使用高效的HYPERLOGLOG结构/算法。请参阅PFCOUNT

如果您想使用范围与词典排序/查询相结合,请查看ZRANGEBYLEX

希望这有帮助,TW