简介
- Redis 在 3.2 版本以后增加了地理位置 GEO 功能,支持存储地理位置信心用来实现注入附近位置、摇一摇等依赖地理位置的功能。
- Redis的GEO功能的地产实现是基于zset的,GEO没有提供删除功能,但是由于GEO底层实现是zset,所以可以借助zrem删除地理位置
- Redis的GEO功能借鉴了NoSQL数据库Ardb实现的,Ardb作者来自中国。
命令
-
增加地理位置信息
geoadd key longitude latitude name [longitude latitude name ...]
例如:
geoadd guangdong:cities 113.2278442 23.1255978 guangzhou
如果需要更新地理位置也可以使用geoadd命令,虽然记过返回为0;
geoadd可以同时添加多个地理位置 -
计算两个地理位置之间的距离
geodist key city-x city-y [unit]
unit表示返回结果的单位,包含以下四种:
m 表示单位为米。 meters km 表示单位为千米。kilometers mi 表示单位为英里。 miles ft 表示单位为英尺。 feet
-
获取地理位置信息
geoops key member [member...]
-
计算指定位置范围内的地理信息位置集合
georadius location-key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [withhash] [ASC|DESC] [COUNT count] [store key] [storedist key]
georadiusbymember location-key location radius m|km|ft|mi [WITHCOORD] [withhash] [WITHDIST] [ASC|DESC] [COUNT count] [ [store key] [storedist key]
georadius
和georadiusbymember
的所用是一样的,不同的是georadius用经纬度作为中心位置而georadiusbymember使用储存在位置集合里面的某个位置作为中心位置。WITHCOORD 返回结果包含经纬度 WITHDIST 返回结果中包含到中心位置的距离 withhash 返回结果中包含geohash ASC|DESC asc从近到远,desc从远到近。默认是无序的 COUNT 返回指定个数 store key 将返回结果保存到指定key storedist key 将返回结果到中心位置的距离保存到指定key
-
获取geohash
geohash key member [member...]
Redis使用geohash将二维经纬度转换为一维字符串。
geohash特点:GEO的是数据类型为zset,Redis将所有地理位置信息的geohash存放到zset中 字符串越长表示的位置越精确 字符串越相近表示的位置越近 geohash可以和经纬度互相转换
-
删除地理位置信息
zrem key member
GEO没有提供删除功能,但是由于GEO底层实现是zset,所以可以借助zrem删除地理位置
注意事项
在一个地图应用中,车的数据、餐馆的数据、人的数据可能会有百万千万条,如果使用 Redis 的 Geo 数据结构,它们将全部放在一个 zset 集合中。在 Redis 的集群环境中,集合可能会从一个节点迁移到另一个节点,如果单个 key 的数据过大,会对集群的迁移工作造成较大的影响,在集群环境中单个 key 对应的数据量不宜超过 1M,否则会导致集群迁移出现卡顿现象,影响线上服务的正常运行。
所以,这里建议 Geo 的数据使用单独的 Redis 实例部署,不使用集群环境。
如果数据量过亿甚至更大,就需要对 Geo 数据进行拆分,按国家拆分、按省拆分,按市拆分,在人口特大城市甚至可以按区拆分。这样就可以显著降低单个 zset 集合的大小。…
参考:https://juejin.im/book/5afc2e5f6fb9a07a9b362527/section/5b3b2e106fb9a04fcf59acb8