我试图建立一个系统,其中用户发布的所有链接以及他们的关注者点击都存储在redis中,以满足以下要求:Redis数据结构存储所有链接的所有点击
能够在一个时间范围内(可以是今天,本周,所有时间或自定义)获得(例如10%)大多数点击链接。
能够查询发布相同链接的所有用户。
由于我们已经使用了许多密钥,理想的是我们将所有这些存储在单个Redis密钥中。
如果需要,可以将值编码为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
谢谢你,先生克拉克森! 如果每个小时使用有序集合,是否会有太多密钥? 1年的点击次数在Redis中需要8760个密钥。再加上系统中已经有数百万个密钥,这可能是过度的,是吗? 另外,我需要一个时间框架内的顶部被点击的链接。例如,“自上周以来获得10%的点击率最高的链接”。这将涉及访问许多有序集合。 – sntran