基于Redis位图实现用户签到功能

场景需求

适用场景如签到送积分、签到领取奖励等,大致需求如下:

  1. 签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等。
  2. 如果连续签到中断,则重置计数,每月初重置计数。
  3. 当月签到满3天领取奖励1,满5天领取奖励2,满7天领取奖励3……等等。
  4. 显示用户某个月的签到次数和首次签到时间。
  5. 在日历控件上展示用户每月签到情况,可以切换年月显示……等等。

设计思路

对于用户签到数据,如果每条数据都用k/v的方式存储,当用户量大的时候内存开销是非常大的。而位图(bitmap)是由一组bit位组成的,每个bit位对应0和1两个状态,虽然内部还是采用string类型存储,但redis提供了一些指令用于直接操作位图,可以把它看作是一个bit数组,数组的下标就是偏移量。它的优点是内存开销小、效率高且操作简单,很适合用于签到这类场景。

redis提供了以下几个指令用于操作位图:

setbit

getbit

bitcount

bitpos

bitop

bitfield

考虑到每月初需要重置连续签到次数,最简单的方式是按用户每月存一条签到数据(也可以每年存一条数据)。key的格式为u:sign:uid:yyyymm,value则采用长度为4个字节(32位)的位图(最大月份只有31天)。位图的每一位代表一天的签到,1表示已签,0表示未签。

例如u:sign:1000:201902表示id=1000的用户在2019年2月的签到记录。

示例代码

运行结果

您已签到:2019-02-18
您已签到:2019-02-18
本月签到次数:11
连续签到次数:8
本月首次签到:2019-02-02
当月签到情况:
2019-02-01: –
2019-02-02: √
2019-02-03: √
2019-02-04: –
2019-02-05: –
2019-02-06: √
2019-02-07: –
2019-02-08: –
2019-02-09: –
2019-02-10: –
2019-02-11: √
2019-02-12: √
2019-02-13: √
2019-02-14: √
2019-02-15: √
2019-02-16: √
2019-02-17: √
2019-02-18: √
2019-02-19: –
2019-02-20: –
2019-02-21: –
2019-02-22: –
2019-02-23: –
2019-02-24: –
2019-02-25: –
2019-02-26: –
2019-02-27: –
2019-02-28: –

参考链接

redis 命令参考

redis 深度历险:核心原理与应用实践

到此这篇关于基于redis位图实现用户签到功能的文章就介绍到这了,更多相关redis用户签到内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐