使用RedisTemplate操做bitmap完成每日簽到

使用RedisTemplate操做bitmap完成每日簽到

用戶一天有沒有簽到只有兩種狀態:是和否(1,0)。一個月最多31天,4個byte32位恰好能容納一個月的數據量,每一位0和1分別表示是否簽到。所以使用4個byte就能表示一我的一個月的簽到狀態

img

Redis BITMAP

SETBIT

redis命令:SETBIT key offset valuejava

指令:SETBIT mykey 7 1redis

使用以上命令後,則bitmap以下:post

image

java代碼:spa

image

GETBIT

使用setbit指令簽到後,若是想要獲取用戶當天的簽到狀態能夠使用getbit指令。設計

redis命令:GETBIT key offset3d

指令:GETBIT mykey 7code

1

所以在實現按月簽到功能時,能夠根據當天的日期來控制偏移量(offset ),用戶簽到value就是1。blog

java代碼:ip

image

使用get指令可以獲取到整個bitmap的值。get

指令:GET mykey

"x01"

BITCOUNT

若是想要獲取用戶當月的簽到次數,能夠使用bitcount指令。

redis命令:BITCOUNT key [start end]

獲取bitmap中1的個數。

指令:BITCOUNT mykey

1

redisTemplate並無提供直接的方法來調用bitcount,能夠經過redisTemplate.execute來執行bitcount方法。

java代碼:

image

BITFIELD

爲了促進用戶連續簽到,有時會給連續簽到的用戶一些額外的獎勵,這時就須要使用bitfield來判斷用戶連續簽到多少天了。

java代碼執行bitfield指令:

image

獲取到返回值後判斷用戶當月連續簽到次數:

image

獲取用戶簽到日曆:
image

以上方法就能完成用戶按天然月簽到的需求了。

發散

若是需求是從用戶第一次簽到開始連續30天的話又應該如何設計呢?

若是是按天然周又應該如何設計呢?

若是是按照用戶第一次簽到後連續7天又該如何實現呢?

相關文章
相關標籤/搜索