首页 > 数据库 >redis实现统计用户连续登陆天数

redis实现统计用户连续登陆天数

时间:2024-08-21 13:27:27浏览次数:10  
标签:0.1 天数 redis 用户 6379 integer bit setbit

在很多app以及游戏当中,经常会统计用户连续登陆天数,使用mysql统计这份频繁的数据有所欠缺以及结算等方面都是很大的负担

存在的挑战

  1. 数据如何尽可能用小的空间存储
  2. 如何能快速获取指定的数据

如果使用文件保存

   会有如下问题:

  1. 文件分割变得十分麻烦

  2. 数据检索非常不方便

  3. 用户关联操作复杂

如果使用数据库表

   会有如下问题:

  1. 占用空间增长速度快,表急剧增大
  2. 使用索引,易产生碎片,每次插入数据还要维护索引,影响性能
  3. 要用group ,sum等运算,计算较慢

使用redis位图进行存储(setbit/getbit)

用户的签到状态无非两种,我们按月来统计用户签到信息,签到记录为1,未签到则记录为0.

把每一个bit位对应当月的每一天,形成了映射关系。用0和1标识业务状态,这种思路就称为位图(BitMap)。我们用31个bit位(4字节)即可表示我们一个月的签到记录,这样就用极小的空间,实现了大量数据的表示。


Redis中是利用string类型数据结构实现BitMap,最大上限是512M,转换为bit则是 2^32个bit位。BitMap的操作命令有:

SETBIT:向指定位置(offset)存入一个0或1
GETBIT :获取指定位置(offset)的bit值
BITCOUNT :统计BitMap中值为1的bit位的数量
BITFIELD :操作(查询、修改、自增)BitMap中bit数组中的指定位置(offset)的值
BITFIELD_RO :获取BitMap中bit数组,并以十进制形式返回
BITOP :将多个BitMap的结果做位运算(与 、或、异或)
BITPOS :查找bit数组中指定范围内第一个0或1出现的位置

   优点:

  1. 由于我的业务中只需要根据某个用户id查询是否是活跃用户,不存在复杂的查询条件,所以用redis很合适。
  2. redis中所有数据都是二进制形式存储的。redis支持一个setbit和getbit操作,它支持在某个key的value上直接对某个二进制位操作,每个二进制位都只有0和1两种状态,正好可以表示用户是否活跃两种状态。
  3. 存取速度非常快

思路

  1. 记录用户登陆:每天按日期生成一个位图, 用户登陆后,把user_id位上的bit值置为1
  2. 把1周的位图用 and 计算, 是否连续登陆用and计算,得到1即为连续登陆的用户,简单来说,能快速的拿到用户是否登陆的0/1状态,就能快速的计算出某段日期内登陆了几天
  3. 如果每次执行redis比较繁琐,可以简单的生成追加文件的方式,追加redis命令,例setbit到文件中,隔一段时间统一利用pipe mode通过管道的方式直接快速存入redis

命令

redis 127.0.0.1:6379> setbit mon 3 1

(integer) 0

redis 127.0.0.1:6379> setbit mon 5 1

(integer) 0

redis 127.0.0.1:6379> setbit mon 7 1

(integer) 0

redis 127.0.0.1:6379> setbit thur 100000000 0

(integer) 0

redis 127.0.0.1:6379> setbit thur 3 1

(integer) 0

redis 127.0.0.1:6379> setbit thur 5 1

(integer) 0

redis 127.0.0.1:6379> setbit thur 8 1

(integer) 0

127.0.0.1:6379> getbit thur 8
(integer) 1

标签:0.1,天数,redis,用户,6379,integer,bit,setbit
From: https://www.cnblogs.com/azwz/p/18371398

相关文章

  • 小程序登录及用户信息、手机号获取
    小程序登录及用户信息、手机号获取 小程序登录流程时序  说明:调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。调用 auth.code2Session 接口,换取 用户唯一标识OpenID 和 会话密钥session_key。之后开发者服务器可以根据用户标识来生成自......
  • Python 开发中,使用bcrypt 或 Passlib 对系统用户密码进行哈希和验证处理
    在设计一个系统的时候,肯定都有会有用户身份认证的问题,一般对用户校验的时候,都是对用户存在数据库总的密码哈希值进行判断,从而避免密码泄露和反向解密,那么在Python开发中,我们可以引入bcrypt或Passlib对系统用户密码进行哈希和验证处理,以及介绍使用其他类库实现常规加解密处理操......
  • 使用 OpenTelemetry (OTel) 实现 Elastic RUM (真实用户监控)
    本文继续介绍OpenTelemetry与ElasticObservability的结合,详细讲解了如何使用DockerCompose或Kubernetes设置OpenTelemetry演示。Elastic真实用户监控(RUM)捕捉用户与网页浏览器的交互,并从性能角度提供有关“真实用户体验”的详细视图。Elastic的RUMAgent是一个J......
  • 资深用户推荐:‌这些 RSS 阅读器,‌让你爱不释手!‌
    600.RSS阅读器推荐本篇文章将简单介绍一些好用的、流行的RSS阅读器,希望你能看到喜欢的......
  • 在 PowerShell 脚本中调用 msiexec 进行静默安装,可以通过设置 msiexec 的参数来实现。
    在PowerShell脚本中调用msiexec进行静默安装,可以通过设置msiexec的参数来实现。静默安装意味着在安装过程中不会弹出用户界面,也不会进行用户交互。下面是一个示例,演示如何使用PowerShell脚本执行静默安装。示例PowerShell脚本powershellCopyCode#MSI文件的路径$m......
  • DuoPlus:最新功能更新,为用户提高效率!
    DuoPlus本次迎来几个功能更新,我们收集用户反馈,从用户角度出发优化云手机性能体验,以下主要是本次更新的几个内容:功能更新一览:·ROOT功能云手机支持一键ROOT·分组功能方便用户和团队管理所有的云手机·线路选择可以选择切换云手机视频推流线路·一键新机同时变更代理......
  • SearXNG与LLM强强联合:打造用户隐私保护的智能搜索解答流程,隐私无忧,搜索无忧
    SearXNG与LLM强强联合:打造用户隐私保护的智能搜索解答流程,隐私无忧,搜索无忧SearXNG是一个免费的互联网元搜索引擎,整合了各种搜索服务的结果。用户不会被跟踪,也不会被分析。github地址:https://github.com/searxng/searxng项目地址:https://docs.searxng.org/公共实例:......
  • Java中的分布式缓存解决方案:Redis与Ehcache
    在现代企业级应用中,性能和高可用性是两个重要的考量因素。分布式缓存作为解决性能瓶颈的有效手段,能有效减轻数据库的压力并提高系统的响应速度。本文将深入探讨Java中两种常用的分布式缓存解决方案:Redis与Ehcache,并通过代码示例演示它们在实际应用中的使用。分布式缓存的基本......
  • kubernetes创建用户
    原文:https://hbayraktar.medium.com/how-to-create-a-user-in-a-kubernetes-cluster-and-grant-access-bfeed991a0ef1.使用openssl生成密钥对和CSR(CertificateSigningRequest)opensslgenrsa-outdeveloper.key2048opensslreq-new-keydeveloper.key-outdeveloper.cs......
  • CentOS7设置默认免密登录用户root
    CentOS7设置默认免密登录用户root步骤1、打开要更改的CentOS系统2、切换到root用户2、reboot重启系统步骤1、打开要更改的CentOS系统2、切换到root用户2、reboot重启系统......