Redis页面计数器

时间:2013-11-03 01:52:54

标签: python redis flask redis-py

我正在编写一个烧瓶应用程序,它将计算来自多个网站的页面浏览量。我决定使用Redis和Redispy,但我很难决定如何构建。最初我试图有这样的东西

redis.set("date:YYYYMMDD:site:sitename", 1)

我希望能够按日期或网站名称查询并显示计数值。我尝试使用.keys按日期或网站名称进行查询,但REDIS文档说要避免使用密钥 所以我想也许我可以使用redis哈希:

redis.hset("date:YYYYMMDD", "site", "sitename")
redis.hset("counter", 1)

最终,我希望能够按站点名称,按日期在站点计数器上运行报告,或显示所有日期的所有值。我似乎找不到合适的结构让我得到我想要的东西。

任何建议都将不胜感激!我之前没有使用过REDIS。

2 个答案:

答案 0 :(得分:1)

对于如上所述的整体递增计数器,this answer行的结构将是一种经过验证的方法。给出的答案有更详细的信息,可以使用排序集来计算时间序列数据。它甚至还有滚动数据的方法(也许您还想报告月度数据)。

如果您的示例似乎表明您的解决方案是每天,那么将数据存储在键中的网站/域名的排序集中并使用每日时间戳[ZINCRBY][2]的结构将很好地为您服务。

关于keys ......不要。根本就不要。

作为替代方案,您设置在使用域名/网站名称作为标识符时存储密钥。每当您为站点/域名运行ZINCRBY时,也会对SADD等“索引键”执行sites-with-traffic:YYYY:MM:DD操作。这样,您可以在当天拉出一组独特的网站,并从那里为每个网站构建查询。

在您的描述中,您说您可能想要在特定日期报告。使用Redis执行此操作的方法是简单地查询密钥数据是否存在。如果你什么也得不回来,那段时间的流量就是0.当你有一组参数时不要查询 - 使用它们。您列出的可能未知的这些查询模式中唯一一个是前面提到的站点/域名,并将这些添加到集合中解决了这种需要。

答案 1 :(得分:0)

对于计数,您可以使用incr/decr命令

http://redis.io/commands/incr

当您收到访问权限时,请按以下方式递增计数器:

  > incr counter:site2:20131101
  (integer) 1
  > incr counter:site1:20131103
  (integer) 1
  > incr counter:site1:20131103
  (integer) 2
  > incr counter:site2:20131103
  (integer) 1

当您查询计数器时,首先获取所有密钥,然后总结您应用中的所有计数器。

  > keys counter:site2:* # query by site
  1) "counter:site2:20131101"
  2) "counter:site2:20131103"
  > get "counter:site2:20131101"
  "1"
  > get "counter:site2:20131103"
  "1"
  > keys counter:*:20131103 # query by date
  1) "counter:site1:20131103"
  2) "counter:site2:20131103"
  ...