我正在使用 Redis 来跟踪每个房间、每栋建筑的事件访问数量, 我需要以这样的层次结构显示它们。人们可以查看每个房间的所有事件,也可以缩小并获取每栋建筑的事件汇总。
每座建筑物都有独特的名称,例如公屋和大楼内的每个房间都有一个唯一的编号,例如101、212。
请有人就存储访问事件并将其聚合到 Redis 上的架构和最佳方法提供建议。
例如,我的层次结构是 PRH:101:5、PRH:212:6,我希望能够有效地显示:101 (5)、212 (6) 和 PRH (11)。
最佳答案
我将把我的答案分成两部分,因为一些新的 Redis 功能即将发布,但尚未稳定。
Redis 2.8.8 及更早版本
使用Hash Set
redis 数据类型以及HINCRBY
和HGET
当增加计数器时,执行以下操作:
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( future )
如果数字很大,并且是估计值,加上 0.81% 的标准误差是可以接受的,您可以使用高效的HYPERLOGLOG
结构/算法。请参阅PFCOUNT
.
如果您想将范围与字典排序/查询结合使用,请查看 ZRANGEBYLEX
希望这对台湾有帮助
关于redis - 在 Redis 上聚合值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23035299/