【赵强老师】Redis案例分析:用setbit统计活跃用户

【赵强老师】Redis案例分析:用setbit统计活跃用户一、需求背景 首先,我们来看一下需求:网站统计用户登录的次数,具体如下: 网站有1亿个用户,有经常登录的,也有不经常登录的 如何来记录用户的登录信息 如何查询活跃用户:比如:一周内,登录3次的 二、使

【赵强老师】Redis案例分析:用setbit统计活跃用户

一、需求背景

首先,我们来看一下需求:网站统计用户登录的次数,具体如下:

  • 网站有1亿个用户,有经常登录的,也有不经常登录的
  • 如何来记录用户的登录信息
  • 如何查询活跃用户:比如:一周内,登录3次的

二、使用传统的关系型数据库

我们使用传统的关系型数据库(比如:Oracle)来存储这样的数据,如下图所示。

【赵强老师】Redis案例分析:用setbit统计活跃用户

 每周产生7亿条数据,对于任何一个关系型数据库来说,都是非常不好维护的,对性能也会有很大的影响。

三、使用Redis的setbit操作

Redis支持对String类型的value进行基于二进制位的置位操作。通过将一个用户的id对应value上的一位,通过对活跃用户对应的位进行置位,就能够用一个value记录所有活跃用户的信息。如下图所未,下图中的bitmap有9个位被置为1,表示这9个位上对应的用户是今天的活跃用户。其中第15位表示uid为15的用户,第一位表示uid为0的用户。(如果你的uid不是从1开始的,比如从100000开始,实际上你也可以相应的用uid减去初始值来表示其位数,比如1000000用户对应到bitmap的第一位)

【赵强老师】Redis案例分析:用setbit统计活跃用户

具体的代码类似下面这样:

redis.setbit(key, user_id, 1)

代码100分

这样一次记录的复杂度是O(1),在Redis中速度非常快。

下面代码是在Redis CLI中执行的Demo演示,比如:用户ID为100的用户在星期一登录了网站,我们就通过setbit操作,把星期一对应的100位的值置为1,
代码100分127.0.0.1:6379> setbit monday 100 1
(integer) 0

而我们通过每天换用一个不同的key来将每天的活跃用户状态记录分开存。并且可以通过一些与或运算计算出N天活跃用户,和连接N天活跃用户这样的统计数据。

如下图,第一行表示星期一的活跃用户情况,第二行表示周二的,以此类推。为样我们通过对N天的活跃用户记录取并集操作,就能得出在N天内活跃过的用户列表。

【赵强老师】Redis案例分析:用setbit统计活跃用户

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9074.html

(0)
上一篇 2023-02-16
下一篇 2023-02-16

相关推荐

  • MySQL升级WRITE_SET后的一次死锁分析[通俗易懂]

    MySQL升级WRITE_SET后的一次死锁分析[通俗易懂]背景 MySQL在推出MGR的时候使用了WRITE_SET, 借用这个思想, MySQL在5.7.22版本引入了基于WRITE_SET的并行复制方案[1]。在原先的主从复制技术中,同一批次的事物能进…

    2023-01-27
    142
  • Linux安装Python

    Linux安装Python在安装Python之前,需要准备好以下工具:

    2024-09-02
    25
  • 荣耀30到底值不值得入手_荣耀note10值得入手吗

    荣耀30到底值不值得入手_荣耀note10值得入手吗     最近工作轻松,每天都会趁着午休的时候看一看科技圈发生的事,不看不知道一看吓一跳!一直以来备受关注的荣耀30系列,在昨天上午的首销中不仅做到了1分钟破3亿销售额的惊人成绩,而且并且还获得了线…

    2023-02-20
    153
  • Python Time库基础教程

    Python Time库基础教程时间是人类不可逆转的流逝,而时间的计算处理也是软件开发中不可或缺的部分。Python语言中的Time库提供了一组简单而又强大的操作时间的函数。

    2024-05-24
    82
  • 视图和触发器_视图和触发器

    视图和触发器_视图和触发器视图 视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动

    2023-05-26
    135
  • Navicat for mysql 15激活方法「建议收藏」

    Navicat for mysql 15激活方法「建议收藏」激活工具下载地址 链接:https://pan.baidu.com/s/1jN6-wzLSBOGmnWxA6fxCJg 提取码:sdq1 操作流程 1.下载该软件,然后放到Navicat的根目录,并…

    2023-03-25
    155
  • 事物的隔离性和MVCC[亲测有效]

    事物的隔离性和MVCC[亲测有效]事物的隔离性 mysql的服务端是支持多个客户端同时与之连接的,每个客户端可能还并发了好几个连接,所以mysql是需要同时处理很多事情的,每一件独立的事情就叫做事务。我们知道事务有一个叫隔离性的特性,

    2023-06-02
    138
  • Python如何关闭线程

    Python如何关闭线程线程是计算机处理任务的一种方式,相对于进程而已,线程更轻量级并且占用的资源更少。Python在多线程编程方面提供了很方便的API,但是,一旦线程开始执行,我们要怎么关闭它呢?本文将探讨如何关闭Python线程。

    2024-07-31
    30

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注