统计用户本月的连续登录天数

记录用户的连续登录天数

  • 访问量:10W+、100W+

技术栈

  • Redis的bitmap: 100w+的日活用户时
  • Redis的sortedSet:10W+的日活用户时
  • Mysql: 10W的日活用户时

简述

  • bitmap:每个月最多31天,即31bit,每一位表示第N天是否登录的状态:0-未登录/1-已登录
  • setbit uid1:2025:6 25 1 (表示uid为1的用户在2025年6月份的25号登录)
  • getbit uid1:2025:6 25 (获取uid为1的用户2025年6月份25号是否登录)
  • bitcount uid1:2025:6 (获取uid为1的用户2025年6月份的登录天数)
  • 要获取当前连续登录的天数则需要代码实现,redis不能直接获取
  • sortedSet,ZADD添加时将当前日期当成score记录,获取时通过ZRangeByScore获取完整的数据,后端做连续登录天数的判断。

代码实现:python

python 复制代码
import redis, calendar
from datetime import datetime,date
re = redis.Redis(host='127.0.0.1', port=6379, db=0)
# 获取指定年月的最大天数
def getDays(year, month):
    max_days = calendar.monthrange(year, month)[1]
    print("%d年%d月份的最大天数为: %d" % (year, month,  max_days))
    return max_days
# 签到初始化
def init(uid, year, month, day):
    key = 'sign:%d:%d:%d' % (uid, year, month)
    if re.exists(key) == 0: # 首次签到时初始化
        maxDays = getDays(year, month)
        for i in range(1, maxDays+1):
            re.setbit(key, i, 0)
            print('初始化' , key, i)
    re.setbit(key, day, 1)  

# 统计本次签到的连续签到次数
def static(uid, year, month, day):
    cc = 0
    key = 'sign:%d:%d:%d' % (uid, year, month)
    for i in range(1, day+1):
        res = re.getbit(key, i)
        if res == 0:
            cc = 0
        else:
            cc += 1
    return cc         
# 用户本月的总的签到次数
def getAll(uid, year, month):
    key = 'sign:%d:%d:%d' % (uid, year, month)
    return re.bitcount(key) 

try:
    today = str(date.today())
    year, month, day = list(map(int, today.split('-')))
    uid = 1
    init(uid, year, month, day)
    # cc = re.bitcount('uid1') # 统计签到的总次数
    cc  = static(uid, year, month, day)
    all = getAll(uid, year, month) 
    print('uid:%d 本次连续签到的次数为:%d, %d 月份的签到次数为:%d' % (uid, cc, month, all))
except Exception as e:
    print(f"连接失败: {e}")
相关推荐
熊猫钓鱼>_>13 小时前
三方库 NDK 原生模块跨平台适配与调试【鸿蒙心迹】
开发语言·华为·ai编程·harmonyos·鸿蒙·openharmony·鸿蒙心迹
HANDY0920013 小时前
从“不照人”到“剂量达标”:扇叶遮挡式UV-C空气消毒的工程边界与可验证评估框架
开发语言·人工智能·嵌入式硬件·智能家居
青少儿编程课堂13 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:分层图最短路解析
c++·python·算法·bfs·信息学竞赛
全栈练习生14 小时前
大模型原理之自适应推理
python·ai
1024奇点1 天前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
实名上网宋凯宣1 天前
Django
后端·python·django
Warren2Lynch1 天前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
如若1231 天前
【论文复现】CoFailMed:从零复现医学图像分割的共享失败审计,含完整代码流程与科研绘图
人工智能·python
Knight_AL1 天前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
FRing031 天前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2