zoukankan      html  css  js  c++  java
  • 【赵强老师】Redis案例分析:用setbit统计活跃用户

    一、需求背景

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

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

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

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

     每周产生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(key, user_id, 1)
    这样一次记录的复杂度是O(1),在Redis中速度非常快。
    下面代码是在Redis CLI中执行的Demo演示,比如:用户ID为100的用户在星期一登录了网站,我们就通过setbit操作,把星期一对应的100位的值置为1,
    127.0.0.1:6379> setbit monday 100 1
    (integer) 0
    而我们通过每天换用一个不同的key来将每天的活跃用户状态记录分开存。并且可以通过一些与或运算计算出N天活跃用户,和连接N天活跃用户这样的统计数据。

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

     

  • 相关阅读:
    2021寒假每日一题《棋盘挑战》
    2021寒假每日一题《货币系统》
    2021寒假每日一题《红与黑》
    2021寒假每日一题《字母图形》
    2021寒假每日一题《完全背包问题》
    2021寒假每日一题《找硬币》
    python 迭代器和生成器
    python for循环
    python集合
    python字符串常用操作
  • 原文地址:https://www.cnblogs.com/collen7788/p/12679430.html
Copyright © 2011-2022 走看看