我正在编写一个烧瓶应用程序,它将计算来自多个网站的页面浏览量。我决定使用Redis和Redispy,但我很难决定如何构建。最初我试图有这样的东西
redis.set("date:YYYYMMDD:site:sitename", 1)
我希望能够按日期或网站名称查询并显示计数值。我尝试使用.keys按日期或网站名称进行查询,但REDIS文档说要避免使用密钥 所以我想也许我可以使用redis哈希:
redis.hset("date:YYYYMMDD", "site", "sitename")
redis.hset("counter", 1)
最终,我希望能够按站点名称,按日期在站点计数器上运行报告,或显示所有日期的所有值。我似乎找不到合适的结构让我得到我想要的东西。
任何建议都将不胜感激!我之前没有使用过REDIS。
答案 0 :(得分:1)
对于如上所述的整体递增计数器,this answer行的结构将是一种经过验证的方法。给出的答案有更详细的信息,可以使用排序集来计算时间序列数据。它甚至还有滚动数据的方法(也许您还想报告月度数据)。
如果您的示例似乎表明您的解决方案是每天,那么将数据存储在键中的网站/域名的排序集中并使用每日时间戳[ZINCRBY][2]
的结构将很好地为您服务。
关于keys
......不要。根本就不要。
作为替代方案,您设置在使用域名/网站名称作为标识符时存储密钥。每当您为站点/域名运行ZINCRBY
时,也会对SADD
等“索引键”执行sites-with-traffic:YYYY:MM:DD
操作。这样,您可以在当天拉出一组独特的网站,并从那里为每个网站构建查询。
在您的描述中,您说您可能想要在特定日期报告。使用Redis执行此操作的方法是简单地查询密钥数据是否存在。如果你什么也得不回来,那段时间的流量就是0.当你有一组参数时不要查询 - 使用它们。您列出的可能未知的这些查询模式中唯一一个是前面提到的站点/域名,并将这些添加到集合中解决了这种需要。
答案 1 :(得分:0)
对于计数,您可以使用incr/decr
命令
当您收到访问权限时,请按以下方式递增计数器:
> 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" ...