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 的使用场景–独立用户统计
- 使用 set 和 bitMap
- 每天有1000个人访问
数据类型 | 占用空间 | 储存的用户量 | 内存量 |
---|---|---|---|
set | 32位 | 1000 | 32*1000 = 3.9k |
bitMap | 1位 | 1000 | 1*1000 = 0.9k |
之前准备学习的时候写博客,可是都没有坚持下去,希望这次可以有始有终。
Redis 坚持第一天 :为什么要使用 redis ?
Redis 坚持第二天 :Redis 的安装与启动
Redis 坚持第三天 :Redis 使用配置文件启动,常见配置学习。
Redis 坚持第四天 :
- Redis 五种常见的数据结构:String
- Redis 五种常见的数据结构:Hash
- Redis 五种常见的数据结构:List
- Redis 五种常见的数据结构:Set
- Redis 五种常见的数据结构:zset
Redis 坚持第五天 :Redis 客户端:Jredis 和 spring-data-redis 整合。
Redis 坚持第六天 :Redis 慢查询日志。
Redis 坚持第七天 :Redis pipeline。
Redis 坚持第八天 :Redis 发布订阅。
Redis 坚持第九天 :Redis bitmp。