用戶一天有沒有簽到只有兩種狀態:是和否(1,0)。一個月最多31天,4個byte32位恰好能容納一個月的數據量,每一位0和1分別表示是否簽到。所以使用4個byte就能表示一我的一個月的簽到狀態
redis命令:SETBIT key offset valuejava
指令:SETBIT mykey 7 1redis
使用以上命令後,則bitmap以下:post
java代碼:spa
使用setbit指令簽到後,若是想要獲取用戶當天的簽到狀態能夠使用getbit指令。設計
redis命令:GETBIT key offset3d
指令:GETBIT mykey 7code
1
所以在實現按月簽到功能時,能夠根據當天的日期來控制偏移量(offset ),用戶簽到value就是1。blog
java代碼:ip
使用get指令可以獲取到整個bitmap的值。get
指令:GET mykey
"x01"
若是想要獲取用戶當月的簽到次數,能夠使用bitcount指令。
redis命令:BITCOUNT key [start end]
獲取bitmap中1的個數。
指令:BITCOUNT mykey
1
redisTemplate並無提供直接的方法來調用bitcount,能夠經過redisTemplate.execute
來執行bitcount方法。
java代碼:
爲了促進用戶連續簽到,有時會給連續簽到的用戶一些額外的獎勵,這時就須要使用bitfield來判斷用戶連續簽到多少天了。
java代碼執行bitfield指令:
獲取到返回值後判斷用戶當月連續簽到次數:
獲取用戶簽到日曆:
以上方法就能完成用戶按天然月簽到的需求了。
若是需求是從用戶第一次簽到開始連續30天的話又應該如何設計呢?
若是是按天然周又應該如何設計呢?
若是是按照用戶第一次簽到後連續7天又該如何實現呢?