Redis追踪点击率
我有一个简单的每日点击计数器在我的网站上,我想使用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,则会重置计数器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 >>
我觉得我的思维过程已经结束了。我是在倒退吗?您需要使用当前日期作为键,而不是“今天” 为当前日期设置哈希,每个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命令并不像我最初想象的那么好,我可以按照您的建议在密钥过时时删除它们。