Redis的Bitmap、HyperLogLog和Geo

一、位图

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 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值