广告
返回顶部
首页 > 资讯 > 数据库 >redis中的位图是什么意思
  • 631
分享到

redis中的位图是什么意思

2024-04-02 19:04:59 631人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关Redis中的位图是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。位图位图,即大量bit组成的一个数据结构(每个bit只能是0和1),

这篇文章将为大家详细讲解有关Redis中的位图是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

位图

位图,即大量bit组成的一个数据结构(每个bit只能是0和1),主要适合在一些场景下,进行空间的节省,并有意义的记录数据,

例如一些大量的bool类型的存取,一个用户365天的签到记录,签到了是1,没签到是0,如果用普通的key/value进行存储,当用户量很大的时候,需要的存储空间是很大的。

如果使用位图进行存储,一年365天,用365个bit就可以存储,365个bit换算成46个字节(一个稍长的字符串),如此就节省了很多的存储空间,

redis中的位图是什么意思

位图的本质其实是一个普通的字符串,也就是byte数组,可以使用get/set直接获取和设置整个位图的内容,也可以使用 getbit/setbit 将byte数组看成bit数组来处理。【相关推荐:Redis视频教程

使用位操作设置字符串

正常设置字符串都使用set命令,下面我们使用setbit设置一下位数组,最后以获取字符串的形式获取,

首先我们获取一下h、e两个ASCII码使用二进制的表示如下,

redis中的位图是什么意思

可以看到h的二进制码是 01101000 , e的二进制码是 01100101,我们只需要注意bit是1的位置,然后进行setbit,

redis中的位图是什么意思

需要注意的是,位数组的顺序和字符的位顺序是反的,根据这个原则,我们算出 h字符 每个1的位置分别是1/2/4, e字符的则是 9/10/13/15,

redis中的位图是什么意思

所以我们将使用setbit设置一个位数组,并在每个位置上(1/2/4/9/10/13/15)设置对应的1,

setbit data 1 1
setbit data 2 1
setbit data 4 1
setbit data 9 1
setbit data 10 1
setbit data 13 1
setbit data 15 1

零存整取

redis中的位图是什么意思

最后直接 get data这个key,会发现正好得到he,

redis中的位图是什么意思

setbit + get 的组合称为 零存整取,零存就是一个bit一个bit的设置,整取就是通过key名字,直接get出来所有的数据,

同样,我们还可以进行 零存零取,整存零取,整存就是直接使用字符串设置整个位数组,零取则是通过bit的位置,进行bit的获取。

零存零取

可以看到,我们根据setbit,对key叫做w的位数组进行bit设置,只设置了1/2/4这3个位置的值为1,下图中有getbit w 3, 获取第三个位置的值,此时默认是0,如果从业务角度触发,可以理解为,一共签到4天,第三天没有进行签到,

redis中的位图是什么意思

整存零取

下午所示,我们对w的这个key,直接set了一个h字符,随后通过getbit获取w的位数组里的每个bit,可以看到获取出来的内容和上面h字符的二进制内容相同 1/2/4的位置是1,其余是0

redis中的位图是什么意思

注意

  • redis的位数组是自动扩充的,如果设置的某个偏移位置超出了现有的内容范围,就会自动将位数组进行零扩充,即扩容的位默认都是0值。

  • 如果对应位的字节是不可打印字符,redis-cli将会显示该字符的十六进制形式。

  • 一个字节是8个bit(位),要区分字节和位。

统计和查找 (bitcount/bitpos)

redis提供了 统计指令 bitcount  和  位图查找指令 bitpos ,

bitcount用来统计指定位置范围内1的个数,bitpos用来查找指定范围内出现的第一个0或1。

我们可以通过bitcount统计用户一共签到了多少天,通过bitpos指令查找用户从哪一天开始第一次签到,

如果指定了范围参数[start, end],就可以统计在某个时间范围内用户签到了多少天以及用户自某天以后的哪天开始签到,

但是需要注意的是,start和end参数是字节索引,也就是说,指定的位范围必须是8的倍数,

而不能任意指定,所以我们无法直接计算某个月内用户签到了多少天,如果需要计算的话,

可以使用getrange命令取出该月覆盖的字节内容,然后在内存中进行统计,例如2月覆盖了10-12个字节,就使用 getrange w 8 12 。

127.0.0.1:6379> set w hello    

OK

127.0.0.1:6379> bitcount w      # 所有字符中有多少个1

(integer) 21

127.0.0.1:6379> bitcount w 0 0   # 第一个字符中 1 的位数

(integer) 3

127.0.0.1:6379> bitcount w 0 1   # 前两个字符中 1 的位数

(integer) 7

127.0.0.1:6379> bitpos w 0       # 第一个 0 位

(integer) 0

127.0.0.1:6379> bitpos w 1       # 第一个 1 位

(integer) 1

127.0.0.1:6379> bitpos w 1 1 1       # 从第二个字符算起,第一个1位

(integer) 9

127.0.0.1:6379> bitpos w 1 2 2       # 从第三个字符算起,第一个1位

(integer) 17

bitfield

之前介绍的 setbit / getbit 指定位的值都是单个位,如果要一次操作多个位,就必须使用管道来处理,

在redis3.2以后,提供了bitfield指令,可以一次对多个位进行操作,bitfield有三个子指令,分别是get/set/incrby, 都可以对指定位片段进行读写,

但是最多只能处理64个连续的位,如果超过64位,就需要使用多个子指令,bitfield可以一次执行多个子指令。

示例

下面对下图的位数组使用 bitfield 做一些操作

redis中的位图是什么意思

127.0.0.1:6379> bitfield w get u4 0   # 从第1个位开始取4个位,结果是无符号数(u)

1) (integer) 6

127.0.0.1:6379> bitfield w get u3 2   # 从第3个位开始取3个位,结果是无符号数(u)

1) (integer) 5

127.0.0.1:6379> bitfield w get i4 0   # 从第1个位开始取4个位,结果是有符号数(i)

1) (integer) 6

127.0.0.1:6379> bitfield w get i3 2   # 从第3个位开始取3个位,结果是有符号数(i)

1) (integer) -3

有符号数是指获取的位数组中的第一个位是符号位,剩下的才是值,如果第一位是1,就是负数,

无符号数表示非负数,没有符号位,获取的位数组全部都是值,有符号数最多可以获取64位,

无符号数只能获取63位,因为redis协议中的integer是有符号数,最大64位,不能传递64位的无符号值,

如果超出位数限制,redis就会告诉你参数错误。

上面的指令可以合并成一条指令,可以看到得到的结果是一样的,

bitfield w get u4 0 get u3 2 get i4 0 get i3 2

redis中的位图是什么意思

set修改

我们从第9个位开始,用8个无符号数替换已经存在的8个位,其实就是把第二个字符替换了,由e变成a(它的ASCII码是97),可以看到结果也变成了 hallo

127.0.0.1:6379> bitfield w set u8 8 97

1) (integer) 101

127.0.0.1:6379> get w

"hallo"

incrby

incrby对指定范围的位进行自增操作,即++,这可能会发生溢出,如果增加了正数,会出现上溢出,如果增加的是负数,会出现下溢出,

redis默认的处理是折返,即如果出现了溢出,就将溢出的符号位丢掉,例如,如果是8位无符号数255,加1后就全部变成0,如果是8位有符号数127,加1后就溢出变成-128。

redis中的位图是什么意思

依然根据hello字符,来演示一下 incrby

127.0.0.1:6379> set w hello

OK

127.0.0.1:6379> bitfield w get u4 2     # 从第3位开始取4个无符号整数,第一次是10

1) (integer) 10

127.0.0.1:6379> bitfield w incrby u4 2 1

1) (integer) 11

127.0.0.1:6379> bitfield w incrby u4 2 1

1) (integer) 12

127.0.0.1:6379> bitfield w incrby u4 2 1

1) (integer) 13

127.0.0.1:6379> bitfield w incrby u4 2 1

1) (integer) 14

127.0.0.1:6379> bitfield w incrby u4 2 1

1) (integer) 15
127.0.0.1:6379> bitfield w incrby u4 2 1   #到这里的时候,已经溢出折返成0了

1) (integer) 0

bitfield指令提供溢出策略子指令 overflow,用户可以选择溢出行为,默认是折返(wrap),还可以选择失败(fail) 即报错不执行,还有饱和截断(sat) 即超过范围就停留在最大或最小值,

overflow指令只影响接下来的第一条指令,这条指令执行完以后,溢出策略就会变成默认值 折返(wrap)。

饱和截断

127.0.0.1:6379> set w hello

OK

127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1

1) (integer) 11

127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1

1) (integer) 12

127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1

1) (integer) 13

127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1

1) (integer) 14

127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1

1) (integer) 15

127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1 # 接下来的都将是保持最大值

1) (integer) 15

127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1

1) (integer) 15

127.0.0.1:6379> bitfield w overflow sat incrby u4 2 1

1) (integer) 15

失败不执行

127.0.0.1:6379> set w hello

OK

127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1

1) (integer) 11

127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1

1) (integer) 12

127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1

1) (integer) 13

127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1

1) (integer) 14

127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1

1) (integer) 15

127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1 # 接下来的都是失败

1) (nil)

127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1

1) (nil)

127.0.0.1:6379> bitfield w overflow fail incrby u4 2 1

1) (nil)

get/set/incrby一起执行

127.0.0.1:6379> bitfield w set u4 1 0 get u4 1 incrby u4 2 1

1) (integer) 0

2) (integer) 0

3) (integer) 1

127.0.0.1:6379> get w

"\x04ello"

关于“redis中的位图是什么意思”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: redis中的位图是什么意思

本文链接: https://www.lsjlt.com/news/69899.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • redis中的位图是什么意思
    这篇文章将为大家详细讲解有关redis中的位图是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。位图位图,即大量bit组成的一个数据结构(每个bit只能是0和1),...
    99+
    2022-10-19
  • redis是什么意思
    这篇文章主要介绍redis是什么意思,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Va...
    99+
    2022-10-18
  • php中redis是什么意思
    本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑Redis是Remote Dictionary Server(远程数据服务)的缩写,由意大利人Antirez(Salvatore Sanfilippo)开发的一款内存高...
    99+
    2020-11-20
    php redis
  • redis指的是什么意思
    这篇文章主要介绍了redis指的是什么意思,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。Redis是一个开源的使用ANSI C语言编写、支持网络...
    99+
    2022-10-18
  • redis集群的意思是什么
    redis集群的意思是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Redis集群介绍Redis 集群是一个提供在多个Redis间节点间共...
    99+
    2022-10-18
  • redis error指的是什么意思
    了解redis error指的是什么意思?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!redis error就是redis...
    99+
    2022-10-18
  • redis中宕机指的是什么意思
    小编给大家分享一下redis中宕机指的是什么意思,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!宕机是计算机术语,口语里面我们简单...
    99+
    2022-10-18
  • redis当中的复制是什么意思
    这篇文章主要讲解了“redis当中的复制是什么意思”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“redis当中的复制是什么意思”吧!在redis中,用户可以...
    99+
    2022-10-18
  • redis缓存是什么意思
    这篇文章主要介绍redis缓存是什么意思,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! Redis缓存是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日...
    99+
    2022-10-18
  • redis推送是什么意思
    redis推送是一种特性,能将数据推到某个信息管道中,然后其它客户端可通过订阅这些管道来获取推送过来的信息,是由使用Redis的Pub/Sub来实现,接收方在某个channel注册为一个订阅者,然后监听这个channel,一旦有消息发到这个...
    99+
    2022-10-16
  • redis热点是什么意思
    Redis热点是指在Redis中频繁访问的数据集或键,也就是被大量读取或写入的数据。由于Redis是基于内存的键值存储系统,热点数据...
    99+
    2023-08-24
    redis
  • css中的绝对定位是什么意思
    本篇内容主要讲解“css中的绝对定位是什么意思”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css中的绝对定位是什么意思”吧! 绝对...
    99+
    2022-10-19
  • Redis中的主从复制是什么意思
    本篇内容介绍了“Redis中的主从复制是什么意思”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-18
  • css中绝对定位是什么意思
    CSS中的绝对定位是一种常用的布局技术,用于精确地控制元素在页面上的位置,相比于其他定位方式,如相对定位和固定定位,绝对定位可以使元素脱离文档流,独立于其他元素进行定位,通过设置元素的定位属性和坐标值,可以将元素放置在指定的位置上,而不受其...
    99+
    2023-10-23
    css 绝对定位
  • mysql位类型是什么意思
    这篇文章主要讲解了“mysql位类型是什么意思”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql位类型是什么意思”吧!说明对BIT类型来说,用来存放位字段值,BIT(M)可用于存放多位...
    99+
    2023-06-20
  • Redis持久化是什么意思
    这篇文章给大家分享的是有关Redis持久化是什么意思的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。演示环境centos7.0 redis4.0 redis存放目录:/usr/lo...
    99+
    2022-10-18
  • css里定位指的是什么意思
    这篇“css里定位指的是什么意思”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“css里定位指的是什么意思”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通...
    99+
    2022-10-19
  • 上位机开发是什么意思
    上位机开发是指在上位机(也称为控制计算机或操作员终端)上进行的计算机程序开发。上位机通过串口或网络等通信方式与下位机(通常是嵌入式系统或PLC)进行通信,对下位机进行控制和监控。上位机开发通常被广泛应用于工业自动化、仪器仪表、医疗设备等领域...
    99+
    2023-10-27
    上位机开发
  • css中定位中的absolute和relative的意思是什么
    这篇文章主要讲解了“css中定位中的absolute和relative的意思是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“css中定位中的absolu...
    99+
    2022-10-19
  • redis学习之NoSQL是什么意思
    小编给大家分享一下redis学习之NoSQL是什么意思,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、互联网时代背景下大机遇,为什么用NoSQL1.1单机MySQL的美好年代在90年代,...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作