Redis bitmap - Go语言中文社区

Redis bitmap


Redis bitmap 不是实际的数据类型,而是在字符串类型上定义的一组面向位的操作。因为字符串是二进制安全blob和他们的最大长度是512 MB,他们适合设置2 ^ 32个不同的部分。

位操作分为两组:恒定时间单位操作,如将位设置为1或0,或获取其值,以及对位组进行操作,例如计算给定位范围内的设置位数(例如,人口统计)。

位图的最大优势之一是它们在存储信息时通常可以节省大量空间。例如,在通过增量用户ID表示不同用户的系统中,可以使用仅512MB的存储器记住40亿用户的单个位信息(例如,知道用户是否想要接收新闻通讯)。

127.0.0.1:6379> setbit mykey 7 1
(integer) 0
127.0.0.1:6379> setbit mykey 7 0
(integer) 1
127.0.0.1:6379> get mykey
"x00"

使用SETBIT和GETBIT命令设置和检索位:
SETBIT命令将位数作为其第一个参数,将第二个参数作为设置该位的值,即1或0.如果寻址位超出当前字符串长度,则命令会自动放大字符串。

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

SETBIT key offset value

设置或者清空key的value(字符串)在offset处的bit值。

那个位置的bit要么被设置,要么被清空,这个由value(只能是0或者1)来决定。当key不存在的时候,就创建一个新的字符串value。要确保这个字符串大到在offset处有bit值。参数offset需要大于等于0,并且小于232(限制bitmap大小为512)。当key对应的字符串增大的时候,新增的部分bit值都是设置为0。

返回值:在offset处原来的bit值

127.0.0.1:6379> setbit mykey 10 1
(integer) 0
127.0.0.1:6379> setbit mykey 5 1
(integer) 0

这里我们设置了第10位为1,那么 前面 9位都为0。如下:
在这里插入图片描述
后面将第5位也设置成了1:
在这里插入图片描述
因此,但我们不设置值时,会默认设置成0。因此但我们偏移量设置成1000万的时候,前面都会默认填充 0。因此非常耗费内存,不要过于大。

GETBIT key offset

返回key对应的string在offset处的bit值; 当offset超出了字符串长度的时候,这个字符串就被假定为由0比特填充的连续空间。当key不存在的时候,它就认为是一个空字符串,所以offset总是超出范围,然后value也被认为是由0比特填充的连续空间。到内存分配。

127.0.0.1:6379> getbit mykey 25
(integer) 0

BITCOUNT key [start end]

统计字符串被设置为1的bit数.

一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start 或 end 参数,可以让计数只在特定的位上进行。

start 和 end 参数的设置和 GETRANGE 命令类似,都可以使用负数值:比如 -1 表示最后一个位,而 -2 表示倒数第二个位,以此类推。

不存在的 key 被当成是空字符串来处理,因此对一个不存在的 key 进行 BITCOUNT 操作,结果为 0 。

返回结果:被设置为 1 的位的数量

127.0.0.1:6379> bitcount mykey
(integer) 2
127.0.0.1:6379> bitcount mykey 0 10
(integer) 2
127.0.0.1:6379> bitcount mykey 0 0
(integer) 1

BITOP operation destkey key [key …]

对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。

BITOP 命令支持 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种参数。
除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入。
执行结果将始终保持到destkey里面。

127.0.0.1:6379> bitop and deskey mykey hello
(integer) 3
127.0.0.1:6379> bitcount deskey 0 -1
(integer) 1

BITPOS key bit [start] [end]

返回字符串里面第一个被设置为1或者0的bit位。

返回一个位置,把字符串当做一个从左到右的字节数组,第一个符合条件的在位置0,其次在位置8,等等。

127.0.0.1:6379> bitpos mykey 1
(integer) 5
127.0.0.1:6379> bitpos mykey 0
(integer) 0
127.0.0.1:6379> bitcount mykey 0 4
(integer) 4

bitMap 的使用场景–独立用户统计

  1. 使用 set 和 bitMap
  2. 每天有1000个人访问
数据类型占用空间储存的用户量内存量
set32位100032*1000 = 3.9k
bitMap1位10001*1000 = 0.9k

之前准备学习的时候写博客,可是都没有坚持下去,希望这次可以有始有终。
Redis 坚持第一天 :
为什么要使用 redis ?
Redis 坚持第二天 :Redis 的安装与启动
Redis 坚持第三天 :Redis 使用配置文件启动,常见配置学习。
Redis 坚持第四天 :

  1. Redis 五种常见的数据结构:String
  2. Redis 五种常见的数据结构:Hash
  3. Redis 五种常见的数据结构:List
  4. Redis 五种常见的数据结构:Set
  5. Redis 五种常见的数据结构:zset

Redis 坚持第五天 :Redis 客户端:Jredis 和 spring-data-redis 整合。
Redis 坚持第六天 :Redis 慢查询日志。
Redis 坚持第七天 :Redis pipeline。
Redis 坚持第八天 :Redis 发布订阅。
Redis 坚持第九天 :Redis bitmp。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/tx542009/article/details/87946136
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-16 02:52:33
  • 阅读 ( 1372 )
  • 分类:Redis

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢