redis之位图

目录

一:概念

二:命令(先创建一个string类型的key)

1:设置某一位上的值

2:获取某一位上的值

3:返回指定值0或者1在指定区间上第一次出现的位置

4:位操作

5:统计指定位区间上值为1的个数

 三:案例

1:网站用户的上线次数统计(活跃用户)

 2:按天统计网站活跃用户


一:概念

位图不是真正的数据类型,它是定义在字符串类型中

一个字符串类型的值最多能存储512M字节的内容

位上限:2^(9+10+10+3)=2^32b

string转换成bit剩下的不是null而是0,在redis中0不是数据

二:命令(先创建一个string类型的key)

1:设置某一位上的值

SETBIT key offset value

offset偏移量,从0开始

value不写,默认是0

 

2:获取某一位上的值

GETBIT key offset

3:返回指定值0或者1在指定区间上第一次出现的位置

BITPOS key bit [start] [end]((指的是位)

例如:a 0110 0001获取 大于7的时候是0 用不用都在那里最大是512*1024*1024*8

b 0110 0001

ab 会是0110 0001 0110 0001

4:位操作

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

operation 可以是 AND(都为1才为1) 、 OR(有1则1) 、 NOT 、 XOR(都是0或者都为1才为1否则为0) 这四种操作中的任意一种

BITOP AND destkey key [key ...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey

BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey

BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey

BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey

除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入

当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0

空的 key 也被看作是包含 0 的字符串序列

a --> 01100001
b --> 01100010

and
BITOP and dest1 a b
a and b --->  01100000


or 
BITOP or dest2 a b
a or b --> 01100011


xor 
BITOP xor dest2 a b
a or b --> 00000011

not 
BITOP not dest4 a
a  ---> 10011110

redis的数据再内存中,位运算效率极高

5:统计指定位区间上值为1的个数

BITCOUNT key [start] [end]区间不给默认是所有

从左向右从0开始,从右向左从-1开始,注意官方start、end是位,测试后是字节按照8位一个区间一个位图来进行计算

BITCOUNT testkey 0 0表示从索引为0个字节到索引为0个字节,就是第一个字节的统计

BITCOUNT testkey 0 -1等同于BITCOUNT testkey

最常用的就是 BITCOUNT testkey

 三:案例

1:网站用户的上线次数统计(活跃用户)

分析:

用户ID为key,天作为offset,上线置为1

例如:ID为500的用户,今年的第1天上线、第30天上线 SETBIT u500 1 1 SETBIT u500 30 1

用:BITCOUNT u500 KYES u*

 2:按天统计网站活跃用户

分析:

天作为key,用户ID为offset,上线置为1

例如:求一段时间内活跃用户数 SETBIT 20160602 15 1

SETBIT 20160601 123 1 SETBIT 20160606 123 1

求6月1日到6月10日的活跃用户

BITOP OR 20160601-10 20160601 20160602 20160603 20160610

BITCOUNT 20160601-10 结果为2

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值