【Redis】Bitmap 使用及应用场景

前言:bitmap 占用空间小,查询效率高,在一些场景中使用 bitmap 是一个很好的选择。

一、bitmap 相关命令

SETBIT - 设置指定位置的比特值,可以设为 1 或 0

例如 SETBIT key 10 1,将在 key 对应的 bitmap 中第10位设置为 1。

GETBIT - 获取指定位置的比特值

例如 GETBIT key 10,返回 key 对应 bitmap 的第10位的值。

BITCOUNT - 统计比特值为 1 的数量

例如 BITCOUNT key,返回 key 对应 bitmap 中比特值为 1 的数量。

BITPOS - 查找第一个为指定值的比特位

例如 BITPOS key 1,返回 key 对应 bitmap 中,第一个值为 1 的比特位的位置。

BITFIELD - 一次对多个比特位进行操作

例如 BITFIELD key INCRBY i 5 1,将 key 对应 bitmap 的第 i 个比特位增加 5。

BITOP - 对两个或多个 bitmap 执行位操作(AND/OR/XOR/NOT)并存储结果到另一个 key

例如 BITOP AND destkey key1 key2,将 key1 和 key2 做位与运算,结果存储到 destkey。

注意: bitmap 的第几位值是从 0 开始的,类似于数组下标从 0 开始。

二、bitmap 应用场景

2.1、统计用户是否在线

思路: 用户 id 作为偏移量,通过用户 id 就可以快速查到用户是否在线。

  1. 记录用户 10086 已登录
SETBIT login_status 10086 1
  1. 查询用户 10086 是否登录,返回 1 表示用户 10086 已登录。
GETBIT login_status 10086
  1. 用户 10086 退出,将用户设置为离线。
SETBIT login_status 10086 0

2.2、用户每个月的签到情况

思路: 每个用户每天的签到用 1 个 bit 位表示,一年的签到仅需要 365 个 bit 为。一个月最多只有 31 天,只需要 31 个 bit 位即可。

比如统计用户 10086 在 2023 年 9 月份的打卡记录。

  1. 记录用户 10086 用户在 2023 年 9 月 3 日的签到记录。
SETBIT uid:sign:10086:202309 2 1
  1. 获取用户 10086 在 2023 年 9 月 3 日是否打卡。
GETBIT uid:sign:10086:202309 2
  1. 统计用户 10086 在 2023 年 9 月的打卡次数。
BITCOUNT uid:sign:10086:202309
  1. 获取用户在 2023 年 9 月首次打卡的日期。
BITPOS uid:sign:10086:202309 1

2.3、连续签到用户总数

思路: 将某一个具体的天作为 key(day:20230907),用户 id 作为偏移量,使用 BITOP 命令合并多天的 bitmap。
在这里插入图片描述

  1. 设置用户A、B、C 在上图中的日期签到(假设用户 id 为 1、2、3)
setbit sign:20230901 0 1
setbit sign:20230901 1 1
setbit sign:20230901 2 1
setbit sign:20230902 0 1
setbit sign:20230902 1 1
setbit sign:20230903 1 1
setbit sign:20230903 2 1
  1. 与操作,获取一个新的 bitmap key
bitop and result sign:20230901 sign:20230902 sign:20230903
  1. 计算连续签到的人数
bitcount result

2.4、优惠券每人限领一张

思路:使用优惠券编号作为 bitmap key,用户 id 作为 offset。发优惠券的时候,先获取 bitmap 中用户是否领过优惠券。因为每人限领一张,领过的人直接返回。

  1. 设置用户 100、用户 101 领取过优惠券 a。
setbit coupon:a 100 1
setbit coupon:a 101 1
  1. 查看用户 100 是否领过优惠券 a,返回 1 则代表用户 100 领过优惠券。
getbit coupon:a 100

2.5、统计网站活跃用户

思路: 使用日期作为 key,然后用户 id 为 offset。
假如 20230901 活跃用户情况是: [1,0,1,1,0]。20230902 活跃用户情况是 :[ 1,1,0,1,0 ]

  1. 统计连续两天活跃的用户总数
bitop and dest1 20230901 20230902 
bitcount dest1
  1. 统计 20230901 ~ 20230902 活跃过的用户
bitop or dest2 20201009 20201010 
bitcount dest2

三、参考文档

  • Redis 实战篇:巧用 Bitmap 实现亿级数据统计

  • Redis 中 BitMap 的使用场景

四、最后

我是 xiucai,一位后端开发工程师。

如果你对我感兴趣,请移步我的个人博客,进一步了解。

- 文中如有错误,欢迎在评论区指正,如果这篇文章帮到了你,欢迎点赞和关注😊
- 本文首发于个人博客,未经许可禁止转载💌

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/106907.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue生成多文件pdf准考证

这是渲染的数据 这是生成的pdf文件,直接可以打印 需要安装和npm依赖和引入封装的pdf.js文件 npm install --save html2canvas // 页面转图片 npm install jspdf --save // 图片转pdfpdf.js文件 import html2canvas from "html2canvas"; import jsPDF …

陆续反水,ASML之后,日本尼康也可能对中国出售光刻机

随着中国一家手机企业发布5G手机,证明中国芯片制造自研先进光刻机取得成功,ASML率先跟进--表示已获得许可对中国出售更先进的2000i光刻机,日前再有消息传出,曾紧跟美国脚步的日本光刻机企业尼康也在考虑重新对中国出口光刻机。 一…

C++ 多态

引例&#xff1a; #include<iostream> using namespace std; class Animal { public:void speak(){cout<<"动物在说话"<<endl;} }; class Cat:public Animal { public:void speak(){cout<<"小猫在说话"<<endl;} }; void Do…

网络层IP协议

目录 前言 1.如何理解IP协议 2.IP协议格式 3.网段划分 4.特殊的IP地址 5.IP地址的数量限制 6.私有IP地址和公网IP地址 7.路由 总结 前言 在前面的文章中介绍了关于传输层常用的两个协议&#xff0c;UDP协议和TCP协议&#xff0c;当数据经过传输层之后&#xff0c;进入网…

一日一技:Python如何同时调用多个GPT的API?

相信很多同学或多或少都在Python中使用过GPT API&#xff0c;通过Python安装openai库&#xff0c;来调用GPT模型。 OpenAI官方文档中给出了一个示例&#xff0c;如下图所示&#xff1a; OpenAI API 测试 如果你只有一个API账号&#xff0c;那么你可能不觉得这样写有什么问题。…

自助式数据分析平台:JVS智能BI功能介绍(二)数据集管理

数据集是JVS-智能BI中承载数据、使用数据、管理数据的基础&#xff0c;同样也是构建数据分析的基础。可以通俗地将其理解为数据库中的普通的表&#xff0c;他来源于智能的ETL数据加工工具&#xff0c;可以将数据集进行分析图表、统计报表、数字大屏、数据服务等制作。 在整体的…

三、视频设备的枚举以及插拔检测

一、前言 本章主要讲述&#xff0c;如何获取设备名称以及guid&#xff0c;采集设备的采集格式识别&#xff0c;设备的插拔 设备列表以及属性的获取使用的directshow(后续的MediaFoundation无法获取OBS摄像头) 设备的插拔使用的是QT 捕获系统消息&#xff0c;捕获到设备插拔后&a…

《基于区块链的数据资产评估实施指南》技术研讨会成功召开

2023年9月1日&#xff0c;《基于区块链的数据资产评估实施指南》&#xff08;以下简称《指南》&#xff09;技术研讨会在深圳召开&#xff0c;竹云科技作为主要参编单位出席此次研讨会。 中国科协决策咨询首席专家王春晖&#xff0c;中国社会科学院博士于小丽&#xff0c;中国…

多版本CUDA安装切换

系统中默认的安装CUDA为12.0&#xff0c;现在需要在个人用户下安装CUDA11.7。 CUDA 下载 CUDA官网下载 安装 Log file not open.Segmentation fault (core dumped)错误 将/tmp/cuda-installer.log删除即可。重新安装&#xff0c;去掉驱动的安装&#xff0c;设置Toolkit的安装…

LeetCode刷题笔记【26】:贪心算法专题-4(柠檬水找零、根据身高重建队列、用最少数量的箭引爆气球)

文章目录 前置知识860.柠檬水找零题目描述解题思路代码 406.根据身高重建队列题目描述解题思路代码 452. 用最少数量的箭引爆气球题目描述踩坑-进行模拟正确思路的贪心 总结 前置知识 参考前文 参考文章&#xff1a; LeetCode刷题笔记【23】&#xff1a;贪心算法专题-1&#x…

【vue2】data中数据赋值失败找不到、data数据不声明的影响

&#x1f609;博主&#xff1a;初映CY的前说(前端领域) ,&#x1f4d2;本文核心&#xff1a;vue2data作用 前言&#xff1a;当你看到这篇文章相比你已经对vue有了一定的了解&#xff0c;对data的有了一个基本的认识&#xff1a;data是存放我们当前页面数据地方。是的&#xff0…

vue 使用canvas 详细教程

Vue.js 中使用 Canvas Vue.js 是一个流行的 JavaScript 框架&#xff0c;用于构建用户界面。它提供了一种简洁的方式来管理和渲染数据&#xff0c;同时也支持与其他库和工具的集成。要在 Vue.js 中使用 Canvas&#xff0c;您可以按照以下步骤进行操作&#xff1a; 在 Vue.js …