一、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指定其二进制位是0
或1
,来实现类似“是
”or“否
”的相关操作。它的特点也是占用内存空间特别的小。比如,我们要记录每个用户当天是否活跃(即:是否登录过系统),那么如果我们要记录他一年的是否登录的记录,只需要365个bit即可存储。
Redis提供了位图相关的7个
指令,我们只针对其中常用的3个
进行操作演示。如下图所示:
3.2> SETBIT(v2.6.0)
官方文档:http://www.redis.cn/commands/setbit.html
指令格式:SETBIT key offset value
指令含义:设置或者清空key
的value
(字符串)在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
中从start
到end
范围内1
的个数
操作如下图所示: