4

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

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

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

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

例如:

今天增加:www.google.com >> 1
今天增加:www.google.com >> 2
今天增加:www.google.com >> 3
今天增加:www.yahoo.com >> 1
今天增加:www.yahoo.com >> 2

我如何让这些计数器在一天结束时过期?如果我做一个过期,它会重置计数器。

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

4

4 回答 4

7

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

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

HINCRBY 101021 www.google.com 1

一旦您不再想保留数据,您可以使用 DEL 命令删除一天的整个哈希 - 可能设置一个手动触发的脚本,为 1 到 2 个月之间的所有内容调用 DEL。

尽管我还没有尝试过,但在哈希上设置到期时间可能也会起作用 - 每天使用不同的密钥意味着您不会像使用“今天”密钥那样依赖于在精确时间发生的到期时间。

于 2010-10-21T00:45:06.627 回答
2

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

两者的原因是a)我存储超过一天和b)如果过期的密钥仍然存在,无论出于何种原因我在获取今天的统计信息时都没有查询它们。例如哈希值:带有键 YEAR:MONTH:DAY:URL 的 SERVER 递增,并且设置了今天+3 天的过期时间。奇迹般有效。

于 2010-11-19T20:19:53.283 回答
1

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

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)

这会将“昨晚的”价值列入清单。该列表可以选择修剪以存储最多一年的值。(这在做 60 分钟迷你图时非常有效)

于 2010-12-03T04:15:30.453 回答
0

一个更直接的选择是使用当前日期。我所做的是使用年月日作为键。但我没有使用哈希,而是通过将页面附加到日期作为键来简化问题。

例如:

INCR 20110425:www.google.com
 INCR 20110424:www.yahoo.com
...
INCR 20110426:www.google.com

为了使事后更容易检索信息,我在适当的情况下使用的另一种解决方案是将信息存储在排序集中。

例如:

$rank = ZRANK点击:www.google.com 20110425
 ZADD点击:www.google.com ($rank + 1) 20110425

使用此变体,您可以简单地询问以下内容以获取 www.google.com 的所有点击:

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

或者

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

或者

排序点击:www.google.com ...

希望这是一些帮助

于 2011-04-27T09:15:23.657 回答