Redis三种特殊数据类型:bitmaps位图、hyperloglog基数统计 和 geospatial 地理空间
一、介绍
位图计算。Redis提供的Bitmaps可以实现对位的操作。Bitmaps本身不是一种数据结构,实际上就是字符串,可以对字符串的位进行操作。
可以把Bitmaps想象成一个以位为单位数组,数组中的每个单元只能存0或者1,数组的下标在bitmaps中叫做偏移量。单个bitmaps的最大长度是512MB,即2^32个比特位。
优点
- 省空间:基于最小的单位bit进行存储
- 效率高:设置时候时间复杂度O(1)、读取时候时间复杂度O(n),操作是非常快的
限制
redis中bit映射被限制在512MB之内,所以最大是2^32位。建议每个key的位数都控制下,因为读取时候时间复杂度O(n),越大的串读的时间花销越多。
二、操作命令
命令 | 功能 | 描述 |
setbit | 设置 | 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit) ,只能是0和1 |
getbit | 获取 | 对 key 所储存的字符串值,获取指定偏移量上的位(bit) |
bitcount | 计算 | 计算key的字符串值中,被设置为 1 的bit的数量 |
1、setbit 向key中存储的字符串设置位的值 (添加)
语法:setbit key offset value
# 案例一:可以计算周一到周日的打卡,用0或1区分 是否打卡
127.0.0.1:6379> setbit sign 0 1 # 设置sign这个key,在第0位上的值为1(周一)
(integer) 0
127.0.0.1:6379> setbit sign 1 1 # 第一位上的值为1(周二)
(integer) 0
127.0.0.1:6379> setbit sign 2 0 # 第二位上的值为0(周三)
(integer) 0
127.0.0.1:6379> getbit sign 2 # 获取sign这个key第二位上的值是0还是1(周三)
(integer) 0
——————可以理解为,每天打开的状态,每一天占坑,坑里用0和1 来区分状态
# 案例二:操作位的偏移量
127.0.0.1:6379> set str a # 使用set设置一个名为str的key,值为:"a"
OK
127.0.0.1:6379> get str # 获取字符串值
"a"
127.0.0.1:6379> getbit str 6 # 获取str的键的值在第6位是什么
(integer) 0 # 值是“0”
127.0.0.1:6379> setbit str 6 1 操作位数,设置第6位的位置的值为1
(integer) 0
127.0.0.1:6379> get str # 获取字符串值
"c" # 字符串值由“a" 变成了"c"
——————更改字符串的ascii码,位数上的值
案例二:设置一个名为 str
其中a的Ascii 值是97,97 的二进制是 1100 001,上述 setbit str 6 1 命令,就是把str对应的二进制的 第6位(从左往右数),改为1,即 1100 001 ——> 1100 011,即十进制数是99,对应的字符为 "c"
2、bitcount 计算位的值是1的个数 (计算)
语法:bitcount key [start end]
# 获取str键的值
127.0.0.1:6379> get str
"c"
# (对应的ascii码是:1100 011)统计被设置为1的 位的数量
127.0.0.1:6379> bitcount str
(integer) 4
三、总结
bitmap位图,都是操作二进制位来进行记录,就只有0和1两个状态!
统计一年的是否打卡状态,365天 = 365 bit(位数) 1字节=8bit 总共也就占46个字节左右!