2011-07-26 57 views
0

我试图建立一个系统,其中用户发布的所有链接以及他们的关注者点击都存储在redis中,以满足以下要求:Redis数据结构存储所有链接的所有点击

  1. 能够在一个时间范围内(可以是今天,本周,所有时间或自定义)获得(例如10%)大多数点击链接。

  2. 能够查询发布相同链接的所有用户。

  3. 由于我们已经使用了许多密钥,理想的是我们将所有这些存储在单个Redis密钥中。

  4. 如果需要,可以将值编码为JSON。

这里是我想出迄今:

-I使用一个Redis的哈希,每个字段都是一个小时,这样在一天,即哈希将包含24场。

- 在每一个领域,我从存储阵列编码与格式的JSON:

array("timestamp1" => array($url1, $url2, ...) 
    , "timestamp2" => array($url3, $url4, ...) 
    , ..., ...); 

-The完整的结构是这样的哈希:

[01/01/2010 00:00] => JSON(...), 
[01/01/2010 01:00] => JSON(...), 
.... 

这样一来,我可以得到所有的点击任何时间范围内的任何网址。

但是,我似乎无法重复使用此散列来获取发布该URL的所有用户。

现在的问题是:有没有更好的方法呢?

2011年7月30日更新:我正在存储分钟,小时,天,周,月和年在同一个散列。

所以,点击保存在许多领域一次: - 在该领域的分(格式YmdHi) - 在该领域的时间(格式YmdH) - 在现场为天(格式Ymd) - 在该字段中(格式为YW) - 在该月的字段中(格式为Ym) - 在该年的字段中(格式Y)。

这是方式,试图让一个具体的时间表时,我只能访问必要的字段withouth的通过时间循环。

例如,如果我需要从07/26/2011 20:00到07/28/2011 02:00点击,我只需要查询7个字段:2011年7月27日全天的1个字段,4场从20:00小时至23:00 07/26,以及从​​00:00至01:00小时07/28

回答

2

然后2个字段如果你放弃了第三个要求变得很容易。很多人似乎认为你应该总是使用散列而不是密钥,但是这是因为误解了关于在特定的有限环境中使用哈希来提高性能的帖子。

为了获得最被点击的链接,为每个小时或一天的有序set,取值为链接和得分是点击设置使用ZINCRBY。使用ZCARD和ZREVRANGEBYSCORE获得前10%。如果该集合包含系统中的所有链接,这是最简单的,但如果需要,还可以使用策略从集合中删除不太受欢迎的项目。

要让所有用户发布链接,请为每个链接存储一组用户。您可以使用JSON和链接的密钥或散列存储详细信息来完成此操作,但一组设置可以更新和查询。

+0

谢谢你,先生克拉克森! 如果每个小时使用有序集合,是否会有太多密钥? 1年的点击次数在Redis中需要8760个密钥。再加上系统中已经有数百万个密钥,这可能是过度的,是吗? 另外,我需要一个时间框架内的顶部被点击的链接。例如,“自上周以来获得10%的点击率最高的链接”。这将涉及访问许多有序集合。 – sntran

0

我建议使用一些水桶策略像哈希键或使链接的记录,以用户每月明智的,你没有对数据结构是如何巨大,可能增加的尺寸控制。将有数百万用户访问特定的链接。现在再次获得所有用户的详细信息,如果立即抛出,这将是没有用的。我相信可以做的事情是维护计数器或一些像当前状态一样的元数据,然后将存档存储保存在mem中。或去存储网格状的GemFire

相关问题