redis - 在 Redis 上聚合值

标签 redis

我正在使用 Redis 来跟踪每个房间、每栋建筑的事件访问数量, 我需要以这样的层次结构显示它们。人们可以查看每个房间的所有事件,也可以缩小并获取每栋建筑的事件汇总。

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

请有人就存储访问事件并将其聚合到 Redis 上的架构和最佳方法提供建议。

例如,我的层次结构是 PRH:101:5、PRH:212:6,我希望能够有效地显示:101 (5)、212 (6) 和 PRH (11)。

最佳答案

我将把我的答案分成两部分,因为一些新的 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( future )

如果数字很大,并且是估计值,加上 0.81% 的标准误差是可以接受的,您可以使用高效的HYPERLOGLOG 结构/算法。请参阅PFCOUNT .

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

希望这对台湾有帮助

关于redis - 在 Redis 上聚合值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23035299/

相关文章:

python - 在 heroku 上部署时运行一次 python 脚本

redis - 如何获得 SMEMBERS 结果的子集?或者我应该为分数和成员使用具有相同值的 SortedSet 吗?

Redis集群/负载均衡

node.js - Tile38 Near by 查询 Node 回调函数不工作

docker - Redis 容器上的预期暴露端口无法访问,即使在绑定(bind)端口后也是如此

java - 内存中的 Scala/Java Redis

Redis 源代码在 macOS Mojave 上编译失败

hash - 使用redis排序集存储键值对

ruby-on-rails - 使用 devise-async 发送电子邮件不起作用 (Rails/Sidekiq)

spring - 什么是属性 management.health.redis.enabled 以及如何使用它?