在redis3.2版本中,增加了geohash的扩展,这下可以使用Redis来作更多有意思的事情了。

GEO相关命令

主要相关的命令有一下这些

  • GEOADD
  • GEODIST
  • GEOHASH
  • GEOPOS
  • GEORADIUS
  • GEORADIUSBYMEMBER

下面开始一一说明这些命令的作用:

GEOADD

从这个命令的名字来开,大概就可以猜测到它的作用,即向REDIS中增加一条和地理位置相关的数据。 使用语法:

1
2
GEOADD dataset latitude longtitude place [latitude longtitude place]...

其中,dataset表示一个数据集,在这个数据集中可以存储多个地名(place),latitude和longtitude各表示纬度和经度,一次GEOADD可以添加多个place。 示例:

1
GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"

上边的操作,就完成了向Sicily数据集中增加Palermo和Catania这两条信息,在增加完成时,redis-cli返回完成添加的数据条目数。

GEODIST

这条命令会返回在一个GEO数据集中两个地点之间的距离,如果其中一个或者两个地点都不再GEO数据集中,返回NULL。 返回的距离默认单位是米,不过还可以使用其他的单位主要包括:

  • km(千米)
  • mi (英里)
  • ft (英尺)

使用方法如下:

1
2
3
GEODIST Sicily Palermo Catania
GEODIST Sicily Palermo Catania km
GEODIST Sicily Palermo Catania mi

这样,根据最后的单位,返回不同的数值。

GEOHASH

用这条命令可以返回一个或多个已经存入redis地点的11位Geohash码,使用方法如下:

1
GEOHASH Sicily Palermo Catania

返回结果是这样的

1
2
3
1) "sqc8b49rny0"
2) "sqdtr74hyu0"

GEOPOS

这个命令,可以返回在GEOSET里边指定地点的经纬度,用法如下:

1
GEOPOS Sicily Palermo Catania

返回结果如下:

1
2
3
4
5
1) 1) "13.361389338970184"
   2) "38.115556395496299"
2) 1) "15.087267458438873"
   2) "37.50266842333162"

GEORADIUS

顾名思义,这个命令返回的是指定地点半径范围内的所有匹配地点,类似与缓冲区分析,这个缓冲区的范围单位跟GEODIST命令中所用的一样有m(米),km(千米),mi(英里),ft(英尺)。 另外这个命令还有另外的选项:

  • WITHDIST 返回结果除了匹配点以外,还返回匹配点距离中心点的距离;
  • WITHCOORD 返回结果除匹配点外,还包含匹配点的经纬度;
  • WITHASH 返回结果初匹配点外,还包含匹配点的geohash码。

默认的返回结果是一个无序的集合,使用命令ASC或DESC可以使匹配点按照距离中心点的远近排序返回。 同时,默认情况下,匹配点会全数返回,增加COUNT命令,可以返回指定数量的匹配结果。 命令用法如下:

WITHDIST

1
GEORADIUS Sicily 15 37 200 km WITHDIST

对应返回

1
2
3
4
1) 1) "Palermo"
   2) "190.4424"
2) 1) "Catania"
   2) "56.4413"

WITHCOORD

1
GEORADIUS Sicily 15 37 200 km WITHCOORD

对应返回

1
2
3
4
5
6
1) 1) "Palermo"
   2) 1) "13.361389338970184"
      2) "38.115556395496299"
2) 1) "Catania"
   2) 1) "15.087267458438873"
      2) "37.50266842333162"

GEORADIUSBYMEMBER

这个命令和GEORADIUS使用方法类似,不过这个指定中心点不是经纬度,而是一个地点。

1
GEORADIUSBYMEMBER Sicily Palermo  200 km

返回如下

1
2
1) "Palermo"
2) "Catania"

总结

增加了GEO特性的redis,我们可以充分发挥想象力,好好利用一下它,在接下来的几篇博客,我会深入研究一下GEOHASH的特性,另外,Mongodb的GEO特性也非常之的研究。