Redis位图BitMap

devtools/2024/10/10 14:39:25/

 一、为什么使用位图?

       使用位图能有效实现 用户签到 等行为,用数据库表记录签到,将占用很多存储;但使用 位图BitMap,就能 大大减少存储占用

二、关于位图

       本质上是String类型,最小长度8位(一个字节),位数不够表示则扩容,每次扩容以字节为单位,最大占用内存为512MB,用来操作位

三、操作

引言:由于偏移量offset与数组下标结果一致,这里我就将offset当成二进制数组下标来讲解

1)设置二进制数组中指定下标的值

语法:setbit key offset value
字段描述:
offset:二进制数组中相对于0号位置的偏移量(或者下标)
value:给指定下标设置的值(0或1

设置val 二进制数组中下标为0的位置值为1(设置完后二进制数组为 10000 0000),如:

setbit val 0 1  

2)获取指定下标的值

语法:getbit key offset
字段描述:
offset:二进制数组中相对于0号位置的偏移量(或者下标)

获取val 二进制数组中下标为0位置的值,如:

getbit val 0

3)统计1的数量

语法: bitcount key

4)查询指定值第一次出现的下标

语法:bitpos key value
字段描述:
value:指定的值(0或1

5)多个二进制数组进行位运算

语法:bitop and | or | xor | not destkey key1 key2 ...
作用:将这些key进行位运算(不包含destkey),运算的结果放到destkey中
字段描述:
destkey:存放的位置
key*:所有进行位运算的二进制数组
and | or | xor | not:and,与;or或;xor,异或;not,非

6)取出二进制数组中指定范围的数据转换为十进制返回

语法:bitfield_ro key [get type offset] ...
作用:取出部分二进制数据,如0011 1100,取出0011返回(0011转为十进制为3)
字段描述:
type:第一个位置表示类型:i代表有符号整数(最高位0为正,1为负),u代表无符号整数;后面紧接着取出位的数量;如u5,代表从起始位置取出5位表示无符号整数
offset:起始偏移量(或起始下标)

假如num 的二进制形式为0011 1100,从下标为2的位置,取出4位,作为无符号整数返回(十进制结果为15)

bitfield_ro num get u4 2

7)操作二进制数组中指定范围的数据

语法:bitfield key [get type offset] [set type offset value] [incrby type offset value]
作用:操作部分二进制数据
字段描述:
type:第一个位置表示类型:i代表有符号整数(最高位0为正,1为负),u代表无符号整数;后面紧接着操作位的数量;
offset:起始偏移量(或起始下标)
value:要操作的值,可以是任意值

① bitfield key [get type offset]

作用:获取二进制数组中连续某一部分的数据转换为十进制

假如num 的二进制形式为0011 1100,从下标为2的位置,取出4位,作为无符号整数返回(十进制结果为15)

bitfield num get u4 2

② bitfield key [set type offset value]

作用:将指定部分的二进制数据的十进制形式设置为value,如果位数不够,则取最后几位;

假如num二进制为0011 1100 ,设置下标从1开始,数3位,也就是011,将8(二进制1000)赋值到这三位上,就成了000,那么num将变为0000 1100 ,操作如下:

bitfield num get u4 2

③ bitfield key [incrby type offset value]

作用:将指定部分的二进制数据加上value,保留原先长度个位

假如num二进制为0011 1100 ,那么取出下标2到3位置数据为11,转换为十进制为3,value为10,那么相加的结果就为13(二进制为1101),保留两位为01,用01替换原来的10,那么num的二进制结果为0001 1100,操作如下:

bitfield num incrby  u2 2 10


http://www.ppmy.cn/devtools/110077.html

相关文章

RLC(电阻、电感、电容)

RLC(电阻、电感、电容) 目录一、两个电阻(R1,R2),电容(C1,C2)的串联/并联公式?二、请画出这个1ms, 1V的Vin脉冲信号在Vout端的大致图像1.电路图2.…

SpringBoot开发——初步了解SpringBoot

文章目录 一、SpringBoot简介1、什么是Spring Boot2、Spring Boot的优点3、Spring Boot功能 二、Spring与Spring Boot对比三、Spring Boot与Spring MVC四、Spring Boot体系结构五、Springboot Initializr1、Spring Initializr2、Spring Initializr模块 一、SpringBoot简介 1、…

SpringMVC基于注解使用:国际化

01-国际化介绍 首先在bootstrap下载个页面 下载后把登录页面的代码粘上去 然后再登录页面代码上有些超链接需要再spring-mvc.xml里面配置下,登录页面才能正常显示 配置静态资源 国际化-根据浏览器语言国际化 现在是中文的情况,要改为英文 1.配置下属…

VScode与gitlab关联

要将VS Code与GitLab关联,您需要按照以下步骤进行操作: 在VS Code中安装Git插件。在VS Code左边的侧边栏中,点击扩展的图标(四个正方形),然后搜索并安装"Git"插件。 在GitLab上创建一个新的空项…

谷粒商城の缓存篇

文章目录 前言一、本地缓存和分布式缓存1.本地缓存2.分布式缓存 二、项目实战1.配置Redis2.整合业务代码2.1 缓存击穿2.2 缓存雪崩2.3 缓存穿透2.4 业务代码1.0版2.5 分布式锁1.0版2.6 分布式锁2.0版2.7 Spring Cache及缓存一致性问题2.7.1 Spring Cache2.7.2 缓存一致性问题2.…

《人工智能安全治理框架》1.0版

人工智能是人类发展新领域,给世界带来巨大机遇,也带来各类风险挑战落实《全球人工智能治理倡议》,遵循“以人为本、智能向善”的发展方向,为推动政府、国际组织、企业、科研院所、民间机构和社会公众等各方,就人工智能…

16 Python的包以及import和from的使用

本篇是 Python 系列教程第 16 篇,更多内容敬请访问我的 Python 合集 1 创建包 创建文件夹:首先你需要创建一个文件夹作为包的容器。添加 __init__.py文件: 在这个文件夹内需要有一个特殊的文件叫做__init__.py。这个文件可以为空&#xff0c…

spring自动装配

spring自动装配 Spring 框架提供了一种机制,称为自动装配(Autowired),它允许 Spring 容器自动将依赖注入到 Bean 中,而无需显式地使用 XML 配置文件或构造函数注入。自动装配简化了依赖注入的过程,使得代码…