2012-03-01 55 views
2

我正在使用redis跟蹤我正在構建的留言板中每個主題的日常視圖。在主題模型中還有另一個字段,可以存儲一個主題的所有時間視圖。遍歷一個redis排序集以更新活動記錄表

我使用排序集來跟蹤主題視圖,因爲它使我可以輕鬆快速地顯示當前最流行的主題。

我想創建一個在午夜運行的任務 - 遍歷已排序的集合 - 將當天特定主題的視圖計數添加到主體所有時間視圖。然後,我想在更新該主題的視圖後刪除該成員。

什麼是一個優雅的方式來遍歷排序列表中的所有成員,並更新其相關(通過ID)活動記錄實體?

這是我如何添加視圖的主題:

def self.record_view(id) 
    REDIS.zincrby("views", 1, id) 
end 

這是我應得的觀看次數爲主題:

def views 
    REDIS.zscore("views", self.id).to_i 
end 

回答

4

可以使用ZRANGE and WITHSCORES把所有的鑰匙和分數都放到Ruby的土地上,在那裏你可以以任何你想要的方式迭代它們。

REDIS.zrange('views', 0, -1, withscores: true) 
# => an array, [key1, score1, key2, score2, ...] 

你也可以很聰明,使用ZRANGE和ZCARD來批量獲取數據。

+0

感謝您 - 有必要創建一個哈希來區分鍵和分數嗎? – someoneinomaha 2012-03-01 21:19:29

+0

必要 - 沒有。偶數索引處的元素是鍵,奇數索引處 - 分數。雖然,客戶端庫可以做得更好,並將其轉換爲散列或至少是數組數組。 – 2012-03-01 21:23:06

+0

再次感謝您的幫助... – someoneinomaha 2012-03-01 21:31:12