Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redis追踪点击率_Redis - Fatal编程技术网

Redis追踪点击率

Redis追踪点击率,redis,Redis,我有一个简单的每日点击计数器在我的网站上,我想使用Redis作为数据存储 仅仅因为redis有一个expire,我不必设置cron来清除数据。另外,我想尝试一下 我以URL为基础存储每日点击量 如何存储url的每日点击量,然后让它们在一天结束时过期 例如: incr today:www.google.com >> 1 incr today:www.google.com >> 2 incr today:www.google.com >>

我有一个简单的每日点击计数器在我的网站上,我想使用Redis作为数据存储

仅仅因为redis有一个expire,我不必设置cron来清除数据。另外,我想尝试一下

我以URL为基础存储每日点击量

如何存储url的每日点击量,然后让它们在一天结束时过期

例如:

incr today:www.google.com >> 1 incr today:www.google.com >> 2 incr today:www.google.com >> 3 incr today:www.yahoo.com >> 1 incr today:www.yahoo.com >> 2 今日增量:www.google.com>>1 今日增量:www.google.com>>2 今日增量:www.google.com>>3 今日增量:www.yahoo.com>>1 今日增量:www.yahoo.com>>2 如何让这些计数器在一天结束时过期? 如果执行expire,则会重置计数器


我觉得我的思维过程已经结束了。我是在倒退吗?

您需要使用当前日期作为键,而不是“今天”

为当前日期设置哈希,每个url都是该哈希中的一个键。您的更新将是

HINCRBY 101021 www.google.com 1

一旦你不再想保留数据,你可以使用DEL命令删除整个散列一天——也许可以设置一个手动触发的脚本,为1到2个月之间的所有内容调用DEL


虽然我没有尝试过,但在散列上设置到期也可能会起作用-每天使用不同的键意味着您不会像使用“today”键一样依赖于在精确的时间发生到期。

另一种选择是使用redis>=2.1.3。从该版本开始,expire按您想要的方式工作。我使用2.1.5(来自git)来做同样的事情。我使用expire和类似于Tom描述的方法。我将日期放在键中,并设置了过期日期。使用redis>=2.1.3,您可以在递增键上设置expire,而无需重置计数器


这两个原因都是a)我存储了不止一天,b)如果过期的密钥仍然存在,无论出于什么原因,我在获取今天的统计数据时不会查询它们。例如,密钥为YEAR:MONTH:DAY:URL的hash:SERVER将递增,并将过期时间设置为今天+3天。工作起来很有魅力。

我最近在我的应用程序中内置了分析解决方案:

incr www.google.com 1
然后每晚,在cron作业中:

getset www.google.com 0
getset以原子方式返回该值并将其设置为新值,这将重置计数器而不会丢失一次命中

我还碰巧:

lpush yearly:www.google.com <value from getset>
ltrim yearly:www.google.com 0 364 (this is optional)
lpush年度:www.google.com
ltrim年度:www.google.com 0 364(这是可选的)

这会将“昨晚的”值放入列表中。可以选择对列表进行修剪,以存储最多一年的值。(这在制作60分钟的迷你图时非常有效)

一个更简单的选择是,使用当前日期。我所做的是使用年-月-日作为键。但我没有使用散列,而是通过将页面作为键添加到日期来简化问题

例如:

INCR 20110425:www.google.com INCR 20110424:www.yahoo.com ... INCR 20110426:www.google.com $rank = ZRANK hits:www.google.com 20110425 ZADD hits:www.google.com ($rank + 1) 20110425 INCR 20110425:www.google.com INCR 20110424:www.yahoo.com ... INCR 20110426:www.google.com 为了便于以后检索信息,我在适当的情况下使用的另一种解决方案是将信息存储在排序集中

例如:

INCR 20110425:www.google.com INCR 20110424:www.yahoo.com ... INCR 20110426:www.google.com $rank = ZRANK hits:www.google.com 20110425 ZADD hits:www.google.com ($rank + 1) 20110425 $rank=ZRANK点击率:www.google.com 20110425 ZADD点击:www.google.com($rank+1)20110425 使用此变体,您可以简单地要求以下人员获取www.google.com的所有点击率:

ZRANGE hits:www.google.com 0 -1 ZRANGE点击:www.google.com 0-1 或

ZREVRANGE点击率:www.google.com 0-1 或

排序点击:www.google.com。。。
希望这是一些帮助

遗憾的是,我能想到的所有解决方案都至少需要一个脚本和Cron-无法告诉Redis在内置的密钥过期时执行操作。我认为您对当前日期的看法是正确的。这意味着我可以存储每天的所有数据,也可以存储月份和年份的数据。此外,EXPIRE命令并不像我最初想象的那么好,我可以按照您的建议在密钥过时时删除它们。