Redis GEO 特性在 LBS 中的应用总结

什么是LBS

LBS(Location Based Service),基于位置的服务。mysql

Redis和GEO

Redis 是最热门的 nosql 数据库之一,它的最大特色就是快。
因此在 LBS 这种须要大量写入和查询的应用场景中,用它来存储用户的地理位置信息最适合不过了。git

Redis 的 GEO 是 3.2 版本的新特性。这个功能能够将用户给定的地理位置信息储存起来, 并对这些信息进行操做。redis

PS:关于三种nosql数据库这里我也作了调研,其中mongodb最大的特色是灵活,由于其数据是以json的格式存储,因此字段随时能够增长或减小;Redis的特色是快,适合单一的,简单的,大量数据的存储;HBase我没有作深刻研究,它的特色是大,适合作离线缓存。在处理社交这种关系复杂的数据存储时,依然仍是须要用mysql这种关系型数据库,nosql并不能彻底替代。sql

使用

目前 redis 支持如下 6 个 GEO 的相关操做mongodb

  • geoadd:增长某个地理位置的坐标。
  • geopos:获取某个地理位置的坐标。
  • geodist:获取两个地理位置的距离。
  • georadius:根据给定地理位置坐标获取指定范围内的地理位置集合。
  • georadiusbymember:根据给定地理位置获取指定范围内的地理位置集合。
  • geohash:获取某个地理位置的geohash值。

添加位置和获取位置

GEOADD location-set longitude latitude member [longitude latitude member ...]数据库

示例json

redis> GEOADD Hangzhou 120.0919500000 30.3219600000 Xihu缓存

获取某个地理位置的坐标

GEOPOS key member [member ...]nosql

示例code

redis> GEOPOS Hangzhou Sandun Xixi Xihu

获取两个地理位置的距离

GEODIST location-set location-x location-y [unit]

其中 unit 参数是距离单位,可选填

  • m 表示单位为米。
  • km 表示单位为公里。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。

示例

redis> GEODIST Hangzhou Xihu Xixi m

根据给定地理位置坐标获取指定范围内的地理位置集合

这个功能颇有用,能够用来查找周边的点

GEORADIUS location-set longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [ASC|DESC] [COUNT count]

其中:

radius表示范围距离,距离单位是 m|km|ft|mi

可选参数:

  • WITHCOORD:传入WITHCOORD参数,则返回结果会带上匹配位置的经纬度。
  • WITHDIST:传入WITHDIST参数,则返回结果会带上匹配位置与给定地理位置的距离。
  • ASC|DESC:默认结果是未排序的,传入ASC为从近到远排序,传入DESC为从远到近排序。
  • WITHHASH:传入WITHHASH参数,则返回结果会带上匹配位置的hash值。
  • COUNT count:传入COUNT参数,能够返回指定数量的结果。

示例

redis> GEORADIUS Hangzhou 120.0919500000 30.3219600000 10 km

根据给定地理位置获取指定范围内的地理位置集合

GEORADIUSBYMEMBER key member radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]

和 GEORADIUS 同样,只是传入的是member名,不是坐标了

redis> GEORADIUS Hangzhou Xihu 10 km

相关文章
相关标签/搜索