使用Redis的bitmaps统计活跃用户


首先我们看一个场景:一个网站,需要统计一周内连续登陆的用户,以及一个月内登陆过的用户。

如果用传统的数据库如Mysql来实现的话,很难做到。但如果用Redis来做的话,就很简便。Redis的集合类型和Bitmap类型都可以很容易的做到。今天,我们主要来谈谈如何用Bitmaps来实现统计活跃用户的功能。

Bitmaps

在计算机系统中,最小的信息单位是字节,1个字节等于8位,每一位都只可能是0或1(计算机只认识这两个数)。使用Bitmaps可以直接对位进行操作。

可以把bigmaps看做一个数组,数组里每一位只可能是0或者1,数组的下标在这里看做偏移量。

下面我们来介绍几个和Bitmaps相关的命令:

setbit

setbit key offset value:给对应的位设置值

比如今天有用户3、8、23、32访问了网站,则

setbit user:view:2025-5-17 3 1
setbit user:view:2025-5-17 8 1
setbit user:view:2025-5-17 23 1
setbit user:view:2025-5-17 32 1

开发提示:很多应用id都不是从1开始,有许多是从指定数字开始的,比如1001、10001开始。对于这些,我们在设置的时候可以先减去初始值,防止浪费空间

getbit

getbit key offset 获取指定位的值

如果我想知道今天8号用户和45号用户是否登录过,则

127.0.0.1:6379> getbit user:view:2025-5-17 8
(integer) 1
127.0.0.1:6379> getbit user:view:2025-5-17 45
(integer) 0

可以看到8号用户今天登录过,但是45号用户今天还没有登录。

bitcount

bitcount key [start] [end] 获取指定范围为1的个数

我想知道今天有多少用户登陆过了,则

127.0.0.1:6379> bitcount user:view:2025-5-17
(integer) 4

Bitmaps间的操作

bitop op destkey key [key ...]

麦当秀MindShow AiPPT 麦当秀MindShow AiPPT

麦当秀|MINDSHOW是一款百万用户正在使用的三分钟生成一份PPT的AI应用系统。它利用引领前沿的人工智能技术,能够自动完成演示内容的设计。

麦当秀MindShow AiPPT 224 查看详情 麦当秀MindShow AiPPT

bitop命令可以对多个bitmaps做交集(and)、并集(or)、非(not)、异或(xor),并将操作结果存放在destkey中。

如果想知道连续三天都登陆过的用户,即5月17日、18日、19日都登陆的用户数量。

这三天登陆情况如下:

  • 5月17日3、8、23、32用户登陆过

  • 5月18日3、23、43、54号用户登陆过

  • 5月19日3、5、23、 32、56、78号用户登陆过

127.0.0.1:6379> bitop and three:and user:view:2025-5-17 user:view:2025-5-18 user:view:2025-5-19
127.0.0.1:6379> bitcount three:and
(integer) 2

如果想知道,这三天有多少用户登陆过。

127.0.0.1:6379> bitop or three:or user:view:2025-5-17 user:view:2025-5-18 user:view:2025-5-19
(integer) 10
127.0.0.1:6379> bitcount three:or
(integer) 9

可以看到,这三天共有9位用户登陆过。

实战

讲完上面所讲知识后,我们就可以来完成想要的需求:需要统计一周内连续登陆的用户,以及一个月内登陆过的用户。

首先模拟用户30天内登陆情况,伪代码如下:

for ($i = 0; $i < 20000; $i++) {
    $userId = mt_rand(1, 10000);
    $date   = time() - 86400 * mt_rand(0, 30);
    $key   = 'userlogin_'.date('Ymd', $date);
 
    $redis->setBit($key, $userId, 1);
}

获取一周内都登陆的用户,当然我们不会一次性全部取,而是想分页那样,一次取一定数量的,伪代码如下:

for ($i = 1; $i <= 7; $i ++) {
    $key = "userlogin_".date('Ymd', time() - (86400*$i));
 
    if ($i == 1) {
        $redis->bitOp('and', 'week_logined', $key);
    } else {
        $redis->bitOp('and', 'week_logined', 'week_logined', $key);
    }
}
 
// 获取前50个用户
$userIds = [];
for ($i=1; $i<=10000; $i++) {
    $ret = $redis->getBit('week_logined', $i);
    $ret && $userIds[] = $i;
 
    if (count($userIds) >=50) break;
}

这里面有一个注意点,也是易错点,在bitop时候,第一次的时候,因为week_logined还不存在,所以进行op的键只有一个。当从第二次开始时候,进行op的键就为2个了。

获取一个月内登陆的用户,思路基本和上面一样,只是将and改为or

for ($i = 1; $i <= 3; $i ++) {
    $key = "userlogin_".date('Ymd', time() - (86400*$i));
    $redis->bitOp('or', 'month_loginOnce', 'month_loginOnce', $key);
}
 
// 获取一个月内登陆过的用户
$userIds = [];
for ($i=1; $i<=10000; $i++) {
    $ret = $redis->getBit('month_loginOnce', $i);
    $ret && $userIds[] = $i;
}

可以看到,在进行or的时候和and还是有些区别的。or的时候,无需对第一次进行判断。个中缘由,大家自己体会体会。

以上就是使用Redis的bitmaps统计活跃用户的详细内容,更多请关注其它相关文章!


# 用户登陆  # 邳州盐城网站建设  # 内江网站推广价格  # 大麦网seo关键字策略  # 大岭山五金网站优化公司  # 金昌网站建设有哪些  # 搜狗搜索引擎排名关键词  # 优质营销推广价格  # 想知道  # 有多少  # 是从  # 一周内  # 这三  # 我想  # 当秀  # 可以看到  # 一个月内  # Redis  # 邯郸网站推广优化工具  # 商品网站推广开户方案  # seo推广最好的网站 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 获取WooCommerce产品在后台编辑页面的分类ID  《伊瑟》凶影追缉库卢鲁boss攻略  曝《丝之歌》DLC有望开发!开发商还有神秘新企划  小米civi如何设置锁屏时间  江苏大剧院会员卡购买步骤  React应用中Commerce.js数据加载与状态管理最佳实践  J*aScript实现下拉菜单驱动的动态表格数据展示  《大学搜题酱》官网地址登录  蜻蜓FM如何设置移动流量播放  小红书网页版首页入口 小红书网页版电脑端官方登录链接  悟空浏览器如何恢复关闭的标签页 悟空浏览器撤销关闭网页快捷键设置  顺丰官方查单号入口 顺丰快递单号查询官网入口  教育查询官方网站入口 教育个人档案查询免费官网  Lar*el Socialite单设备登录策略:实现用户唯一会话管理  diskgenius分区工具如何设置Bios启动项  知音漫客官网首页入口_知音漫客热门漫画推荐  Word 2003字体大小设置方法  解决异步Python机器人中同步操作的阻塞问题  QQ网页版官方账号登录入口 QQ网页版网页版入口快速导航  解决VS Code中Python版本冲突与输出异常的指南  包子漫画官网链接官方地址 包子漫画在线观看官网首页入口  Win10怎么设置快速启动 Win10开启快速启动设置方法  J*aScript模拟悬停与点击:自动化网页动态元素交互指南  鸣潮历史学家灯塔位置一览  PSD转AI文件的简单方法  在Django中动态检查模型关联:一种灵活的解决方案  泰拉瑞亚水晶无法放置问题  苹果手机手电筒无法开启  《下一站江湖2》心法融合技巧  手机坏了微信聊天记录怎么导出来 新手机恢复聊天记录技巧  如何编写一个符合 composer 规范的 post-install-cmd 脚本?  《律学法考》查看学习数据方法  PHP实现等比数列:构建数组元素基于前一个值递增的方法  Win10显卡驱动安装失败怎么办 Win10使用DDU彻底卸载驱动【解决】  163邮箱登录入口官网 163.com邮箱登录入口  原子笔记app误删找回教程  J*aScript二进制处理_ArrayBuffer与Blob  b站如何剪辑视频_b站必剪app使用教程  Golang如何使用gRPC拦截器实现日志收集_Golang gRPC拦截器日志收集实践  邮编号码查询app有哪些_邮编号码查询推荐app及使用体验  Golang如何初始化module项目_Golang module init使用说明  哔哩哔哩的|直播|间怎么送礼物_哔哩哔哩|直播|送礼操作指南  如何在CSS中使用伪类:valid实现表单验证提示_结合:valid改变边框颜色  J*aScript与HTML元素交互:图片点击事件与链接处理教程  word文档行距怎么调?word文档调行距的操作步骤  《米姆米姆哈》米姆获取及技能攻略  批改网官网首页登录 批改网学生用户登录入口  使用Python和NLTK从文本中高效提取名词的实用教程  掌握Go App Engine项目结构与GOPATH:包管理与导入实践  热血江湖归来医师加点攻略 

 2020-05-20

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.