使用Redis中的多个键和日期计数/查询事件

and*_*gle 4 redis

我正在试图弄清楚如何在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
Run Code Online (Sandbox Code Playgroud)

... 等等.

在我的查询中,我想知道日期跨度的事件总数,这将是五周的跨度.在上面的例子中,这将是这样的:

   site A / event A ==> 3 events
   site B / event A ==> 2 events
   site B / event B ==> 1 event
Run Code Online (Sandbox Code Playgroud)

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

任何提示,想法,想法等?

非常感谢你的帮助.

Did*_*zia 5

与典型的RDBMS或MongoDB相反,Redis没有您可以使用的丰富查询语言.使用此类存储,您可以在存储中累积原始数据,然后可以使用查询来计算统计信息.Redis不适应这种模式.

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

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

  • 因为所有的critera都是离散的,所以可以使用简单的哈希对象而不是zsets

  • 每周一个哈希对象

  • 在每个哈希对象中,每个夫妇站点一个计数器,事件.可选地,每个站点一个计数器,和/或每个事件一个计数器.

因此,当事件发生时,我会将以下命令传递给Redis:

hincrby W32 site_A:event_A 1 
hincrby W32 site_A:* 1 
hincrby W32 *:event_A 1 
Run Code Online (Sandbox Code Playgroud)

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

要检索一周的统计信息:

hgetall W32
Run Code Online (Sandbox Code Playgroud)

在统计信息中,每个站点/事件的计数器,仅限每个站点,仅限每个事件.

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

hgetall W32
hgetall W33
hgetall W34
hgetall W35
hgetall W36
Run Code Online (Sandbox Code Playgroud)

并在客户端执行聚合(如果语言支持关联数组,如map,dictionary等,则非常简单).