当前位置: 首页 > news >正文

【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,一位后端开发工程师。

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

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

相关文章:

【Redis】Bitmap 使用及应用场景

前言:bitmap 占用空间小,查询效率高,在一些场景中使用 bitmap 是一个很好的选择。 一、bitmap 相关命令 SETBIT - 设置指定位置的比特值,可以设为 1 或 0 例如 SETBIT key 10 1,将在 key 对应的 bitmap 中第10位设置为…...

C#,数值计算——用于积分函数与方法的Stiel类的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Stiel { public class pp : UniVarRealValueFun, RealValueFun { public Stiel st { get; set; } null; public pp() { } public doubl…...

报错:为什么数组明明有内容但打印的length是0

文章目录 一、问题二、分析三、解决1.将异步改为同步2.设置延迟 一、问题 在日常开发中,for 循环遍历调用接口,并将接口返回的值进行拼接,即push到一个新的数组中,但是在for循环内部是可以拿到这个新的数组,而for循环…...

go gin gorm连接postgres postgis输出geojson

go gin gorm连接postgres postgis输出geojson 1. 技术环境 go-gin-gorm postgres-postgis go vscode环境安装-智能提示配置 2. 简单实现代码 思路就是:采用原生sql实现查询、更新等,采用gorm的raw来执行sql语句 package mainimport ("fmt"&q…...

4. Java 的线程安全机制之`volatile`

前言:在多线程编程过程中,线程安全是一个非常重要的概念,它有助于保证多线程程序的正确性和健壮性。其中,volatile是实现线程安全的一种方式,保证内存的立马可见,下面将会详细介绍。 文章目录 是什么为什么…...

​Vue + Element UI前端篇(二):Vue + Element 案例 ​

Vue Element UI 实现权限管理系统 前端篇(二):Vue Element 案例 导入项目 打开 Visual Studio Code,File --> add Folder to Workspace,导入我们的项目。 安装 Element 安装依赖 Element 是国内饿了么公司提…...

Qt5中connect信号槽无效问题 C++

在写QT的组件信号槽时遇到一个问题&#xff0c;我的QspinBox组件用connect连接函数总是无效&#xff0c;解决办法是&#xff1a; 在QT5中推荐使用如下形式连接槽函数&#xff1a; QObject::connect(ui->spinBox,QOverload<int>::of(&QSpinBox::valueChanged),th…...

服务端 TCP 连接的 TIME_WAIT 过多问题的分析与解决

https://blog.csdn.net/zxlyx/article/details/120397006 本文给出一个 TIME_WAIT 状态的 TCP 连接过多的问题的解决思路&#xff0c;非常典型&#xff0c;大家可以好好看看&#xff0c;以后遇到这个问题就不会束手无策了。 问题描述 模拟高并发的场景&#xff0c;会出现批量…...

【Unity3D赛车游戏优化篇】【十】汽车粒子特效和引擎咆哮打造极速漂移

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…...

肖sir__设计测试用例方法之编写测试用例12

编写测试用例 一、用例模板 案例1&#xff1a; 案例2&#xff1a; 案例3&#xff1a; 二、测试工作重点&#xff1a; 编写测试用例、 执行用例 &#xff08;依据测试用例&#xff09; 三、测试流程&#xff08;h模型&#xff09; 1、拿到需求 2、编写测试计划&#xff08;…...

Android 11.0 ota升级之Systemui下拉状态栏quick_settings_tiles_default值减少时更新的功能实现

1.前言 在11.0的系统rom定制化开发中,在定制功能需求中,在进行systemui的下拉状态栏定制以后,当需要ota升级的时候,发现在systemui下拉状态栏的快捷功能键部分去掉的 一些快捷功能并没有减少,这是因为systemui有缓存造成的只有清理缓存或者恢复出厂设置后才正常,所以今天…...

Android Studio中创建java项目

1.创建普通的android工程 2.创建一个module 3.module类型选择java library 4.填写libary和class的名字 5.生成的工程如图所示 6.然后点击Run --- Edit Configurations... 选择Application选项 设置所需要的参数 选中myjavalib后点击OK。然后打开刚创建的lib的gradle 编辑gradl…...

冠达管理:“旺季”来临,煤炭板块走高,云煤能源、陕西黑猫涨停

煤炭板块1日盘中发力走高&#xff0c;截至发稿&#xff0c;云煤动力、陕西黑猫涨停&#xff0c;兖矿动力涨超7%&#xff0c;晋控煤业、华阳股份涨超6%&#xff0c;山西焦煤、平煤股份涨超5%。 组织表明&#xff0c;动力大通胀背景下&#xff0c;未来3-5年煤炭供需偏紧的格局仍…...

【EI检索】第四届公共卫生与数据科学国际学术研讨会(ICPHDS 2023)

第四届公共卫生与数据科学国际学术研讨会&#xff08;ICPHDS 2023&#xff09; 2023 4th International Conference on Public Health and Data Science&#xff08;ICPHDS 2023&#xff09; 第四届公共卫生与数据科学国际学术研讨会&#xff08;ICPHDS 2023&#xff09;将于…...

对时序数据进行分类与聚类

我在最近的工作中遇到了一个问题&#xff0c;问题是我需要根据银行账户在一定时间内的使用信息对该账户在未来的一段时间是否会被销户进行预测。这是一个双元值的分类问题&#xff0c;只有两种可能&#xff0c;即会被销户和不会被销户。针对这个问题一般来说有两种解决策略。 …...

Win10如何找回图片查看器

近期有小伙伴反映在将Win10升级之后发现电脑自带的图片查看器没有了&#xff0c;这是怎么回事&#xff0c;该怎么找回呢&#xff0c;下面小编就给大家详细介绍一下Win10找回图片查看器的方法&#xff0c;有需要的小伙伴快来和小编一起阅读看看吧。 win10找回windows照片查看器…...

【脑机接口】基于运动想象的康复指导在脑卒中偏瘫患者中的应用

【摘要】 目的 探讨运动想象康复指导对脑卒中偏瘫患者的康复效果及意义。 方法 将 60例脑卒中偏瘫患者随机分为观察组(n31)和对照组(n29)&#xff0c;对照组的康复训练指导采用讲解示范法&#xff0c;观察组采用运动想象法 。比较两组 患者 的运 动功能 、日常生活 活动能力及 …...

vue-cli中vuex下$store”未在实例上定义

这里写目录标题 一、版本的问题二、vuex中的代码 一、版本的问题 vuex版本不对&#xff0c;获取不到store&#xff0c;vue默认vue3版本&#xff0c;vuex默认vuex4版本&#xff0c;vuex4只能在vue3中使用&#xff0c;在vue2中能使用vuex3,那么不能默认下载最新的版本 npm instal…...

AutoSAR配置与实践(实践篇)12.1 BSW WatchDog功能的配置和实现

AutoSAR配置与实践(实践篇)12.1 BSW WatchDog功能的配置和实现 BSW WatchDog功能的配置和实现一、Wdg监控需求二、WdgM状态管理原理2.1 WdgM状态管理中的配置项和层次关系2.2 SE 本地状态(Local Status)管理2.3 全局状态(Global Status)管理三、Alive/ Deadline/ Program Flo…...

【UI自动化测试】Jenkins配置

前一段时间帮助团队搭建了UI自动化环境&#xff0c;这里将Jenkins环境的一些配置分享给大家。 背景&#xff1a; 团队下半年的目标之一是实现自动化测试&#xff0c;这里要吐槽一下&#xff0c;之前开发的测试平台了&#xff0c;最初的目的是用来做接口自动化测试和性能测试&…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...