文章目录

  • 一、位图bitmap简介
  • 二、位图的常用命令
  • 三、在位图中存储整数值

一、位图bitmap简介

Redis的位图是由多个二进制位组成的数组,数组中的每个二进制位都有与之对应的偏移量(也称索引),可以通过这些偏移量对位图中指定的一个或多个二进制位进行操作。

二、位图的常用命令

  • 设置二进制位的值

通过使用SETBIT命令,可以为位图指定偏移量上的二进制位设置值
语法格式:SETBIT key offset value,如

# 将mybitmap偏移量为0的位置设置值为1
SETBIT mybitmap 0 1
# 将mybitmap偏移量为1的位置设置值为0
SETBIT mybitmap 1 0
# 将mybitmap偏移量为2的位置设置值为1
SETBIT mybitmap 2 1

当用户执行SETBIT命令尝试对一个位图进行设置的时候,如果位图不存在,或者位图当前的大小无法满足用户想要执行的设置操作,那么Redis将对被设置的位图进行扩展(以字节位单位),使得位图可以满足用户的设置请求。
SETBIT命令在对二进制位进行设置后,将返回二进制位被设置之前的旧值作为结果。
与一些Redis命令可以使用负数作为偏移量的做法不同,SETBIT命令只能使用正数偏移量,尝试输入负数作为偏移量将引发一个错误

  • 获取二进制位的值

使用GITBIT命令,可以获取位图指定偏移量上的二进制位的值
语法格式: GETBIT key offset,如

# 获取mybitmap偏移量为1上的值
GETBIT mybitmap 1

如果用户输入的偏移量超过了位图目前拥有的最大偏移量,那么GETBIT命令将返回0作为结果

  • 获取位图中值为1的二进制位数量

BITCOUNT命令可用于获取位图中值为1的二进制位数量
语法格式:BITCOUNT key,如

# 获取mybitmap中值为1的二进制位数量,此处为2
BITCOUNT mybitmap

在默认情况下,BITCOUNT命令将对位图包含的所有字节中的二进制位进行统计,但也可以通过可选的start参数和end参数,让BITCOUNT只对指定字节范围内的二进制位进行统计,如

#获取mybitmap的第一个字节和第二个字节中有多少个二进制位被设置成了1
BITCOUNT mybitmap 0 1

BITCOUNT命令的start参数和end参数的值除了可以是正数之外,还可以是负数,也就是负数索引。

  • 查找第一个指定的二进制位值

可通过执行BITPOS命令,在位图中查找第一个被设置为指定值的二进制位,并返回这个二进制位的偏移量
语法格式:BITPOS key value,如

# 获取mybitmap中第一个二进制位值为1的偏移量
BITOPS mybitmap 1

和BITCOUNT命令一样,在默认情况下,BITPOS命令的查找范围将覆盖位图包含的所有二进制位,但也可以通过可选的start参数和end参数,让BITPOS命令只在指定字节范围内的二进制位中进行查找,并且start参数和end参数也可以是负数。

当用户尝试对一个不存在的位图或者一个所有位都被设置成了0的位图中查找值为1的二进制位时,BITPOS命令将返回-1作为结果。如果用户在一个所有位都被设置成1的位图中查找值为0的二进制位,那么BITPOS命令将返回位图最大偏移量加上1作为结果,因为Redis会把位图中不存在的二进制位的值看作0。

  • 执行二进制位运算

使用BITOP命令,可以对一个或多个位图执行指定的二进制位运算,并将运算结果 保存到指定的键中
语法格式:BITOP operation result_key key1 key2 …,
其中,operation参数的值可以是AND、OR、XOR、NOT中的任意一个,这4个值分别对应逻辑并、逻辑或、逻辑异或和逻辑非4种运算,其中AND、OR、XOR这3种运算允许用户使用任意数量的位图作为输入,而NOT运算只允许使用一个位图作为输入。如

BITSET mybitmap2 0 1
# 对mybitmap和mybitmap2执行或操作,并将结果存储到result_map
BITOP OR result_bitmap mybitmap mybitmap2

当BITOP命令在对两个长度不同的位图执行运算时,会将长度较短的那个位图中不存在的二进制位的值看作0。
ITOP命令在将计算结果存储到指定键中之后,会返回被存储位图的字节长度。

三、在位图中存储整数值

BITFIELD命令允许用户在位图中的任意区域存储指定长度的整数值,并对这些整数值执行加法或减法操作。

  • 对指定区域进行设置

通过使用BITFIELD命令的SET子命令,可以在位图的指定偏移量上设置一个指定类型的整数值
语法格式:BITFIELD key SET type offset value
其中type参数用于指定被设置值的类型,这个参数的值需要以i或者u为前缀,后跟被设置值的位长度,i表示被设置的值为有符号整数,而u则表示被设置的值为无符号整数;offset即为指定的偏移;value参数用于指定被设置的整数值,这个值的类型应该和type参数指定的类型一致。如果给定值的长度超过了type参数指定的类型,那么SET命令将根据type参数指定的类型截断给定值。比如,如果用户尝试将整数123(二进制表示为01111011)存储到一个u4类型的区域中,那么命令会先将该值截断为4位长的二进制数字1011(即十进制数字11),然后再进行设置。如

# 在mybitmap3偏移量为0开始的地方处设置一个值为198的8位无符号数
BITFIELD mybitmap3 SET u8 0 198

SET子命令会返回指定区域被设置之前的旧值作为执行结果。

BITFIELD命令允许用户在一次调用中执行多个子命令,比如,通过在一次BITFIELD调用中使用多个SET子命令,我们可以同时对位图的多个区域进行设置

除了根据偏移量对位图进行设置之外,SET子命令还允许根据给定类型的位长度,对位图在指定索引上存储的整数值进行设置,如

# 在索引为2,也就是第三个元素处设置值为199的8位无符号数
BITFIELD mybitmap3 SET u8 #2 199
  • 获取指定区域存储的值

通过使用BITFIELD命令的GET子命令,可以处给定的偏移量或者索引中取出指定类型的整数值
语法格式:
BITFIELD mybitmap3 GET type offset
BITFIELD mybitmap3 GET type #index
GET子命令各个参数的意义与SET子命令中同名参数的意义完全一样。

  • 执行加法操作或减法操作

除了设置和获取整数值之外,BITFIELD命令还可以对位图存储的整数值执行加法操作或者减法操作,这两个操作都可以通过INCRBY子命令实现
语法格式:
BITFIELD key INCRBY type offset increment OVERFLOW WRAP|SAT|FAIL
BIRFIELD key INCRBY type #index increment OVERFLOW WRAP|SAT|FAIL
OVERFLOW子命令去控制INCRBY子命令在发生计算溢出时的行为,参数可以是WRAP、SAT或者FAIL中的一个:
·WRAP表示使用回绕(wrap around)方式处理溢出,这也是C语言默认的溢出处理方式。在这一模式下,向上溢出的整数值将从类型的最小值开始重新计算,而向下溢出的整数值则会从类型的最大值开始重新计算。
·SAT表示使用饱和运算(saturation arithmetic)方式处理溢出,在这一模式下,向上溢出的整数值将被设置为类型的最大值,而向下溢出的整数值则会被设置为类型的最小值。
·FAIL表示让INCRBY子命令在检测到计算会引发溢出时拒绝执行计算,并返回空值表示计算失败。

在同一个BITFIELD调用中使用多个OVERFLOW子命令

需要注意的是,因为OVERFLOW子命令只会对同一个BITFIELD调用中排在它之后的那些INCRBY子命令产生效果,所以用户必须把OVERFLOW子命令放到它想要影响的INCRBY子命令之前。

BITFIELD命令并没有提供与INCRBY子命令相对应的DECRBY子命令,但是用户可以通过向INCRBY子命令传入负数增量来达到执行减法操作的效果。INCRBY子命令在执行完相应的操作之后会返回整数的当前值作为结果。

# 将mybitmap3偏移量为0处的值增加15
BITFIELD mybitmap3 INCRBY u8 0 15# 将mybitmap3索引为1处的值减去10
BITFIELD mybitmap3 INCRBY u8 #1 -10

使用位图存储整数的原因
在一般情况下,当用户使用字符串或者散列去存储整数的时候,Redis都会为被存储的整数分配一个long类型的值(通常为32位长或者64位长),并使用对象去包裹这个值,然后再把对象关联到数据库或者散列中。
与此相反,BITFIELD命令允许用户自行指定被存储整数的类型,并且不会使用对象去包裹这些整数,因此当我们想要存储长度比long类型短的整数,并且希望尽可能地减少对象包裹带来的内存消耗时,就可以考虑使用位图来存储整数。

  • 使用字符串命令对位图进行操作

Redis的位图是在字符串基础上实现的,位图键会被看作一个字符串键,因此除了可以使用前面介绍的位图命令对位图执行操作之外,还可以使用字符串命令对位图进行操作

Redis数据类型 - 位图(bitmap)相关推荐

  1. Redis 04_位图bitmap

    位图bitmap    [字节数组] 位图不是真正的数据类型,它是定义在字符串类型中 一个字符串类型的值最多能存储512M字节的内容 位上限:2^(9+10+10+3)=2^32b  --命令 设置某 ...

  2. Redis 数据类型 Strings 类型详解

    Redis 数据类型 Strings 类型详解 bitmap 操作 SETBIT • SETBIT key offset value 起始版本:2.2.0 时间复杂度:O(1) 设置或者清空key的v ...

  3. 第3节-Redis数据类型介绍以及应用

    第3节-Redis数据类型介绍以及应用 1.9大类型 String(字符类型) Hash(散列类型) List(列表类型) Set(集合类型) SortedSort(有序集合类型,简称zset) Bi ...

  4. 03 redis新类型bitmap/hyperloglgo/GEO

    亿级系统中常见的四种统计 聚合统计 统计多个集合元素的聚合结果,就是前面讲解过的交差并等集合统计 交并差集和聚合函数的应用 排序统计 抖音视频最新评论留言的场景,请你设计一个展现列表.考察你的数据结构 ...

  5. redis 用setbit(bitmap)统计活跃用户

    getspool.com的重要统计数据是实时计算的.Redis的bitmap让我们可以实时的进行类似的统计,并且极其节省空间.在模拟1亿2千8百万用户的模拟环境下,在一台MacBookPro上,典型的 ...

  6. Redis 数据类型介绍

    Redis 数据类型介绍 你也许已经知道Redis并不是简单的key-value存储,实际上他是一个数据结构服务器,支持不同类型的值.也就是说,你不必仅仅把字符串当作键所指向的值.下列这些数据类型都可 ...

  7. Redis数据类型的选择

    在Web和移动应用的业务场景中,我们经常需要保存这样一种信息:一个key对应了一个数据集合. 手机App中的每天的用户登录信息:一天对应一系列用户ID或移动设备ID: 电商网站上商品的用户评论列表:一 ...

  8. Redis 数据类型之(底层解析)

    Redis 数据类型之(底层解析) Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redi ...

  9. redis设置密码和启动 redis数据类型

    Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径.Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象. Redis运行在内存中 ...

最新文章

  1. mongo在哪创建管理员_MongoDB初始化创建管理员账户登录
  2. linux的查找命令
  3. vim中使用sed去除网上copy的源代码行号和空格
  4. android AudioTrack 播放 正弦波 方波
  5. 表单字段三维数组名_【技术汇】回转式空气预热器温度场三维数值模拟
  6. 买房贷款被拒,该如何补救?
  7. 晶科电力打造山东省最大物流港分布式光伏项目
  8. PHP生成缩略图函数
  9. 十一届蓝桥杯国赛 玩具蛇-dfs
  10. 【SpringBoot 2】(六)配置文件 web开发相关
  11. Oracle数据库一致性读的原理
  12. linux 二进制编辑工具,全网最全Linux的十大十进制编辑器,要接触Linux的你摆脱不了...
  13. 怎么使用人人译视界压制视频?人人译视界for Mac压制视频的图文教程
  14. 【软件】3DsMax2009 下载百度云盘下载(附教程)
  15. 网络编程——实验一:基于TCPUDP的网络文件服务
  16. 如何修改openwrt路由器的密码_openwrt路由器改WiFi密码_openwrt wireless密码修改
  17. spring实战笔记
  18. 记录下公司刻录新版本/repo_kitkat 命令
  19. Docker的volumes的使用
  20. 2018年保研夏令营之华东理工大学计算机

热门文章

  1. Python数据基本类型3
  2. 渔王争霸他是如何通过QQ群获得公司投资的?
  3. linux学习文档(一)
  4. iOS从初级到精通就业 UI基础-栾斌-专题视频课程
  5. win7资源管理器停止工作或总是重启
  6. typeof() c语言,C语言中的typeof关键字
  7. 「newbee-mall新蜂商城开源啦」1000 Star Get !仓库Star数破千!记录一下
  8. 使用 C++11 智能指针时要避开的 10 大错误
  9. 【摘自网易】在我最美丽的时候,遇见你
  10. [源码和文档分享]基于JAVA的葫芦娃 — 最终之战