首页 > 数据库 >用redis统计大量用户的登陆情况[只判断是否活跃]

用redis统计大量用户的登陆情况[只判断是否活跃]

时间:2022-11-30 12:40:37浏览次数:38  
标签:127.0 0.1 redis 用户 6379 登陆 integer setbit

有这样的一个场景需求:有上亿的用户,要统计这批用户的登陆情况,例如一周连续登陆,连续三天是是否登陆,一周活跃天数等用户

存在的挑战

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

如果使用文件保存

会有如下问题:

文件分割变得十分麻烦

数据检索非常不方便

用户关联操作复杂

如果使用数据库表

会有如下问题:

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

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

   优点:

  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

高效插入举例

  1. 新建一个文本文件,包含redis命令

*4    # 表示下面的命令有四个参数
$6   #第一个参数的长度
setbit   # 参数值
$3       #第二个参数的长度
mon    # 参数值
$1  #第三个参数的长度
3    # 参数值
$1  #第四个参数的长度
1   # 参数值

    存于data.txt

   2. 利用管道插入

   cat data.txt | redis-cli --pipe


源码面前,了无秘密



标签:127.0,0.1,redis,用户,6379,登陆,integer,setbit
From: https://blog.51cto.com/zhenghongxin/5898222

相关文章

  • java—不同的用户登录以后可以看到不同的菜单(后台可以实现对用户菜单的管理) 1 (55)
    实现不同的用户登录以后可以看到不同的菜单。(后台可以实现对用户菜单的管理。)第一步:分析数据结构    1:用户表表名:users列名类型说明idVarchar(32)主键nameVarchar(......
  • Redis的快照
    redis本地持久化到硬盘有两种方式,一是快照(snapshotting),二是只追加文件(append-onlyfileAOF)快照快照,顾名思义可以理解为拍照一样,把整个内存数据映射到硬盘中,保存一份......
  • redis惊群
    什么是惊群首先,我们使用缓存的主要目的就是为了高并发情况下的高可用,换句话说,在使用了缓存的高并发的系统下,如果缓存突然都消失了,会发生什么?首先数据库的压力必然骤增,接着负......
  • 直播平台软件开发,登陆时获取当前时间
    直播平台软件开发,登陆时获取当前时间getNowDate(){varmyDate=newDate;varyear=myDate.getFullYear()varmon=myDate.getMonth()+1vardate=myDate.getDate(......
  • 云小课|云小课教您如何选择Redis实例类型
    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击......
  • Qt栅格布局、ScrollArea和用户选择界面
    用户选择界面就我们在实际开发的时候可能需要面对这样一个界面做个demo试试看其实我们可以分解一下这个界面就是除了控制相关的内容,最主要的就是这个界面之上,有一个......
  • Redis基础命令
    Redis基础命令目录Redis基础命令Redis数据结构介绍Redis通用命令String类型key的层级结构Hash类型List类型Set类型SortedSet类型Redis数据结构介绍redis是一个key-value......
  • 练习_用户存在_命令判断
    #!/usr/bin/bashread-p"pleaseinputausername:"userid$user&>/dev/null#iduser用户是否存在if[$?-ne0];thenecho"nosuchuser:$user"......
  • centos7安装redis
    安装依赖yuminstall-ygccyum-yinstallcentos-release-sclyum-yinstalldevtoolset-9-gccdevtoolset-9-gcc-c++devtoolset-9-binutilssclenabledevtoolse......
  • es,logstash,redis,filebeat
    logstash从redis中拿取数据后会删除reids中的key,就无法在redis中查询到beats输入的值。----filebeat.ymlfilebeat.inputs:-type:tcphost:"0.0.0.0:8000"output.redis:......