Redis GEO学习笔记

1. 概述

Redis GEO是一种地理位置信息的存储和查询解决方案,它基于有序集合(Sorted Set)实现,每个元素都有一个经度和纬度坐标信息,可以使用这些信息进行距离计算和地理位置周边搜索。

2. 基本命令

2.1 添加地理位置数据

使用命令GEOADD key longitude latitude member可以添加一条地理位置数据,其中key表示有序集合的名称,longitude表示经度,latitude表示纬度,member表示集合中的元素。

例如:

Copy Code
GEOADD cities 116.40 39.90 Beijing GEOADD cities 121.47 31.23 Shanghai

2.2 获取地理位置数据

使用命令GEOPOS key member [member ...]可以获取一个或多个元素的位置信息。

例如:

Copy Code
GEOPOS cities Beijing

结果为:

Copy Code
1) 1) "116.40000033378601" 2) "39.90000163977838"

2.3 计算两个地理位置之间的距离

使用命令GEODIST key member1 member2 [unit]可以计算两个元素之间的距离,unit参数可以指定距离单位,默认为米。

例如:

Copy Code
GEODIST cities Beijing Shanghai

结果为:

Copy Code
"1068394.2562"

2.4 查找指定地理位置周边的元素

使用命令GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [ASC|DESC] [COUNT count]可以查找距离指定地理位置一定范围内的元素,其中radius参数指定了查找半径,m|km|ft|mi参数指定了半径单位。

例如:

Copy Code
GEORADIUS cities 116.40 39.90 1500000 km WITHDIST

结果为:

Copy Code
1) 1) "Beijing" 2) "0.0000" 2) 1) "Shanghai" 2) "1068394.2562"

表示距离116.40, 39.90坐标点1500公里以内的城市有北京和上海,其中北京与查询点距离为0公里,上海与查询点距离为1068394.2562米。

3. 实例

例如,我们可以使用Redis GEO来实现一个附近商家推荐系统。假设有一个商家列表,每个商家都有自己的经度和纬度坐标,我们可以将它们存储在一个名为merchants的有序集合中:

Copy Code
GEOADD merchants 116.40 39.90 McDonald's GEOADD merchants 121.47 31.23 KFC GEOADD merchants 118.78 32.04 Starbucks

然后,当用户在某个位置时,可以使用GEORADIUS命令查找距离该位置一定范围内的商家:

Copy Code
GEORADIUS merchants 116.50 39.90 5000 m WITHDIST

结果为:

Copy Code
1) 1) "McDonald's" 2) "1109.3526" 2) 1) "KFC" 2) "277934.8350"

表示距离116.50, 39.90坐标点5公里以内的商家有麦当劳和肯德基,其中麦当劳与查询点距离为1109.3526米,肯德基与查询点距离为277934.8350米。然后我们可以将这些商家推荐给用户。