Redis地理位置(GEO)


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"
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容