欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Redis位图操作:getbit、setbit、bitcount

程序员文章站 2022-07-05 20:37:08
...

一、理论基础

1、数据在redis中都是二进制存储;

2、每一个非中文字符占一个字节(Byte),中文字符占两个字节,而一个字节又是占8bit。

3、位图不是一个真实的数据类型,而是定义在字符串类型上的面向位的操作的集合。

二、语法

GETBIT key offset
对 key 所储存的字符串值,获取指定偏移量上的位(bit)。

SETBIT key offset value
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。

BITCOUNT key [start] [end]
统计给定key所存储的字符串比特位为1的数量。

三、演示

1、先设置一个<key,value>对

master:6379[4]> set A a
OK
master:6379[4]> get A
"a"

"a"在redis中的二进制存储形式为:0110 0001;

master:6379[4]> getbit A 0
(integer) 0
master:6379[4]> getbit A 1
(integer) 1
master:6379[4]> getbit A 2
(integer) 1
master:6379[4]> getbit A 3
(integer) 0
master:6379[4]> getbit A 4
(integer) 0
master:6379[4]> getbit A 5
(integer) 0
master:6379[4]> getbit A 6
(integer) 0
master:6379[4]> getbit A 7
(integer) 1
master:6379[4]>

2、将上述A的值"a"的偏移量第6位修改为1,从而值从a变成了c(0110 0101)。

master:6379[4]> setbit A 6 1
(integer) 0
master:6379[4]> getbit A 6
(integer) 1
master:6379[4]> get A
"c"
master:6379[4]>

偏移量:实际上指的就是从左往右数,从0开始,偏移量是几就是几;

master:6379[4]> getbit A 0
(integer) 0
master:6379[4]> getbit A 1
(integer) 1
master:6379[4]> getbit A 2
(integer) 1
master:6379[4]> getbit A 3
(integer) 0
master:6379[4]> getbit A 4
(integer) 0
master:6379[4]> getbit A 5
(integer) 0
master:6379[4]> getbit A 6
(integer) 1
master:6379[4]> getbit A 7
(integer) 1
master:6379[4]>

3、统计位中出现1的次数[bitcount A]

master:6379[4]> get A
"c"
master:6379[4]> getbit A 0
(integer) 0
master:6379[4]> getbit A 1
(integer) 1
master:6379[4]> getbit A 2
(integer) 1
master:6379[4]> getbit A 3
(integer) 0
master:6379[4]> getbit A 4
(integer) 0
master:6379[4]> getbit A 5
(integer) 0
master:6379[4]> getbit A 6
(integer) 1
master:6379[4]> getbit A 7
(integer) 1
master:6379[4]> bitcount A
(integer) 4
master:6379[4]>

四、位图的使用场景

1、实现用户上线次数统计;

2、用户在线状态及人数统计记录;

五、使用位图的优点

位图的最大优势是有时是一种非常显著的节省空间来存储信息的方式。比如我们的id最大值是一亿,我们只需要一亿个位就行了,相当于只需要100000000/8/1024/1024=11.9M的内存;