大数据

Redis地理位置(GEO)

2019-12-13  本文已影响0人  他是人间惆怅客

description: 本文主要挖掘一下Redis地理位置具体的应用场景,与君共勉。

前篇大纲

上一篇文章我讲述了Redis里面一些有意思的应用,本篇主要总结一下Redis 在GEO地理位置中的应用,也方便节省一下大家的时间.

1、SortedSet

Sorted Set有点像Set和Hash的结合体。
和Set一样,它里面的元素是唯一的,类型是String,所以它可以理解为就是一个Set。
但是Set里面的元素是无序的,而Sorted Set里面的元素都带有一个浮点值,叫做分数(score),所以这一点和Hash有点像,因为每个元素都映射到了一个值。
Sorted Set是有序的,规则如下:
如果A.score > B.score,那么A > B。
如果A.score == B.score,那么A和B的大小就通过比较字符串来决定了,而A和B的字符串是不会相等的,因为Sorted Set里面的值都是唯一的。
Sorted Set里分数相同的元素是按照词典分数(可以理解为比较字符串)进行排序的

2、GEORADIUS

附近的站点:
 GEORADIUS  electronicBikeParkingGeoSet:021  121.363664  31.126177 200 m  WITHCOORD WITHDIST COUNT 10 ASC 
附近的车辆:
GEORADIUS  powerBikePosGeoKey:021  121.363664  31.126177 200 m  WITHCOORD WITHDIST COUNT 10 ASC 
补充:默认情况下会返回所有匹配的项目。通过使用 COUNT <count>选项,可以将结果限制为前 N 个匹配项。但是请注意,在内部,命令需要执行与匹配指定区域的项目数量成比例的努力,因此,COUNT即使只返回几个结果,使用非常小的选项查询非常大的区域也可能会很慢。另一方面,COUNT如果通常只使用第一个结果,则可以成为减少带宽使用的非常有效的方法。

3、GEORADIUSBYMEMBER

某个站点附近的成员信息
时间复杂度: O(N + log(M))其中N是由中心和半径界定的圆形区域的边界框内的元素的数量,M 是索引内的项目的数量。
该命令与 GEORADIUS 完全相同,唯一的区别在于,它不是以查询区域的中心为经度和纬度值,而是采用已存在于有序集合所代表的地理空间索引内的成员的名称。
指定成员的位置用作查询的中心

4、GEOPOS

GEOPOS electronicBikeParkingGeoSet:021 5aa80ca9fe2b4b8bb66bc6e59bdbd5ca
[{"longitude":121.36414021253586,"latitude":31.125895507022626}]
时间复杂度:每个请求成员的 O(log(N)),其中 N 是有序集合中元素的数量。
返回按键处有序集合表示的地理空间索引的所有指定成员的位置(经度,纬度)。
给定一个表示地理空间索引的有序集合,使用 GEOADD 命令填充,获取指定成员的坐标通常很有用。当通过 GEOADD 填充地理空间索引时,坐标将转换为52位地理哈希,因此返回的坐标可能不完全是用于添加元素的坐标,但可能引入小错误。
返回值:
该命令可以接受可变数量的参数,因此即使指定了单个元素,它也会始终返回一个位置数组。
该命令返回一个数组,其中每个元素是一个两元素数组,表示每个成员名称的经度和纬度(x,y)作为参数传递给该命令。
非现有元素被报告为数组的 NULL 元素。

5、GEODIST

GEODIST key member1 member2 [unit]

时间复杂度: O(log(N))

返回排序集合表示的地理空间索引中两个成员之间的距离。

给定一个表示地理空间索引的有序集合,该集合使用 GEOADD 命令填充,该命令返回指定单元中两个指定成员之间的距离。

如果一个或两个成员都缺失,则该命令返回 NULL 。

该单位必须是以下之一,并且默认为米:

*   m 为米。

*   km 为千米。

*   mi 为英里。

*   ft 为英尺。

假设地球是一个完美的球体,计算距离,因此在边缘情况下可能出现高达0.5%的误差

返回值:

[批量字符串回复](https://redis.io/topics/protocol#bulk-string-reply),具体为:

该命令以指定单位的双精度值(以字符串表示)返回距离,如果缺少一个或两个元素,则返回 NULL 。

6、ZREM

zrem key member
ZREM electronicBikeParkingGeoSet:021 5aa80ca9fe2b4b8bb66bc6e59bdbd5ca
GEO并没有提供删除成员的命令,但因为GEO底层实现是zset,所以可以借助 zrem 命令来实现删除地理位置信息。

7、GEOHASH

GEO的数据类型是zset,Redis将所有地理位置信息的geohash存在zset中
geohash字符串越长表示地理位置精度越高
两个geohash字符串越相似,两个位置距离越近
geohash和经纬度之间有着一一对应的关系
Redis GEO的命令都是基于geohash来实现的

Redis GEO是一个很新的数据结构,使用geohash和zset实现。

geohash key member [member ...]
geohash cities:locations shanghai
  1)  "wtw3sj5zbj0"
上一篇 下一篇

猜你喜欢

热点阅读