Redis数据结构存储所有链接的所有点击



我试图建立一个系统,其中所有的链接张贴的用户和点击他们的追随者都存储在redis这样一种方式,满足以下要求:

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

  2. 可以查询发布同一链接的所有用户

  3. 由于我们已经使用了许多键,理想的情况是我们将所有这些都存储在一个Redis键中。

  4. 可以根据需要将值编码为JSON

到目前为止我写的是:

-I使用单个Redis哈希,每个字段都是单个小时,所以在一天内,该哈希将包含24个字段。

在每个字段中,我存储了一个从数组编码的JSON,格式为:

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

-完整的结构是:

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

这样,我可以在任何时间范围内获得任何URL的所有点击。

然而,我似乎不能重用这个哈希来获取所有发布URL的用户。

问题是:有没有更好的办法?

更新于2011年7月30日:我目前在相同的散列中存储分钟,小时,日,周,月和年。

因此,一次点击存储在许多字段中:-在字段中为分钟(格式为YmdHi)-在字段中以小时表示(格式为YmdH)-当天在现场(格式为Ymd)-在现场的一周(格式YW)-在月份的字段中(格式为Ym)-在字段中表示年份(格式为Y)。

这样,当试图获得一个特定的时间框架时,我只能访问必要的字段,而不循环小时。

例如,如果我需要从2011年7月26日20:00到2011年7月28日02:00的点击,我只需要查询7个字段:1个字段表示2011年7月27日的全天,4个字段表示7月26日20:00到23:00的小时,然后还有2个字段表示7月28日00:00到01:00的小时

如果去掉第三个要求,就容易多了。很多人似乎认为你应该总是使用哈希而不是键,但这源于对一篇关于在特定有限的情况下使用哈希来提高性能的文章的误解。

要获得点击次数最多的链接,请为每小时或每天创建一个排序集,其值为链接,分数为使用ZINCRBY设置的点击次数。使用ZCARD和ZREVRANGEBYSCORE获得前10%。如果集合包含系统中的所有链接,则最简单,尽管您可以使用一些策略在必要时从集合中删除不太受欢迎的项目。

要获取发布链接的所有用户,为每个链接存储一组用户。您可以使用JSON和存储链接详细信息的键或散列来完成此操作,但是集合使更新和查询更容易。

我建议使用一些bucket策略,如散列键或按月保存链接到用户的记录,因为您无法控制数据结构的大小,它可能会增长到多大。将有数百万用户访问一个特定的链接。现在,再次获得所有用户的详细信息,如果立即抛出它将毫无用处。我认为可以做的是维护计数器或一些元数据,这些元数据类似于当前状态,然后维护一个不在内存中的归档存储。或者使用GemFire

这样的内存网格

最新更新