基於Redis bitmap實現簽到功能

2021-10-13 07:31:28 字數 1127 閱讀 7340

需求場景

bitmap 對於一些特定型別的計算非常有效。

比如說,每當使用者在某一天上線的時候,我們就使用setbit,以使用者名稱作為key,將那天所代表的**

的上線日作為offset 引數,並將這個offset 上的為設定為1。

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

sign:10086 代表位陣列

101代表位陣列的第幾位

1代表該位置上的bit值設定為1

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

bitcount命令作用:

統計字串被設定為1的bit數.

一般情況下,給定的整個字串都會被進行計數,通過指定額外的 start 或 end 引數,可以讓計數只在特定的位上進行。

start 和 end 引數的設定,都可以使用負數值:比如 -1 表示最後乙個位,而 -2 表示倒數第二個位,

start、end 是指bit組的位元組的下標數,二者皆包含。

效能

以上線次數統計例子,即使執行10年,占用的空間也只是每個使用者10*365位元位(bit),也即是每個

使用者456位元組。對於這種大小的資料來說,bitcount的處理速度就像get和incr這種o(1)複雜度的

操作一樣快。

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

將乙個大的bitmap分散到不同的key中,作為小的bitmap來處理。使用lua指令碼可以很方便地完成這一工作。

使用bitcount的start和end引數,每次只對所需的部分位進行計算,將位的累積工作(accumulating)放到客戶端進行,並且對結果進行快取(caching)。

**實現

基於Redisbitmap實現開關配置功能

bitmap apisetbit key offset value 對key所儲存的字串值,設定或清除指定偏移量上的位 bit 位的設定或清除取決於value引數,可以是0也可以是1。當key不存在時,自動生成乙個新的字串值。字串會進行伸展 grown 以確保它可以將value儲存在指定的偏移量上。...

redis bitmap實現去重

最近做乙個探針專案,需要判斷使用者是不是第一次被採集,原來直接使用redis的key value第一次快取,過了段時間發現這樣key會無窮無盡。使用布隆演算法實現去重,布隆演算法參考 漫畫 bitmap演算法 整合版 具體實現,針對具體使用者的mac做hash,hash生成的結果作為bitmap的o...

記一次Redis bitmap導致的miss問題

redis bitmaps 基礎概念 redis 記憶體淘汰機制 大致需求 指令碼批量匯入使用者資料到redis中,使用bitmap標記使用者是否在匯入的白名單中。使用者量級 億。key使用了分片處理,把key分成了10w個,每個key占用 1億 10w 1000 個bit。理想是key1用於標記u...