一般排行榜都是有實效性的,比如「使用者積分榜」。如果沒有實效性一直按照總榜來排,可能榜首總是幾個老使用者,對於新使用者來說,那真是太令人沮喪了。
首先,來個「今日積分榜」吧,排序規則是今日使用者新增積分從多到少。
那麼使用者增加積分時,都操作一下記錄當天積分增加的有序集合。
假設今天是 2015 年 04 月 01 日,uid 為 1 的使用者因為某個操作,增加了 5 個積分。
redis 命令如下:
zincrby rank:20150401 5 1
假設還有其他幾個使用者也增加了積分:
zincrby rank:20150401 1 2zincrby rank:20150401 10 3
看看現在有序集合 rank:20150401 中的資料(withscores 引數可以附帶獲取元素的 score):
zrange rank:20150401 0 -1 withscores1) "2"2) "1"3) "1"4) "5"5) "3"6) "10"
#p#分頁標題#e#
按照分數從高到低,獲取 top10:
zrevrange rank:20150401 0 9 withscores1) "3"2) "10"3) "1"4) "5"5) "2"6) "1"
因為只有三個元素,所以就查詢出了這些資料。
如果每天記錄當天的積分排行榜,那麼其他花樣百出的榜單也就簡單了。
比如「昨日積分榜」:
zrevrange rank:20150331 0 9 withscores
利用並集實現多天的積分總和,實現「上週積分榜」:
zunionstore rank:last_week 7 rank:20150323 rank:20150324 rank:20150325 rank:20150326 rank:20150327 rank:20150328 rank:20150329 weights 1 1 1 1 1 1 1
這樣就將 7 天的積分記錄合併到有序集合 rank:last_week 中了。權重因子 weights 如果不給,預設就是 1。為了不隱藏細節,特意寫出。
那麼查詢上週積分榜 top10 的資訊就是:
zrevrange rank:last_week 0 9 withscores#p#分頁標題#e#
「月度榜」、「季度榜」、「年度榜」等等就以此類推。
下面給出乙個 php 版的簡單實現。使用 redis 依賴於 php 擴充套件 phpredis,**還依賴於 carbon 庫,用於處理時間。**量很少,所以就不敲注釋了。
<?phpnamespace blogredis;use redis;use carboncarbon;class ranks public function addscores($member, $scores) protected function getonedayrankings($date, $start, $stop) { $key = self::prefix . $date; return $this->redis->zrevrange($key, $start, $stop, true);
利用redis實現使用者簽到
很多 都提供了簽到功能 這裡不考慮資料落地事宜 並且需要展示最近乙個月的簽到情況,如果使用bitmap我們怎麼做?一言不合亮 redis new redis redis connect 127.0.0.1 使用者uid uid 1 記錄有uid的key cachekey sprintf sign d...
用redis實現使用者登入計數
最近有個問題 實現顯示使用者本月登入日期 累計天數到一定數目可參加活動,和下圖展示的功能類似。過去看過使用redis bitmap進行活躍使用者統計的例子,覺得和本功能非常match,決定用redis的bitset來實現。每個使用者每月產生乙個key,字段意義如下 0 位表示某月1日登入 1表示某月...
如何使用redis快取來實現使用者最近瀏覽的商品列表
1,最近瀏覽的記錄肯定是需要失效時間的 確定使用快取,快取可以設定失效時間 最大設定為乙個月,但是這已經足夠了 如果使用mysql等資料庫,還需要定時任務清除,很明顯是不切合實際的,2,最近瀏覽的記錄肯定是有個數限制的,不可能記錄所有的瀏覽記錄 目前使用的主流快取有 memached和redis兩種...