2014-10-04 105 views
0

這可能是愚蠢的東西..Redis的ZRANGEBYSCORE返回空集

在Redis的控制檯這樣

zincrby model 1 20140101 
zincrby model 1 20141010 
zincrby model 1 20141010 

爲什麼這項工作

zrangebyscore model 00000000 99999999 withscores 
1) "20140101" 
2) "1" 
3) "20141010" 
4) "2" 

但這並不

zrangebyscore model 20140000 20149999 withscores 

#> (empty list or set) 

回答

2

ZRANGEBYS CORE用於分數範圍查找,而您正在使用您的成員(在第3個片段中)。自1,2 < < 20140000,20149999你沒有得到任何回報。

編輯後的一些評論回來ñ來回

一般情況下,你需要做一個關於空間/時間權衡,即更多的內存和更少的CPU,反之亦然決定,這實際上取決於你的表現&數據大小要求。通常我會嘗試爲每個需要聚合級別跟蹤的模型/事件使用一個有序集合。密鑰過期很有用,但有時也需要手動從已排序集中移除成員。

IIUC,你需要每個型號都有日常櫃檯所以按照您最初的設計,我的 「模式」 很可能是:

Sorted set key name pattern: <model>:daily 
           | 
           +- Member value: <day timestamp at 12AM UTC> 
           +- Member score: <count> 

使用ZINCRBY遞增今日點擊:

ZINCRBY <model>:daily 1 <today's timestamp at 12AM UTC> 

獲取日期點擊次數:

ZSCORE <model>:daily <date timestamp at 12AM UTC> 

注:

  1. 不能輕鬆地做到這種方法日期範圍爲你的分數保持計數。你基本上需要做多個ZSCORE(O(log(N))),循環遍歷範圍內的每個日期。
  2. 您可以保留額外的滾動或靜態聚合來加速常用的範圍。
  3. 您必須手動「過期」舊套裝成員進行家務管理。

另一種方法,它允許範圍是有到位如下:

Sorted set key name pattern: <model>:daily 
           | 
           +- Member value: <day timestamp at 12AM UTC>:<count> 
           +- Member score: 0 

在這裏,你可以使用ZRANGEBYLEX來獲得一定範圍的日期,但由於時間戳和計數被連接你」必須做一些處理客戶端或用Lua來獲得計數(ZSCORE將始終返回0)或增加它(不能再使用ZINCRBY)。

+0

對於時間序列數據使用redis排序集合,使用(糾正我,如果我錯了)時間戳作爲分數不是更好嗎?我在任何地方閱讀過人們推薦的內容,並檢索數據,以便在需要的時間範圍內使用ZRANGEBYSCORE。這裏的東西對我來說是倒退...... – 2014-10-04 15:42:43

+0

排序集合中的每個元素都有兩個屬性 - 唯一的成員值和分數。時間序列通常使用分數來保留時間戳(epoch),並且成員是正在加入的東西(通常,該成員是由構成的,以使其成爲唯一的)。你在做什麼是使用時間戳作爲成員和分數遞增。這意味着您使用的ZSET會保留時間戳的分數(1,2,...) - 如果您試圖解釋您嘗試執行的操作,這可能會更好:) – 2014-10-04 16:20:38

+0

基本上是分析每個模型在應用程序中。我想計算每個模型ID的訪問次數/事件數,並且能夠按日期提取數據。所以,在這裏(http://stackoverflow.com/questions/26174150/redis-key-scheme-for-analytics)我被推薦使用排序集,也推薦在其他地方,但它似乎只是有用的,如果當前日期的計數將使用不同的計數器,然後每天使用ZADD,總計數爲成員,時間爲分數。你會如何推薦實施這個? – 2014-10-04 16:35:58