一、位图
1. 相关介绍:
- 位图的最小单位是比特(bit),每个bit的取值只能是0或1。
- 位图不是特殊的数据结构,它的内容其实就是普通的字符串,也就是byte数组。我们可以使用普通的get/set方法直接获取和设置整个位图的内容,也可以使用位图操作getbit/setbit等将byte数组看成“位数组“来处理。
- redis的位数组是自动扩展的,如果设置了某个偏移位置超出了现有的内容范围,就会自动将位数组进行零扩充。
2. 基本使用:
a. setbit 和 getbit
- setbit key offset value:给位图指定索引设置值,返回该偏移量之前对应的值
- getbit key offset:获取位图指定索引值
具体演示如下图:
这样设置之后 s对应的位图就如下图所示:
b. bitcount、bitpos
- bitcount 用来统计指定位置范围内1的个数,bitpos用来查找指定范围内出现的第一个0或1
- bitcount key [start end]:获取位图指定范围(start到end,单位字节,如果不指定就是获取全部)位值为1的个数
- bitpos key targetbit [start] [end]:计算位图指定范围(start到end,单位为字节,如果不指定就是获取全部)第一个偏移量对应的值等于targetBit的位置
注意:start 和end参数是字节索引,也就是说指定的位范围必须是8的倍数,而不能任意指定
具体演示如下图:
c. bitop
- bitop op destkey key [key ....]:做多个bitmap的and(交集)、or(并集)、not(非)、xor(异或)操作将结果保存在destkey中。
具体演示如下图:
d. bitfield
bitfield有三个指令,分别是get,set,incrby,它们都可以对指定位片段进行读写,但是最多只能处理64个连续的位,如果超过64位,就得使用多个子指定,bitfield可以一次执行多个子指令。
- bitfield key get unum start:从第(start+1)位开始取num位,u代表是无符号数
- bitfield key get inum start:从第(start+1)位开始取num位,i代表是有符号数
具体演示如下图:
所谓有符号数是指获取的位数组中第一位是符号位,剩下的才是值。如果第一位是1那就是负数。无符号位表示非负数,没有符号位,获取的位数组全部都是值,有符号数最多可以获取64位,无符号数只能获取63位(因为redis协议中的integer是有符号数,最大64位,不能传递64位无符号值)。
e. incrby
用来指定范围内的位进行自增操作,如果增加了正数,会出现上溢出,如果增加的数负数,会出现下溢出。redis默认处理是折返,如果出现了溢出就将溢出的符号位丢掉。如果是8位无符号位数255,加1就会溢出会全部变零。如果8位有符号数127,加1就会变成-128。
具体演示如下图:
bitfield 指令提供了溢出策略子指令overflow 用户可以选择语出行为,默认是折返(wrap),还可以选择失败(fail),——报错不执行,以及饱和截断(sat)——超过了范围就停留在最大或最小值。overflow 指令只影响接下来的第一条指令,这条指令执行完后溢出策略会变成默认值折返(wrap)。
饱和截断(sat)
失败不执行(fail)
二、HyperLogLog
1.基本介绍:
- 基于HyperLogLog算法:极小空间完成独立数量统计
- 本质还是字符串
2. 使用方法
- padd key element [element...]:向 hyperloglog 添加元素
- pfcoutn key [key...]:计算 hyperloglog 的独立总数
- prmerge destkey sourcekey [sourceke...]:合并多个hyperloglog
具体演示如下图:
三、Geo
1.简单介绍
- Geo(地理信息定位):存储经纬度,计算两地距离范围计算等。
- 在使用Redis 进行Geo查询时,我们要时刻想到它的内部结构实际上 只是一个zset(skiplist),通过zset的score排序就可以得到坐标附近的其他元素,通过score还原成坐标值就可以得到元素的原始坐标。
- 在redis里面,经纬度使用52位的整数编码,放进了zset里面,zset的value是元素的key,score 是GeoHash的52位整数值,zet的score虽然是浮点数,但是对于52位的整数值,它可以无损存储。
2.基本用法
- geo key longitude latitude member (member可以多个):添加地理信息
- geopos key member [member...]:获取地理位置信息
- geodist key member1 member2 [unit]:获取两个地理位置的距离 unit:m(米)、km(千米)、mi(英里)、ft(尺)
- 获取指定位置范围内的地址位置信息集合命令:
georadius key longitude latitude radiusm|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]
georadiusbymember key member radiusm|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]
withcoord:返回结果中包含经纬度
withdist:返回结果中包含距离中心节点位置
withhash:返回结果中包含geohash
COUNT count:指定返回结果的数量
asc|desc:将返回结果按照距离中心节点的距离做升序或者降序
store key:将返回结果的地理位置信息保存到指定键
storedist key:将返回结果距离中心节点的距离保存指定键
具体演示如下图:
3.相关说明:
- since 3.2+ :在redis的3.2以后的版本才提供的功能
- type geoKey = zset
- 没有删除API:zrem key member