什么是簽到功能?
和上班打卡一樣,用戶每天可以在應用內進行一次“簽到”,用來表明用戶今天已經登錄且使用了該應用,同時簽到后很能獲取一定的獎勵。
為什么要做簽到功能?
- 培養用戶使用習慣,簽到功能設置的目的在於吸引用戶每天去完成簽到動作,培養用戶使用習慣。
- 滿足用戶榮譽感,簽到的獎勵措施可加入勛章體系(指的是授給有功者的榮譽證章或者標志)。滿足用戶用戶簽到后獲得勛章的榮譽感。
- 增加用戶活躍度,對於企業來說,用戶養成長期的簽到習慣,使得用戶活躍度更強,刺激沉默用戶,使得其在活躍過程中駐足產品。促進活躍用戶更加活躍,產生正向反饋。
- 提高企業一定的收入,簽到后用戶獲取的獎勵,一定程度上能提高企業的收入,優惠券的形式可以促使用戶下單,提高訂單量。積分+現金的形式可以增加禮品道具的收入。開屏廣告CPM收入。
簽到規則
- 需要連續簽到(其實就是累計簽滿),用戶需要在某一周期內完成連續的簽到行為,單次的簽到行為獎勵較少,而連續的簽到行為,會使得用戶獲利程度更大,刺激用戶養成連續簽到習慣。如果是連續簽到的情況下,要考慮用戶中途斷簽如何處理。
一般兩種選擇,重新開始計算或進行斷簽,多數采用的是補簽策略,重新計算的情況下,用戶容易喪失信心,可能會選擇放棄。而斷簽情況下,要考慮到補簽策略,補簽對於用戶來說付出的成本應小於補簽后獲利成本,這樣更容易讓用戶完成補簽動作,養成連續簽到行為。 - 不需要連續簽到,用戶只需要完成一定的簽到次數,不需要有連貫性。一般不需要連續簽到次數最高限定次數為當月天數(或是某一周期),次月則重新進行計算,達到一定的天數(累計簽到)即可獲得獎勵。
以上2中的簽到方式中,可以考慮增加簽到提醒功能,特別是需要連續簽到,目的是培養用戶養成簽到習慣,減少漏簽的意外。當用戶當天忘記簽到時進行消息推送的提醒。
設計思路
我們以實際應用中的案例為例。
七天累計簽到
這里我們其實只需要一張【簽到表】即可,里面包括6個必要的字段(id,用戶id,簽到情況,起始簽到日期,上一次簽到日期,簽到次數),其中:
- 【簽到情況】,用來直觀展示是否簽到,我們可以采用0和1表示是否簽到,如果需要簽到7天,那么默認值設為0000000共7個0,如果第三天簽到了,那么就找到下標為2設為1,此時的值就變成0010000,接着第四天沒簽到,第五天簽到了,那么值就變成0010100。
即需要連續簽到幾天,就默認設為幾個0,簽到了就將下標設為1。 - 【起始簽到日期】,用來記錄第一天簽到的日期,便於計算查詢。
- 【上一次簽到日期】,用於判斷是否能夠簽到。
- 【簽到次數】,用來記錄本次簽到周期的累計次數,便於計算查詢。
簽到步驟:
- 上一次簽到日期 如果等於 當前日期 那么返回已簽到。
- 日期間隔 = 當前日期 - 起始簽到日期。
- 日期間隔 >= 7天,那么就需要重新開始簽到,起始簽到日期 = 當前日期。
- 日期間隔 < 7天,可以簽到,將【簽到情況】中下標為日期間隔的值設為1,簽到次數累加。
- 上一次簽到日期 = 當前日期
按月累計簽到
同樣,我們其實只需要一張【簽到表】即可,里面包括6個必要的字段(id,用戶id,簽到情況,上一次簽到日期,簽到次數,補簽次數,補簽卡數),其中:
- 由於已知其實結束日期,所以去掉了相關字段。
- 補簽次數、補簽卡數,是根據業務擴展的字段,用於補簽獲取更多獎勵。
簽到操作:
- 上一次簽到日期 如果等於 當前日期 那么返回已簽到。
- 上一次簽到日期不在當前月份,重新開始計算。
- 日期間隔 = 當前日期 - 1。
- 將【簽到情況】中下標為日期間隔的值設為1,簽到次數累加。
- 上一次簽到日期 = 當前日期
至於補簽操作:
- 判斷是否有補簽卡。
- 補簽次數+1,累計次數+1,補簽卡數-1
借助redis
基於redis的bitmap,我們可以快捷高效的存儲【簽到情況】。
redis給bitmap數據結構提供了三個方法
BITCOUNT key [start] [end]
計算給定字符串中,被設置為 1 的比特位的數量。
GETBIT key offset
對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)。
SETBIT key offset value
對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit)。
具體就不展開介紹了,有興趣的同學可以看看redis官方文檔。
總結
至此,我們基於一張簽到表設計了一個簡單的簽到模塊,在實際場景中,我們還需要根據業務需求進一步設計,例如簽到日志,簽到配置,獎勵設置等等。更進一步的,還可以提煉出一套高度自定義的簽到服務,提供外部接入。
參考
http://www.woshipm.com/pd/771177.html
https://redis.io/commands/setbit