6

似乎,这是常见的任务,但我还没有找到解决方案。

我需要计算过去 24 小时内用户的事件数(例如,他留下了多少评论)。旧数据对我来说不感兴趣,因此应该从 Redis 中删除有关一个月前添加的评论的信息。

现在我只看到一种解决方案。我们可以制作包含用户 ID 和时间的键,增加它的值。然后我们将得到 24 个值并计算它们的总和。每个密钥都有 24 小时的有效期。

例如,

  1. 6 月 22 日 13:27 的事件 -> 创建密钥 _22_13 = 1
  2. 6 月 22 日 13:40 的事件 -> 递增键 _22_13 = 2
  3. 事件发生在 6 月 22 日 18:45 -> 创建密钥 _22_18 = 1
  4. 6 月 23 日 16:00 的事件 -> 创建密钥 _23_16 = 1
  5. 在 6 月 23 日 16:02 获取事件总和 -> 密钥总和 _22_17 - _22_23、_23_00 - _23_16:在我们的密钥中,只有 _22_18 和 _23_16,结果为 2。密钥 _22_13 和 _22_13 已过期。

这种方法不准确(它计算每 24+0..1 小时的事件数)并且不是那么普遍(如果我需要每过去 768 分钟或 2.5 个月的事件数,我将选择什么键?)。

您对 Redis 数据类型有更好的解决方案吗?

4

2 回答 2

4

你的模型看起来不错。当然,它不是通用的,但它是你必须牺牲的东西才能表现出色。

我建议你继续这样做。如果您需要另一个报告时间跨度(768 分钟),您始终可以从存储您的评论的 mysql 中获取此信息(您这样做,对吗?)。这会更慢,但至少会提供查询。

如果您需要更快的响应或更高的精度,您可以将计数器以分钟分辨率(每分钟一个计数器)存储在 redis 中。

于 2012-06-22T11:06:50.643 回答
-1

您可以在每次创建密钥后使用 redis EXPIRE 查询。

SET comment "Hello, world"
EXPIRE comment 1000 // in seconds
PEXPIRE comment 1000 // in milliseconds

详情在这里

于 2012-06-22T10:54:49.847 回答