当前位置: 首页 > news >正文

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

记录用户的连续登录天数

  • 访问量: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

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 = 0key = 'sign:%d:%d:%d' % (uid, year, month)for i in range(1, day+1):res = re.getbit(key, i)if res == 0:cc = 0else:cc += 1return 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 = 1init(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}")
http://www.lryc.cn/news/573964.html

相关文章:

  • 系列一、windows中安装RabbitMQ
  • [论文阅读] 软件工程 + 教学 | 软件工程项目管理课程改革:从传统教学到以学生为中心的混合式学习实践
  • Linux——6.检测磁盘空间、处理数据文件
  • 爬虫入门练习(文字数据的爬取)
  • JavaScript 的 “==” 存在的坑
  • 跨域视角下强化学习重塑大模型推理:GURU框架与多领域推理新突破
  • TypeScript类型定义:Interface与Type的全面对比与使用场景
  • 线程池异步处理
  • 分布式ID生成方式及优缺点详解
  • 【Datawhale组队学习202506】YOLO-Master task03 IOU总结
  • uni-app项目实战笔记23--解决首次加载额外图片带来的网络消耗问题
  • 人工智能、机器人最容易取哪些体力劳动和脑力劳动
  • day03-微服务01
  • 《Nature Commun》(中科院1区, IF17.694): CITE-seq+空间转录组解析SSc免疫异质性
  • MySQL学习(1)——基础库操作
  • 【C++开发】CMake构建工具
  • 系统思考:救火先放火
  • (线性代数最小二乘问题)Normal Equation(正规方程)
  • 【边缘计算】ECA、ECN、ECI
  • 逆向某物 App 登录接口:还原 newSign 算法全流程
  • springboot 提供的可扩展接口
  • Element表格表头合并技巧
  • 30天pytorch从入门到熟练(day1)
  • VS2019调试进入FFmpeg源码
  • Vulkan 学习笔记15—Mipmap 与多重采样
  • 【webSocket】WebSocket全双工通信实战指南
  • 从零开始手写redis(15)实现自己的 HashMap
  • java专题漏洞总结 + 靶场练习
  • 【学习笔记】深入理解Java虚拟机学习笔记——第10章 前端编译与优化
  • RA4M2开发IOT(10)----集成LPS22DF气压计