基於Redis bitmap實現簽到功能,redisbitmap

來源:互聯網
上載者:User

基於Redis bitmap實現簽到功能,redisbitmap

作者:zhanhailiang 日期:2014-12-21
需求情境

Bitmap 對於一些特定類型的計算非常有效。

假設現在我們希望記錄自己網站上的使用者的上線頻率,比如說,計算使用者A上線了多少天,使用者B上
線了多少天,諸如此類,以此作為資料,從而決定讓哪些使用者參加beta測試等活動——這個模式可以使
用SETBIT和BITCOUNT來實現。

比如說,每當使用者在某一天上線的時候,我們就使用SETBIT,以使用者名稱作為key,將那天所代表的網站
的上線日作為offset 參數,並將這個offset 上的為設定為1。

舉個例子,如果今天是網站上線的第100天,而使用者(uid=10086)在今天閱覽過網站,那麼執行命令SETBIT sign:10086 100 1;如果明天使用者(uid=10086)也繼續閱覽網站,那麼執行命令SETBIT sign:10086 101 1,以此類推。

當要計算使用者(uid=10086)總共以來的上線次數時,就使用BITCOUNT命令:執行BITCOUNT sign:10086,得出的結果就是使用者(uid=10086)上線的總天數。

效能

以上線次數統計例子,即使運行10年,佔用的空間也只是每個使用者10*365位元位(bit),也即是每個
使用者456位元組。對於這種大小的資料來說,BITCOUNT的處理速度就像GET和INCR這種O(1)複雜度的
操作一樣快。

如果你的bitmap資料非常大,那麼可以考慮使用以下兩種方法:

1. 將一個大的bitmap分散到不同的key中,作為小的bitmap來處理。使用Lua指令碼可以很方便地完成這一工作。2. 使用BITCOUNT的start和end參數,每次只對所需的部分位進行計算,將位的累積工作(accumulating)放到用戶端進行,並且對結果進行緩衝(caching)。
代碼實現

https://github.com/billfeller/billfeller.github.io/blob/master/code/ISign.php

參考文檔:
《Redis.pdf》

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.