当前位置: 首页 > 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.xdnf.cn/news/1064863.html

相关文章:

  • 62-Oracle ADR(Automatic Diagnostic Repository)
  • 量化-因子处理
  • 【递归,搜索与回溯算法】记忆化搜索(二)
  • Vue.js数据代理与事件处理全解析:从原理到实践
  • 【DDD】——带你领略领域驱动设计的独特魅力
  • React基础
  • MakeItTalk: Speaker-Aware Talking-Head Animation——说话者感知的说话头动画
  • 【笔记】Windows 系统迁移 Ubuntu(Preview)应用到其他磁盘
  • Element表格表头合并技巧
  • 第八章 目录一致性协议 A Primer on Memory Consistency and Cache Coherence - 2nd Edition
  • Bytemd@Bytemd/react详解(编辑器实现基础AST、插件、跨框架)
  • 分库分表下的 ID 冲突问题与雪花算法讲解
  • JVM(10)——详解Parallel垃圾回收器
  • python高校教务管理系统
  • 超详细YOLOv8/11图像菜品分类全程概述:环境、数据准备、训练、验证/预测、onnx部署(c++/python)详解
  • TypeScript类型定义:Interface与Type的全面对比与使用场景
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(三十六) -> 配置构建(三)
  • 算法导论第二十五章 深度学习的伦理与社会影响
  • C4.5算法深度解析:决策树进化的里程碑
  • 怎么让二级域名绑定到wordpesss指定的页面
  • 0-机器学习简介
  • winform mvvm
  • opencv 之双目立体标定算法核心实现
  • STM32F103C8T6,窗口看门狗(WWDG)与独立看门狗(IWDG)详解
  • all()函数和any()函数
  • 【机器学习四大核心任务类型详解】分类、回归、聚类、降维智能决策指南
  • 【投稿与写作】overleaf 文章转投arxiv流程经验分享
  • 开发语言本身只是提供了一种解决问题的工具
  • Windows 后渗透中可能会遇到的加密字符串分析
  • C++结构体初始化与成员函数实现语法详解