在移动互联网和物联网蓬勃发展的当下,地理位置数据已成为众多应用的核心要素。从日常的地图导航、外卖配送,到社交网络中的附近好友、本地化营销,再到智能交通中的车辆追踪,地理位置信息的高效处理至关重要。Redis Geo作为Redis数据库的地理信息处理模块,凭借其卓越的性能和丰富的功能,为开发者提供了强大的工具,助力快速构建地理位置相关的应用。


GEOADD key longitude latitude member [longitude latitude member ...]
key: 存储地理位置信息的键。 longitude: 经度,西经为负数。 latitude: 纬度,南纬为负数。 member: 用于标识地理位置的成员名称,可以是用户 ID 或其他标识符。
用于添加一个或多个地理位置到指定的键中。
GEOADD geolocation -122.4194 37.7749 user1GEOADD geolocation -122.4079 37.7797 user2
2. GEOPOS命令
GEOPOS key member [member ...]
key: 存储地理位置信息的键。 member: 要查询位置的成员名称。
用于获取一个或多个成员的经纬度坐标。
GEOPOS geolocation user1
GEODIST key member1 member2 [unit]
key: 存储地理位置信息的键。 member1: 第一个成员名称。 member2: 第二个成员名称。 unit: 可选参数,指定返回的距离单位,可以是 m (米), km (千米), mi (英里), ft (英尺)。
用于计算两个成员之间的距离。
GEODIST geolocation user1 user2 km
GEORADIUS key longitude latitude radius unit [WITHDIST] [WITHCOORD] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
key: 存储地理位置信息的键。 longitude: 经度。 latitude: 纬度。 radius: 半径。 unit: 单位,可以是 m (米), km (千米), mi (英里), ft (英尺)。 WITHDIST: 返回结果时附带距离信息。 WITHCOORD: 返回结果时附带坐标信息。 WITHHASH: 返回结果时附带 GeoHash 值。 COUNT count: 限制返回结果的数量。 ASC: 按照距离升序排序。 DESC: 按照距离降序排序。 STORE key: 将结果存储到另一个键中。 STOREDIST key: 将结果的距离存储到另一个键中。
用于查找给定半径内的成员。
GEORADIUS geolocation -122.4194 37.7749 5 km WITHDIST WITHCOORD
GEORADIUSBYMEMBER key member radius unit [WITHDIST] [WITHCOORD] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
key: 存储地理位置信息的键。 member: 作为中心点的成员名称。 radius: 半径。 unit: 单位,可以是 m (米), km (千米), mi (英里), ft (英尺)。 其他参数同 GEORADIUS 命令。
用于查找以指定成员为中心点、给定半径内的成员。
GEORADIUSBYMEMBER geolocation user12345 5 km WITHDIST WITHCOORD
GEORADIUSBYRADIUS key member radius unit [WITHDIST] [WITHCOORD] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
key: 存储地理位置信息的键。 member: 作为中心点的成员名称。 radius: 半径。 unit: 单位,可以是 m (米), km (千米), mi (英里), ft (英尺)。 其他参数同 GEORADIUS 命令。
GEORADIUSBYRADIUS geolocation user12345 5 km WITHDIST WITHCOORD

前缀匹配:共享前缀的Geohash表示地理位置相近。 边界问题:边缘区域的相邻编码可能差异较大(需查询周围8个邻接区域补全)。
GEOADD cities 116.4074 39.9042 "Beijing"
ZADD cities 4069874990588395 "Beijing"


import redis.clients.jedis.Jedis;public class GeoSearch {private static final String GEOLOCATION_KEY = "geolocation";public static void main(String[] args) {// 连接到 Redistry (Jedis jedis = new Jedis("localhost", 6379)) {// 添加用户的地理位置信息到 RedisaddUserLocation(jedis, 1, -122.4194, 37.7749);// 另一个用户addUserLocation(jedis, 2, -122.4079, 37.7797);// 查找附近的人List<Map.Entry<String, Double>> nearbyUsers = findNearbyUsers(jedis, -122.4194, 37.7749, 5);// 输出结果for (Map.Entry<String, Double> user : nearbyUsers) {System.out.println("User ID: " + user.getKey() + ", Distance: " + user.getValue() + " km");}} catch (Exception e) {e.printStackTrace();}}public static void addUserLocation(Jedis jedis, long userId, double longitude, double latitude) {// 添加用户的地理位置信息到 Redis。jedis.geoadd(GEOLOCATION_KEY, longitude, latitude, String.valueOf(userId));}public static List<Map.Entry<String, Double>> findNearbyUsers(Jedis jedis, double longitude, double latitude, double radius) {// 查找给定半径内的用户。return jedis.georadius(GEOLOCATION_KEY, longitude, latitude, radius, "km", "WITHDIST");}}
GEORADIUS geolocation -122.4194 37.7749 5 km WITHDIST WITHCOORD
GEODIST geolocation user1 user2 km



Redis Geo主要适用于基于半径的查询,对于复杂的地理空间分析,如多边形查询、路径规划等,支持有限。 Redis Geo依赖于内存存储,数据持久化能力较弱,不适合存储大量历史地理位置数据。
增强地理空间分析能力:支持更多复杂的地理空间查询和分析功能,如多边形查询、路径规划等。 提升数据持久化能力:优化数据持久化机制,确保在断电或系统故障情况下数据不丢失。 与其他技术的融合:与机器学习、大数据分析等技术结合,进一步挖掘地理位置数据的价值。

文章转载自老王两点中,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




