Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。

元素的score值为其经纬度对应的52位的geohash值。

geoadd 用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。
 GEOADD key longitude latitude member [longitude latitude member …]
 127.0.0.1:6379> geoadd china:city 16.408 39.904 beijing
 (integer) 1
 127.0.0.1:6379> geoadd china:city 121.445 31.213 shanghai 
 (integer) 1
 127.0.0.1:6379> geoadd china:city 113.265 23.108 guangzhou 
 (integer) 1
 127.0.0.1:6379> geoadd china:city 114.109 22.544 shenzhen 
 (integer) 1
 =======================================
 geopos 用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。
 geopos 语法格式如下:
 GEOPOS key member [member …]
 127.0.0.1:6379> GEOPOS china:city beijing
 1) 1) "16.40799790620803833"
    2) "39.90399988166036138"
 127.0.0.1:6379> GEOPOS china:city shenzhen
 1) 1) "114.10900086164474487"
    2) "22.54399882788700182"
 127.0.0.1:6379> GEOPOS china:city shenzhen guangzhou
 1) 1) "114.10900086164474487"
    2) "22.54399882788700182"
 2) 1) "113.26500087976455688"
    2) "23.10799963305151294"
 =======================================
 geodist 用于返回两个给定位置之间的距离。
 geodist 语法格式如下:
 GEODIST key member1 member2 [m|km|ft|mi]
 member1 member2 为两个地理位置。
 距离单位参数说明:
 m :米,默认单位。km :千米。mi :英里。ft :英尺。
 127.0.0.1:6379> GEODIST china:city shenzhen guangzhou km
 "106.8712"
 127.0.0.1:6379> GEODIST china:city beijing guangzhou km
 "8937.6843"
 =======================================
 (附件的人,获得所有附件的人的地址 --手机定位,通过半径查询)
 georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
 GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
 参数说明:
 m :米,默认单位。km :千米。mi :英里。ft :英尺。
 WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
 WITHCOORD: 将位置元素的经度和维度也一并返回。
 WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
 COUNT 限定返回的记录数。
 ASC: 查找结果根据距离从近到远排序。
 DESC: 查找结果根据从远到近排序。
 127.0.0.1:6379> GEORADIUS china:city 110 30 2000 km withdist
 1) 1) "shenzhen"
    2) "924.8087"
 2) 1) "guangzhou"
    2) "832.4234"
 3) 1) "shanghai"
    2) "1103.4020"
 127.0.0.1:6379> GEORADIUS china:city 110 30 2000 km withdist withcoord
 1) 1) "shenzhen"
    2) "924.8087"
    3) 1) "114.10900086164474487"
       2) "22.54399882788700182"
 2) 1) "guangzhou"
    2) "832.4234"
    3) 1) "113.26500087976455688"
       2) "23.10799963305151294"
 3) 1) "shanghai"
    2) "1103.4020"
    3) 1) "121.44499808549880981"
       2) "31.213001199663303"
 127.0.0.1:6379> GEORADIUS china:city 110 30 2000 km withdist withcoord desc 
 1) 1) "shanghai"
    2) "1103.4020"
    3) 1) "121.44499808549880981"
       2) "31.213001199663303"
 2) 1) "shenzhen"
    2) "924.8087"
    3) 1) "114.10900086164474487"
       2) "22.54399882788700182"
 3) 1) "guangzhou"
    2) "832.4234"
    3) 1) "113.26500087976455688"
       2) "23.10799963305151294"
 127.0.0.1:6379> GEORADIUS china:city 110 30 2000 km withdist withcoord count 2 //指定数量
 1) 1) "guangzhou"
    2) "832.4234"
    3) 1) "113.26500087976455688"
       2) "23.10799963305151294"
 2) 1) "shenzhen"
    2) "924.8087"
    3) 1) "114.10900086164474487"
       2) "22.54399882788700182"
 georadiusbymember 和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 georadiusbymember 的中心点是由给定的位置元素决定的, 而不是使用经度和纬度来决定中心点。
 127.0.0.1:6379> GEORADIUSBYMEMBER china:city guangzhou 2000 km 
 1) "shenzhen"
 2) "guangzhou"
 3) "shanghai"
 geohash
 Redis GEO 使用 geohash 来保存地理位置的坐标。
 geohash 用于获取一个或多个位置元素的 geohash 值,返回的是11个字符的geohash字符串
 127.0.0.1:6379> GEOHASH china:city guangzhou
 1) "ws0e3qtjcg0"
 127.0.0.1:6379> GEOHASH china:city shenzhen
 1) "ws10k858k30"
 =======================================
 GEO实现原理其实是Zset,我们可以用zset操作GEO
 127.0.0.1:6379> type china:city
 zset
 127.0.0.1:6379> ZRANGE china:city 0 -1
 1) "beijing"
 2) "shenzhen"
 3) "guangzhou"
 4) "shanghai"
 127.0.0.1:6379> ZREM china:city shanghai
 (integer) 1
 127.0.0.1:6379> ZRANGE china:city 0 -1
 1) "beijing"
 2) "shenzhen"
 3) "guangzhou"

应用场景

1、地理位置操作 : 附近的人(需要定位经纬度坐标),相对距离等等

要实现微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。其中“给定的位置对象”即为用户本人,搜索的对象为其他用户。