基於Redis bitmap實現簽到功能

來源:互聯網
上載者:User

標籤:

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》

基於Redis bitmap實現簽到功能

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.