Redis 地理坐标可以存储经纬度格式的地理坐标,并对这些坐标执行距离计算、范围查找等操作。
基本命令 GEOADD 将一个或多个地理坐标添加或更新到有序集合中,返回插入元素个数。
1 2 3 4 5 6 7 8 9 -- 返回 1.添加 qingyuan 到 Guangdong-cities 中 GEOADD Guangdong-cities 113.2099647 23.593675 Qingyuan -- 返回 4.添加 guangzhou fuoshan dongguan 和 shenzhen 到 Guangdong-cities 中 GEOADD Guangdong-cities 113.2278442 23.1255978 Guangzhou 113.106308 23.0088312 Foshan 113.7943267 22.9761989 Dongguan 114.0538788 22.5551603 Shenzhen -- 返回 1.添加 Zhongshan 到 Guangdong-cities 中 GEOADD Guangdong-cities 113 22 Zhongshan -- 返回 0. 由于 Guangdong-cities 已有 Zhongshan 所以更新 Zhongshan 信息 GEOADD Guangdong-cities 113.4060288 22.5111574 Zhongshan
时间复杂度:O(logn * m). n 为集合中已有元素的个数,m 是需要添加地理坐标的个数。
GEOPOS 获取给定位置的坐标,包含经度和纬度,集合中不存在返回 nil。
1 2 3 4 5 6 -- 113.40603142976761 22.511156445825442 GEOPOS Guangdong-cities Zhongshan -- 按顺序返回 -- 114.0538814663887 22.555159205151575 Shenzhen -- 113.22784155607224 23.125598202060807 Guangzhou GEOPOS Guangdong-cities Shenzhen Guangzhou
时间复杂度:O(logn * m). n 为集合中已有元素的个数,m 是需要查询地理坐标的个数。
GEODIST 计算两个位置之间的直线距离,单位默认是米,集合中元素不存在返回 nil。
1 2 3 4 5 6 7 8 9 10 11 12 -- 127364.5547 米 GEODIST Guangdong-cities Zhongshan Guangzhou -- 使用指定单位。 M KM MI FT -- 127364.5547 米 GEODIST Guangdong-cities Zhongshan Guangzhou M -- 127.3646 千米 GEODIST Guangdong-cities Zhongshan Guangzhou KM -- 79.1409 英里 GEODIST Guangdong-cities Zhongshan Guangzhou MI -- 417862.7122 英尺 GEODIST Guangdong-cities Zhongshan Guangzhou FT
时间复杂度:O(logn)
GEORADIUS 返回以经纬度为中心,指定半径内的地理坐标。
默认情况下,返回结果是无序的,ASC 或 DESC 可以使结果有序返回。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 -- 以 113.4060288 22.5111574 为中心,查询半径为 200km 的地理元素 GEORADIUS Guangdong-cities 113.4060288 22.5111574 200 KM -- 以 113.4060288 22.5111574 为中心,查询半径为 200mi 的地理元素 GEORADIUS Guangdong-cities 113.4060288 22.5111574 200 MI -- 以 113.4060288 22.5111574 为中心,查询半径为 200mi 的地理元素,同时返回距离 GEORADIUS Guangdong-cities 113.4060288 22.5111574 200 KM WITHDIST -- 以 113.4060288 22.5111574 为中心,查询半径为 200mi 的地理元素,同时返回坐标 GEORADIUS Guangdong-cities 113.4060288 22.5111574 200 KM WITHCOORD -- 以 113.4060288 22.5111574 为中心,查询半径为 200mi 的地理元素,同时返回 GEOHASH(数字 HASH) GEORADIUS Guangdong-cities 113.4060288 22.5111574 200 KM WITHHASH -- 以 113.4060288 22.5111574 为中心,查询半径为 200mi 的地理元素,同时升序返回距离 GEORADIUS Guangdong-cities 113.4060288 22.5111574 200 KM WITHDIST ASC -- 以 113.4060288 22.5111574 为中心,查询半径为 200mi 的地理元素,返回 2 个的同时升序返回距离 GEORADIUS Guangdong-cities 113.4060288 22.5111574 200 KM WITHDIST ASC COUNT 2
时间复杂度:O(n)
GEORADIUSBYMEMBER 同 GEORADIUS,只是中心为地理坐标中的一个元素。
1 2 -- 以 Guangzhou 为中心,查询半径为 150km 的地理元素,返回 2 个的同时升序返回距离 GEORADIUSBYMEMBER Guangdong-cities Guangzhou 150 KM WITHDIST ASC COUNT 2
时间复杂度:O(n)
GEOHASH 传入一个或多个位置,返回这些位置的字符串 GEOHASH 值。
不存在则返回 nil。
1 2 3 4 5 -- ws0w0phgp70 GEOHASH Guangdong-cities Qingyuan -- ws0w0phgp70 ws0e89curg0 GEOHASH Guangdong-cities Qingyuan Guangzhou
时间复杂度:O(n)
总结
Redis的GEO特性允许用户将经纬度格式的地理位置存储到Redis中,并对这些位置执行距离计算、范围查找等操作;
GEORADIUSBYMEMBER 和 GEORADIUS 命令的作用一样,但前者使用位置,后者使用经纬度;
Geohash 将用户给经度和纬度转换成单个Geohash值;
可以使用有序集合来操作地理坐标;