Redis Bitmaps 数据结构模型位操作

Bitmaps 数据结构模型

Bitmap 本身不是一种数据结构,实际上它就是字符串,但是它可以对字符串的位进行操作。 比如 “abc” 对应的 ASCII 码分别是 97、98、99。对应的二进制分别是 01100010、01100010、01100011, 如下所示:

    a        b         c
+--------+--------+--------+
|01100001|01100010|01100011|
+--------+--------+--------+

位图的最大优点之一是它们在存储信息时通常可以极大地节省空间。

例如,在一个用增量用户 ID 表示不同用户的系统中,仅使用 512 MB 内存就可以记住 40 亿个用户的单个比特信息。
1bit * 4,000,000,000 = 500,000,000 B = 488,281.25 KB = 476.8 MB

GETBIT 仅返回指定索引处的位的值。超出范围的位(寻址超出目标密钥中存储的字符串长度的位)始终被视为零。

root@ubuntu-x64_01:~#  redis-cli --no-auth-warning -h 192.168.88.11 -p 6380 -a "******" get k1 
"a"root@ubuntu-x64_01:~#  redis-cli --no-auth-warning -h 192.168.88.11 -p 6380 -a "******" --eval getbit.lua k1
"01100001"

setbit

设置健的第offset个位的值(从0算起),如有8个用户 userid = 0, 1, 2, 3, 4, 5, 6,7 , 其中用户 1, 3, 5 对网站进行了访问 , 那么Bitmaps初始化如下:

setbit key offset value
192.168.88.11:6380> setbit users:2023-12-09 1 1
(integer) 0
192.168.88.11:6380> setbit users:2023-12-09 3 1
(integer) 0
192.168.88.11:6380> setbit users:2023-12-09 5 1
(integer) 0# 获取当前哪些用户访问了 , 其中 1 表示访问过的用户 
root@ubuntu-x64_01:~#   /redis-cli --no-auth-warning -h 192.168.88.11 -p 6380 -a "******" --eval getbit.lua users:2023-12-09
"01010100"

getbit

获取健的第offset位的值(从0算起), 如下获取 user 5 是否在 2023-12-09 访问过, 1表示访问,0表示没有访问,如果offset不存在,返回结果也是0, 超出范围的位始终被视为零。

192.168.88.11:6380> getbit users:2023-12-09 5
(integer) 1

bitcount

获取Bitmaps指定范围值为1的个数,如统计 2023-12-09 这天访问的用户数量

192.168.88.11:6380> bitcount users:2023-12-09
(integer) 3

bitop

bitmaps之前的运算,它可以做and(交集)、or(并集)、not(非)、xor(异或),并将结果保存在 destkey ,如计算 2023-12-09、2023-12-10 两天都访问过的用户数量

root@ubuntu-x64_01:~#  redis-cli  --no-auth-warning -h 192.168.88.11 -p 6380 -a "******" --eval getbit.lua users:2023-12-09
"01010100"
root@ubuntu-x64_01:~#  redis-cli  --no-auth-warning -h 192.168.88.11 -p 6380 -a "******" --evalgetbit.lua users:2023-12-10
"01100110"192.168.88.11:6380> bitop and users:2023-12-09_10 users:2023-12-09 users:2023-12-10
(integer) 1192.168.88.11:6380> bitcount users:2023-12-09_10
(integer) 2root@ubuntu-x64_01:~#  redis-cli --no-auth-warning -h 192.168.88.11 -p 6380 -a "******" --eval getbit.lua users:2023-12-09_10
"01000100"

小结

将位图拆分为多个键很简单,例如为了对数据集进行分片,并且通常最好避免使用巨大的键。要将位图拆分到不同的键上,而不是将所有位设置为一个键,一个简单的策略就是为每个键存储 M 位,并使用 获取键名称和bit-number/M在键(bit-number MOD M)内寻址的第 N 位。

假设 M=10 , 约100个用户(有点少,仅用作举例):

则 第91个用户寻址如下:健名称: 91 MOD 10 = 1 即 key = user1 , N = 91/10 = 9

则 第65个用户寻址如下:健名称: 65 MOD 10 = 5 即 key = user5 , N = 65/10 = 6

在这里插入图片描述

SETBIT 、 GETBIT 、BITFIELD 均为 O(1)。

BITCOUNT、BITOP、BITPOS 是 O(n),其中n是比较中最长字符串的长度。

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

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

相关文章

HTML5+CSS3+JS小实例:文字依次点击验证

实例:文字依次点击验证 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&quo…

十七、FreeRTOS之FreeRTOS事件标志组

本节需要掌握以下内容&#xff1a; 1&#xff0c;事件标志组简介&#xff08;了解&#xff09; 2&#xff0c;事件标志组相关API函数介绍&#xff08;熟悉&#xff09; 3&#xff0c;事件标志组实验&#xff08;掌握&#xff09; 4&#xff0c;课堂总结&#xff08;掌握&am…

04_W5500_TCP_Server

上一节我们完成了TCP_Client实验&#xff0c;这节使用W5500作为服务端与TCP客户端进行通信。 目录 1.W5500服务端要做的&#xff1a; 2.代码分析&#xff1a; 3.测试&#xff1a; 1.W5500服务端要做的&#xff1a; 服务端只需要打开socket&#xff0c;然后监听端口即可。 2…

HarmonyOS Developer——鸿蒙【构建第一个JS应用(FA模型)】

创建JS工程 JS工程目录结构 构建第一个页面 构建第二个页面 实现页面间的跳转 使用真机运行应用 说明 为确保运行效果&#xff0c;本文以使用DevEco Studio 3.1 Release版本为例&#xff0c;点击此处获取下载链接。 创建JS工程 若首次打开DevEco Studio&#xff0c;请点击…

虾皮什么商品好卖

在虾皮&#xff08;Shopee&#xff09;平台上&#xff0c;有许多商品类别都表现出了较好的销售情况。然而&#xff0c;随着时间和地区的变化&#xff0c;热销商品也会有所不同。本文将介绍一些在虾皮平台上表现较好的商品类别&#xff0c;并提供一些建议&#xff0c;帮助您在虾…

交换机基本原理和配置

目录 一、数据链路层功能 二、交换机的工作原理 三、交换机的四大功能 一、数据链路层功能 位于网络层与物理层之间 数据链路的建立、维护与拆除帧包装、帧传输、帧同步帧的差错恢复流量控制 二、交换机的工作原理 交换机通过数据帧的源 MAC 地址&#xff0c;学习到交换机端…

【算法】直接插入排序

目录 1. 说明2. 举个例子3. java代码示例4. java示例截图 1. 说明 1.直接插入排序的方式和打牌一样&#xff0c;刚开始数组为空 2.拿到一个数字后从左到右将它与数组中的每一个数字进行比较&#xff0c;然后插入合适的位置 3.到最后&#xff0c;数组按照既定的顺序排序好 2. 举…

OpenCV基础篇

OpenCV基础篇 一、图像、视频读取二、cv::Mat()数据类型三、绘图功能四、鼠标响应事件五、图像像素读写六、图像像素运算七、颜色空间转换八、图像几何变换九、图像滤波十、图像二值化十一、图像梯度十二、Canny边缘检测十三、图像形态学十四、图像直方图十五、霍夫变换十六、分…

springboot_ssm_java学位论文盲审系统

本系统主要实现用户登录验证&#xff0c;用户使用邮箱&#xff0c;密码和选择身份进行登录&#xff0c;用户查看个人中心&#xff0c;提交论文&#xff0c;发表留言和问题反馈。用户在线注册。学生模块功能实现&#xff1a;学生注册&#xff0c;查看信息&#xff0c;修改资料&a…

智能优化算法应用:基于鱼鹰算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鱼鹰算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鱼鹰算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鱼鹰算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

蓝桥杯航班时间

蓝桥杯其他真题点这里&#x1f448; //飞行时间 - 时差 已过去的时间1 //飞行时间 时差 已过去的时间2 //两个式子相加会发现 飞行时间 两段时间差的和 >> 1import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public cl…

[Linux] LAMP架构

一、LAMP架构架构的概述 LAMP 架构是一种流行的 Web 应用程序架构&#xff0c;它的名称是由四个主要组件的首字母组成的&#xff1a; Linux&#xff08;操作系统&#xff09;&#xff1a; 作为操作系统&#xff0c;Linux 提供了服务器的基础。它负责处理硬件资源、文件系统管理…

解读 | 阿里通义千问模型全尺寸开源 “诚意满满“背后的名与利

大家好&#xff0c;我是极智视界&#xff0c;欢迎关注我的公众号&#xff0c;获取我的更多前沿科技分享 邀您加入我的知识星球「极智视界」&#xff0c;星球内有超多好玩的项目实战源码和资源下载&#xff0c;链接&#xff1a;https://t.zsxq.com/0aiNxERDq 12 月 1 日阿里开源…

基于Web和深度学习的辣椒检测产量预测系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 辣椒是一种重要的经济作物&#xff0c;被广泛种植和消费。然而&#xff0c;辣椒的产量预测一直是农业生产中的重要问题。准确地预测辣椒的产量可以帮助农民合理安…

高项备考葵花宝典-项目进度管理输入、输出、工具和技术(下,很详细考试必过)

项目进度管理的目标是使项目按时完成。有效的进度管理是项目管理成功的关键之一&#xff0c;进度问题在项目生命周期内引起的冲突最多。 小型项目中&#xff0c;定义活动、排列活动顺序、估算活动持续时间及制定进度模型形成进度计划等过程的联系非常密切&#xff0c;可以视为一…

【论文笔记】FSD V2: Improving Fully Sparse 3D Object Detection with Virtual Voxels

原文链接&#xff1a;https://arxiv.org/abs/2308.03755 1. 引言 完全稀疏检测器在基于激光雷达的3D目标检测中有较高的效率和有效性&#xff0c;特别是对于长距离场景而言。 但是&#xff0c;由于点云的稀疏性&#xff0c;完全稀疏检测器面临的一大困难是中心特征丢失&…

vFW搭建IRF

正文共&#xff1a;2328字 40图&#xff0c;预估阅读时间&#xff1a;5 分钟 IRF&#xff08;Intelligent Resilient Framework&#xff0c;智能弹性架构&#xff09;技术通过将多台设备连接在一起&#xff0c;虚拟化成一台设备&#xff0c;集成多台设备的硬件资源和软件处理能…

两个月软考-高项上岸

文章目录 前言结缘软考功亏一篑有始有终2个月计划资料部分计划截图 总结 前言 我们看小说或者电视剧电影都会看到这样的情节&#xff0c;主角一开始锦衣玉食&#xff0c;突然家道中落&#xff0c;啥都没了&#xff0c;主角再一路奋起重新找回了属于自己的一切&#xff1b;还有…

Vue项目中实现浏览器标签页名字的动态修改

修改router/index.js文件 路由条目下面添加meta属性 meta:{title:DevOps运维平台 }示例 使用Vue的全局守卫函数beforeEach&#xff0c;在路由切换前动态修改浏览器标签页名字 router.beforeEach((to,from,next) > {document.title to.meta.titlenext() })

Error: Cannot find module ‘E:\Workspace_zwf\mall\build\webpack.dev.conf.js‘

执行&#xff1a;npm run dev E:\Workspace_zwf\zengwenfeng-master>npm run dev> mall-app-web1.0.0 dev E:\Workspace_zwf\zengwenfeng-master > webpack-dev-server --inline --progress --config build/webpack.dev.conf.jsinternal/modules/cjs/loader.js:983thr…