你说啥?Redis中除了五大数据类型,还有特殊数据类型!

一、geospatial地理位置

1.1> 概述

可以用于基于地理位置的业务场景。比如:查询两地之间的距离,方圆几里存在的地理位置等等。

Redis提供了geospatial相关的8个指令,操作如下图所示:

1.2> GEOADD(v3.2.0)

官方文档:http://www.redis.cn/commands/geoadd.html

指令格式:GEOADD key longitude latitude member [longitude latitude member ...]

指令含义:将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。

这些数据将会存储到Zset,这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。

该命令采用标准格式的参数x,y,所以经度必须在纬度之前。这些坐标的限制是可以被编入索引的,区域面积可以很接近极点但是不能索引。

具体的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001 规定如下:

  • • 有效的经度-180度到180度
  • • 有效的纬度-85.05112878度到85.05112878度。
  • • 当坐标位置超出上述指定范围时,该命令将会返回一个错误。
  • 操作如下图所示:(经纬度查询 https://jingweidu.bmcx.com):

1.3> GEODIST(v3.2.0)

官方文档:http://www.redis.cn/commands/geodist.html

指令格式:GEODIST key member1 member2 [unit]

指令含义:返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在, 那么命令返回空值。

指定单位的参数unit必须是以下单位的其中一个:

如果用户没有显式地指定单位参数, 那么GEODIST默认使用作为单位。

GEODIST命令在计算距离时会假设地球为完美的球形,在极限情况下,这一假设最大会造成0.5%的误差。

操作如下图所示:

1.4> GEOHASH(v3.2.0)

官方文档:http://www.redis.cn/commands/geohash.html

指令格式:GEOHASH key member [member ...]

指令含义:返回一个或多个位置元素的Geohash表示。通常使用表示位置的元素使用不同的技术,使用Geohash位置52点整数编码。由于编码和解码过程中所使用的初始最小和最大坐标不同,编码的编码也不同于标准。

该命令将返回11个字符Geohash字符串,所以没有精度Geohash。返回的Geohash具有以下特性:

  • • 他们可以缩短右边的字符。它将失去精度,但仍将指向同一地区。
  • • 它可以在geohash.org网站使用,网址 http://geohash.org/ 。查询例子:http://geohash.org/sqdtr74hyu0

操作如下图所示:

1.5> GEOPOS(v3.2.0)

官方文档:http://www.redis.cn/commands/geopos.html

指令格式:GEOPOS key member [member ...]

指令含义:从key里返回所有给定位置元素的位置(经度和纬度)

因为GEOPOS命令接受可变数量的位置元素作为输入,所以即使用户只给定了一个位置元素,命令也会返回数组回复。

操作如下图所示:

1.6> GEORADIUS(v3.2.0)

官方文档:http://www.redis.cn/commands/georadius.html

指令格式:GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

指令含义:以给定的经纬度为中心,返回键包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素。范围可以使用以下其中一个单位:

在给定以下可选项时,命令会返回额外的信息:

命令默认返回未排序的位置元素。通过以下2个参数,用户可以指定被返回位置元素的排序方式:

在默认情况下,GEORADIUS命令会返回所有匹配的位置元素。虽然用户可以使用COUNT <count>选项去获取前N个匹配元素,但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时,即使只使用COUNT选项去获取少量元素,命令的执行速度也可能会非常慢。但是从另一方面来说,使用COUNT选项去减少需要返回的元素数量,对于减少带宽来说仍然是非常有用的。

操作如下图所示:

1.7> GEORADIUSBYMEMBER(v3.2.0)

官方文档:http://www.redis.cn/commands/georadiusbymember.html

指令格式:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

指令含义:这个命令和GEORADIUS命令一样,都可以找出位于指定范围内的元素,但是GEORADIUSBYMEMBER的中心点是由给定的位置元素决定的,而不是像GEORADIUS那样,使用输入的经度和纬度来决定中心点指定成员的位置被用作查询的中心。

操作如下图所示:

二、hyperloglog预估集合的基数

2.1> 概述

hyperloglog常用的使用场景,一般是非精准性的统计计数。比如:统计访问网站的UV数,商品评论数或点击量等等。

hyperloglog是一种用于计算唯一事物的概率数据结构(从技术上讲,这称为预估集合的基数)

它占用的空间很小,只需要12KB的内存,可以存储2^64不同的元素数量。但是它的统计是有小于1%的误差,所以并不适合精准统计使用场景

Redis提供了hyperloglog相关的3个指令,如下图所示:

2.2> PFADD(v2.8.9)

官方文档:http://www.redis.cn/commands/pfadd.html

指令格式:PFADD key element [element ...]

指令含义:将element集合存储到以key为变量名的HyperLogLog结构中.

操作如下图所示:

2.3> PFCOUNT(v2.8.9)

官方文档:http://www.redis.cn/commands/pfcount.html

指令格式:PFCOUNT key [key ...]

指令含义:获得指定key为变量名的HyperLogLog结构中中元素的个数

操作如下图所示:

2.4> PFMERGE(v2.8.9)

官方文档:http://www.redis.cn/commands/pfmerge.html

指令格式:PFMERGE destkey sourcekey [sourcekey ...]

指令含义:将多个HyperLogLog合并(merge)为一个新的HyperLogLog,合并后的HyperLogLog的基数接近于所有输入HyperLogLog的可见集合(observed set)的并集。合并得出的HyperLogLog会被储存在目标变量(第一个参数)里面,如果该键并不存在,那么命令在执行之前, 会先为该键创建一个空的

操作如下图所示:

三、bitmap位图

3.1> 概述

我们可以利用bitmap指定其二进制位是01,来实现类似“”or“”的相关操作。它的特点也是占用内存空间特别的小。比如,我们要记录每个用户当天是否活跃(即:是否登录过系统),那么如果我们要记录他一年的是否登录的记录,只需要365个bit即可存储。

Redis提供了位图相关的7个指令,我们只针对其中常用的3个进行操作演示。如下图所示:

3.2> SETBIT(v2.6.0)

官方文档:http://www.redis.cn/commands/setbit.html

指令格式:SETBIT key offset value

指令含义:设置或者清空keyvalue(字符串)在offset处的bit值。那个位置的bit要么被设置,要么被清空,这个由value(只能是0或者1)来决定。当key不存在的时候,就创建一个新的字符串value。要确保这个字符串大到在offset处有bit值。参数offset需要大于等于0,并且小于2^32(限制bitmap大小为512MB)。当key对应的字符串增大的时候,新增的部分bit值都是设置为0

操作如下图所示:

3.3> GETBIT(v2.2.0)

官方文档:http://www.redis.cn/commands/getbit.html

指令格式:GETBIT key offset

指令含义:获取key中某个offset位置上的值

操作如下图所示:

3.4> BITCOUNT(v2.6.0)

官方文档:http://www.redis.cn/commands/pfmerge.html

指令格式:BITCOUNT key [start end]

指令含义:获取key中从startend范围内1的个数

操作如下图所示: