4

我试图弄清楚如何在 Redis 中处理我的数据结构。我想要完成的是如何使用两个参数计算事件,然后按日期查询 Redis 以获取该数据。这是一个示例:事件带有两个不同的参数,我们称它们为站点和事件类型,以及事件发生的时间。从那里,我将需要能够查询 Redis 以了解在某个日期范围内发生了多少事件,并按站点和事件类型分组在一起。

这是一个简短的示例数据集:

Oct 3, 2012:
   site A / event A
   site A / event A
   Site B / event A

Oct 4, 2012:
   site B / event B
   site A / event A
   Site B / event A

... 等等。

在我的查询中,我想知道该日期跨度内的事件总数,这将是五周的跨度。在上面的示例中,这将类似于:

   site A / event A ==> 3 events
   site B / event A ==> 2 events
   site B / event B ==> 1 event

我已经研究过使用 Redis 的 Sorted Set 功能、Hashes 等。似乎 Sorted Set 是最好的方法,但使用 Redis 的 ZUNIONSTORE 命令查询数据似乎不太合适,因为这些事件将持续五周。这使得 ZUNIONSTORE 命令至少有 35 个参数。

有任何提示、想法、想法等吗?

非常感谢你的帮助。

4

1 回答 1

5

与典型的 RDBMS 或 MongoDB 不同,Redis 没有可以使用的丰富查询语言。有了这样的商店,您可以在商店中积累原始数据,然后您可以使用查询来计算统计信息。Redis 不适应这种模式。

使用 Redis,您应该即时计算统计数据并直接存储它们而不是原始数据。

例如,假设我们只对几周内的统计数据感兴趣,我将按如下方式构建数据:

  • 因为所有的标准都是离散的,所以可以使用简单的散列对象来代替 zset

  • 每周一个哈希对象

  • 在每个散列对象中,每个站点、事件一个计数器。可选地,每个站点一个计数器,和/或每个事件一个计数器。

因此,当事件发生时,我会将以下命令通过管道传输到 Redis:

hincrby W32 site_A:event_A 1 
hincrby W32 site_A:* 1 
hincrby W32 *:event_A 1 

请注意,无需初始化这些计数器。如果它们不存在,HINCRBY 将创建它们(和散列对象)。

要检索一周的统计信息:

hgetall W32

在统计数据中,您拥有每个站点/事件、仅每个站点、仅每个事件的计数器。

要检索几周的统计信息,请使用以下命令:

hgetall W32
hgetall W33
hgetall W34
hgetall W35
hgetall W36

并在客户端执行聚合(如果语言支持关联数组,如地图、字典等,则非常简单......)。

于 2012-10-13T08:51:26.393 回答