一、Bitmap
1、概念
在redis中,可以把 Bitmaps 想象成一个以比特位为单位的数组,数组的每个单元只能存储0和1,数组的下标在 Bitmaps 中叫做偏移量
实际上他就是字符串key-value类型,只不过不同之处就在于,它可以对value进行位操作,如图
2、命令
# 设置值,key随便取,offset表示key对应value的第几位,value只能设置0或者1
# 如果第一次初始化bitmaps时,偏移量非常大,那么整个初始化过程就可能执行的比较慢,造成redis的阻塞
setbit key offset value
# 获取值
getbit key offset
# 统计值被设置成1的bit的数量
# 还有2个参数start和end,它以字节为单位,1个字节=8比特
# start表示从哪个字节组开始,end表示到哪个字节组结束,end取负数时,表示取到倒数第n个字节组
bitcount key <start> <end>
# 复合操作
# operations 位移操作符,枚举值
AND =与运算 &
OR =或运算 |
XOR =异或 ^
NOT =取反 ~
# 运算结果将被存储到result这个key中,然后输出出来
# key1 … keyn 参与运算的key,可以有多个,空格分割,not运算只能一个key
# 当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0。返回值是保存到 destkey 的字符串的长度(以字节byte为单位),和输入 key 中最长的字符串长度相等
bitop operation result key1 keyn...
# 返回指定key中第一次出现指定value(0/1)的位置
bitpos [key] [value]
我们结合实际的操作来看一下
127.0.0.1:6379> setbit bitKey 1 1
(integer) 0
127.0.0.1:6379> setbit bitKey 3 1
(integer) 0
127.0.0.1:6379> setbit bitKey 9 1
(integer) 0
127.0.0.1:6379> setbit bitKey 11 1
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> getbit bitKey 1
(integer) 1
127.0.0.1:6379> getbit bitKey 2
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> setbit bitKey2 1 1
(integer) 0
127.0.0.1:6379> setbit bitKey2 2 1
(integer) 0
127.0.0.1:6379> setbit bitKey2 10 1
(integer) 0
127.0.0.1:6379> setbit bitKey2 11 1
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> bitcount bitKey2
(integer) 4
127.0.0.1:6379> bitcount bitKey2 0 0
(integer) 2
127.0.0.1:6379> bitcount bitKey2 0 -1
(integer) 4
# 使用与计算来bitKey bitKey2中值为1的bit位的交集,输出到k1_and_k2这个key中,下面的2表示k1_and_k2的位数
127.0.0.1:6379> bitop and k1_and_k2 bitKey bitKey2
(integer) 2
127.0.0.1:6379> bitcount k1_and_k2
(integer) 2
# 使用或计算来bitKey bitKey2中值为1的bit位的并集,输出到k1_or_k2这个key中,下面的2表示k1_or_k2的位数
127.0.0.1:6379> bitop or k1_or_k2 bitKey bitKey2
(integer) 2
127.0.0.1:6379> bitcount k1_or_k2
(integer) 6
127.0.0.1:6379> getbit k1_or_k2 3
(integer) 1
127.0.0.1:6379> getbit k1_or_k2 5
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> bitpos k1_or_k2 1
(integer) 1
127.0.0.1:6379> bitpos k1_and_k2 1
(integer) 1
127.0.0.1:6379>
二、HyperLogLog
1、用途
Redis中HyperLogLog主要是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的,可以理解为在一个很庞大的数据中,获取不重复的数据
例如:
一组数据{1,2,3,5,7,5,7,8},它的基数集为{1,2,3,5,7,8},基数为6
2、命令
# 添加指定元素到 HyperLogLog 中
pfadd key element [element ...]
# 返回给定 HyperLogLog 的基数估算值
pfcount key [key ...]
# 将多个 HyperLogLog 合并为一个 HyperLogLog
pfmerge destkey sourcekey [sourcekey ...]
结合一个例子看一下
127.0.0.1:6379> pfadd k1 "java" "C" "python"
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> pfadd k1 "java" "C++"
(integer) 1
127.0.0.1:6379> pfcount k1
(integer) 4
127.0.0.1:6379>
127.0.0.1:6379> pfadd k2 "music" "basketball"
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> pfcount k2
(integer) 2
127.0.0.1:6379>
127.0.0.1:6379> pfcount k1 k2
(integer) 6
127.0.0.1:6379>
127.0.0.1:6379> pfmerge k1_add_k2 k1 k2
OK
127.0.0.1:6379>
127.0.0.1:6379> pfcount k1_add_k2
(integer) 6
127.0.0.1:6379>
三、Geospatial
1、用途
Redis GEO 主要用于存储地理位置信息(经度和纬度),并对存储的信息进行操作
经度范围-180到180,维度范围-85.05112878到85.05112878,超出这个范围就报错
2、命令
# 添加地理位置的坐标,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中
geoadd key longitude latitude member [longitude latitude member ...]
# 获取地理位置的坐标
geopos key member [member ...]
# 计算两个位置之间的距离,可以指定返回值的单位,米、千米、英尺、英里
geodist key member1 member2 [m|km|ft|mi]
# 根据用户给定的经纬度坐标来获取指定范围内的地理位置集合
georadius key longitude latitude radius m|km|ft|mi
# 根据用户给定的元素坐标来获取指定范围内的地理位置集合
GEORADIUSBYMEMBER key member radius m|km|ft|mi
结合例子看下
127.0.0.1:6379> geoadd city 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
127.0.0.1:6379>
127.0.0.1:6379> geopos city Palermo
1) 1) "13.36138933897018433"
2) "38.11555639549629859"
127.0.0.1:6379> geodist city Palermo Catania
"166274.1516"
127.0.0.1:6379>
127.0.0.1:6379> geodist city Palermo Catania KM
"166.2742"
127.0.0.1:6379> georadius city 15 37 100 km
1) "Catania"
127.0.0.1:6379> georadius city 15 37 200 km
1) "Palermo"
2) "Catania"
127.0.0.1:6379>
127.0.0.1:6379> georadiusbymember city Palermo 200 km
1) "Palermo"
2) "Catania"
127.0.0.1:6379>