基于Redis位图实现用户签到功能
场景需求
适用场景如签到送积分、签到领取奖励等,大致需求如下:
- 签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等。
- 如果连续签到中断,则重置计数,每月初重置计数。
- 当月签到满3天领取奖励1,满5天领取奖励2,满7天领取奖励3……等等。
- 显示用户某个月的签到次数和首次签到时间。
- 在日历控件上展示用户每月签到情况,可以切换年月显示……等等。
设计思路
对于用户签到数据,如果每条数据都用k/v的方式存储,当用户量大的时候内存开销是非常大的。而位图(bitmap)是由一组bit位组成的,每个bit位对应0和1两个状态,虽然内部还是采用string类型存储,但redis提供了一些指令用于直接操作位图,可以把它看作是一个bit数组,数组的下标就是偏移量。它的优点是内存开销小、效率高且操作简单,很适合用于签到这类场景。
redis提供了以下几个指令用于操作位图:
考虑到每月初需要重置连续签到次数,最简单的方式是按用户每月存一条签到数据(也可以每年存一条数据)。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用户签到内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
上一篇: 幽默逗语,有笑有理又逗人
推荐阅读
-
Android基于AlarmManager实现用户在线心跳功能示例
-
Android基于AlarmManager实现用户在线心跳功能示例
-
基于JavaScript实现每日签到打卡轨迹功能
-
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
-
Python网络编程基于多线程实现多用户全双工聊天功能示例
-
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
-
PHP实现redis限制单ip、单用户的访问次数功能示例
-
基于JavaScript实现每日签到打卡轨迹功能
-
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
-
Python网络编程基于多线程实现多用户全双工聊天功能示例