Redis数据类型之Bitmaps

一、什么是Bitmaps

  • 官网描述:Bitmaps are not an actual data type, but a set of bit-oriented operations defined on the String type. Since strings are binary safe blobs and their maximum length is 512 MB, they are suitable to set up to 2^32 different bits.

    Bitmaps不是一个真实的数据类型,只是定义在String类型上的一组面向位的操作;

    String是二进制安全的,并且最大能存512MB(512*1024*1024*8=4294967296bit),所以非常适合设置多达2^32个不同的位,

  • 位操作分为两类:

    • 固定时间的单个位操作(比如将一个位设置成1或者0或者获取它的值)
    • 操作一组位(比如计算给定位范围内设置的位的数量)
  • Bitmaps最大的优点是:可以节省大量空间。例如,在以增量用户ID表示不同用户的系统中,仅使用512 MB内存就可以记住40亿用户的一位信息(例如,知道用户是否要接收新闻通讯)。

  • 凡是只有两个状态的数据都可以用Bitmaps存储,最后用来统计,比如活跃用户和不活跃用户,登录和未登录,打卡和未打卡

二、相关命令

1. setbit

  • SETBIT key offset value 设置指定offset的位值
127.0.0.1:6379> setbit online:user 0 1 # offset表示用户id,1表示在线,0表示不在线
(integer) 0
127.0.0.1:6379> setbit online:user 1 0
(integer) 0
127.0.0.1:6379> setbit online:user 2 0
(integer) 0
127.0.0.1:6379> setbit online:user 2 2 # 只能设置0或1,否则报错
(error) ERR bit is not an integer or out of range

2. getbit

  • GETBIT key offset 获取指定offset的位值
127.0.0.1:6379> getbit online:user 0
(integer) 1
127.0.0.1:6379> getbit online:user 1
(integer) 0
127.0.0.1:6379> getbit online:user 2
(integer) 0

3. bitcount

  • BITCOUNT key [start end] 统计指定范围的bit值为1的数量
127.0.0.1:6379> bitcount online:user
(integer) 1
127.0.0.1:6379> bitcount online:user 0 -1
(integer) 1
127.0.0.1:6379> setbit online:user 3 1
(integer) 0
127.0.0.1:6379> bitcount online:user 0 -1
(integer) 2

4. bitpos

  • BITPOS key bit [start] [end] 返回字符串中被设置成指定bit的第一个位置
  • start end表示字节范围,start = 0和end = 2表示从前三个字节查找位
127.0.0.1:6379> bitpos online:user 0
(integer) 1 # 0第一次出现在下标为1的位置
127.0.0.1:6379> bitpos online:user 1
(integer) 0 # 1第一次出现在下标为0的位置
127.0.0.1:6379> setbit key 0 1 # 第0个字节第一个位
(integer) 0
127.0.0.1:6379> setbit key 1 1
(integer) 0
127.0.0.1:6379> setbit key 2 1
(integer) 0
127.0.0.1:6379> setbit key 3 0
(integer) 0
127.0.0.1:6379> setbit key 4 0
(integer) 0
127.0.0.1:6379> setbit key 5 1
(integer) 0
127.0.0.1:6379> setbit key 6 1
(integer) 0
127.0.0.1:6379> setbit key 7 1 # 第0个字节第八个位
(integer) 0
127.0.0.1:6379> setbit key 8 1 # 第1个字节第一个位
(integer) 0
127.0.0.1:6379> setbit key 9 1
(integer) 0
127.0.0.1:6379> setbit key 10 0
(integer) 0
127.0.0.1:6379> bitpos key 0
(integer) 3
127.0.0.1:6379> bitpos key 0 0 1 # 0-1字节可以在第0个字节中找到
(integer) 3
127.0.0.1:6379> bitpos key 0 1 2 # 1-2字节可以在第1个字节中找到
(integer) 10
127.0.0.1:6379> bitpos key 0 2 3 # 找不到,总共只有1byte+3bit
(integer) -1

5. bitop

  • BITOP operation destkey key [key …] 做位操作,并存储到新的key中
  • 支持四种操作:
    • and:与
    • or:或
    • not:非
    • xor:异或
127.0.0.1:6379> setbit key1 0 0
(integer) 0
127.0.0.1:6379> setbit key1 1 1 # key1 01
(integer) 0
127.0.0.1:6379> setbit key2 0 1
(integer) 0
127.0.0.1:6379> setbit key2 1 1 # key2 11
(integer) 0
127.0.0.1:6379> bitop and andres key1 key2 # key1 & key2 01
(integer) 1
127.0.0.1:6379> getbit andres 0
(integer) 0
127.0.0.1:6379> getbit andres 1
(integer) 1
127.0.0.1:6379> bitop or orres key1 key2 # key1 | key2 11
(integer) 1
127.0.0.1:6379> getbit orres 0
(integer) 1
127.0.0.1:6379> getbit orres 1
(integer) 1
127.0.0.1:6379> bitop not notres key1 # !key1 10
(integer) 1
127.0.0.1:6379> getbit notres 0
(integer) 1
127.0.0.1:6379> getbit notres 1
(integer) 0
127.0.0.1:6379> bitop xor xorres key1 key2 # 如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
(integer) 1
127.0.0.1:6379> getbit xorres 0
(integer) 1
127.0.0.1:6379> getbit xorres 1
(integer) 0

三、官方文档

https://redis.io/topics/data-types-intro#bitmaps

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值