1.Redis概述
2.Geospatial 数据类型
- Redis 的 Geospatial 数据类型可以存储地理空间的位置信息和执行地理相关的查询。
- 比如查找指定半径内的所有位置、计算两个位置之间的距离等。
- Redis 使用有序集合 (sorted sets) 来实现这些功能。
3.存储和性能
- Geospatial 数据在 Redis 中实际上是存储在有序集合 (sorted set) 中,每个成员的排序值(score)是经过编码的 Geohash 值。
- 因此,操作的性能与有序集合的基本操作性能相似。
4.应用场景
- 查找附近的地点:可以用来查找附近的商店、餐馆、加油站等。
- 物流和配送:帮助确定哪个仓库或配送中心离客户最近,从而优化配送路线。
- 社交应用:查找附近的朋友或用户。
5.基本命令
1. GEOADD
GEOADD
将指定的地理空间位置(经度、纬度、成员)添加到 Redis 中的键中。
该命令的语法支持一些可选参数来控制添加行为。
语法
GEOADD key [NX | XX] [CH] longitude latitude member [longitude latitude member ...]
key
: 存储地理空间数据的键。NX
: 只在成员不存在时添加。XX
: 只在成员已存在时添加。CH
: 修改返回被修改的成员数量。longitude
: 经度。latitude
: 纬度。member
: 成员名称。
参数说明
NX
(可选): 仅当成员不存在时才进行添加操作。如果成员已经存在,则不进行任何操作。XX
(可选): 仅当成员已经存在时才进行添加操作。如果成员不存在,则不进行任何操作。CH
(可选): 返回被修改成员的数量(即添加新成员或更新已有成员)。默认情况下,GEOADD
仅返回添加的新成员的数量,而不包括更新的成员。
示例
基本使用
GEOADD locations 13.361389 38.115556 "Palermo"
GEOADD locations 15.087269 37.502669 "Catania"
使用 NX 参数
仅当成员不存在时添加新位置。
GEOADD locations NX 13.361389 38.115556 "Palermo"
如果 "Palermo"
已经存在,这个命令不会有任何效果。
使用 XX 参数
仅当成员已经存在时更新位置。
GEOADD locations XX 13.361389 38.115556 "Palermo"
如果 "Palermo"
不存在,这个命令不会有任何效果。
使用 CH 参数
返回被修改成员的数量。
GEOADD locations CH 13.361389 38.115556 "Palermo"
如果 "Palermo"
的位置被更新,返回的结果会包含被更新的成员数量。
组合使用 NX 和 CH 参数
GEOADD locations NX CH 13.361389 38.115556 "Palermo"
仅当 "Palermo"
不存在时添加,并返回被添加的成员数量。
2.GEOPOS
GEOPOS
返回一个或多个成员的地理位置(经度和纬度)。
通过该命令,可以获取存储在 Redis 地理空间索引中的位置数据。
语法
GEOPOS key [member [member ...]]
key
: 存储地理空间数据的键。member
: 一个或多个成员的名字。
返回值
返回一个数组,其中每个元素是相应成员的地理位置(经度和纬度)。
如果某个成员不存在,则其对应位置返回 nil
。
示例
假设我们已经使用 GEOADD
命令添加了一些地理位置:
GEOADD locations 13.361389 38.115556 "Palermo"
GEOADD locations 15.087269 37.502669 "Catania"
想要获取 "Palermo"
和 "Catania"
的地理位置,可以使用 GEOPOS
命令:
GEOPOS locations Palermo Catania
1) 1) "13.36138933897018433" # Palermo 的经度
2) "38.11555639549629859" # Palermo 的纬度
2) 1) "15.08726745843887329" # Catania 的经度
2) "37.50266842333162032" # Catania 的纬度
3. GEODIST
GEODIST
计算存储在 Redis 地理空间索引中的两个成员之间的距离。
可以选择使用不同的单位来表示距离。
语法
GEODIST key member1 member2 [M | KM | FT | MI]
key
: 存储地理空间数据的键。member1
: 第一个成员的名字。member2
: 第二个成员的名字。[M | KM | FT | MI]
(可选): 距离单位。默认是米(meters)。M
: 米(默认)。KM
: 千米。FT
: 英尺。MI
: 英里。
返回值
返回两个成员之间的距离。如果任一成员不存在,则返回 nil
。
示例
假设我们已经使用 GEOADD
命令添加了一些地理位置:
GEOADD locations 13.361389 38.115556 "Palermo"
GEOADD locations 15.087269 37.502669 "Catania"
现在我们想要计算 "Palermo"
和 "Catania"
之间的距离,可以使用 GEODIST
命令:
GEODIST locations Palermo Catania
默认情况下,距离将以米为单位返回。
如果我们想要以千米为单位返回距离,可以指定单位:
GEODIST locations Palermo Catania KM
同样,可以使用其他单位:
GEODIST locations Palermo Catania FT # 以英尺为单位
GEODIST locations Palermo Catania MI # 以英里为单位
4. GEOHASH
GEOHASH
返回一个或多个成员的 Geohash 值。
Geohash 是一种地理编码方法,将地理坐标转换为字符串形式,便于存储和比较。
语法
GEOHASH key [member [member ...]]
key
: 存储地理空间数据的键。member
: 一个或多个成员的名字。
返回值
返回一个数组,其中每个元素是相应成员的 Geohash 值。
如果某个成员不存在,则其对应位置返回 nil
。
示例
使用 GEOADD
命令添加了一些地理位置:
GEOADD locations 13.361389 38.115556 "Palermo"
GEOADD locations 15.087269 37.502669 "Catania"
获取 "Palermo"
和 "Catania"
的 Geohash 值,可以使用 GEOHASH
命令:
GEOHASH locations Palermo Catania
返回结果如下:
1) "sqc8b49rny0"
2) "sqdtr74hyu0"
5.GEOSEARCH
GEOSEARCH
在地理空间索引中搜索符合指定条件的成员。
可以根据给定的条件在地理位置数据中进行搜索,并返回满足条件的成员。
语法
GEOSEARCH key
<FROMMEMBER member>
<BYRADIUS radius <M | KM | FT | MI> | BYBOX width height <M | KM | FT | MI>>
[ASC | DESC]
[COUNT count [ANY]]
[WITHCOORD]
[WITHDIST]
[WITHHASH]
key
: 存储地理空间数据的键。FROMMEMBER member
: 指定以哪个成员为中心进行搜索。BYRADIUS radius <M | KM | FT | MI>
: 根据给定的半径范围进行搜索,单位可以是米(M
)、千米(KM
)、英尺(FT
)或英里(MI
)。BYBOX width height <M | KM | FT | MI>
: 根据给定的矩形范围进行搜索,矩形的宽度和高度以及单位。ASC
或DESC
: 指定搜索结果的排序顺序,默认为升序(ASC
)。COUNT count [ANY]
: 指定返回的成员数量,可选参数ANY
表示返回的成员数量可能比指定数量稍多或稍少。WITHCOORD
: 返回搜索结果的经度和纬度信息。WITHDIST
: 返回搜索结果与中心成员的距离信息。WITHHASH
: 返回搜索结果的 geohash 信息。
返回值
返回满足搜索条件的成员列表,包括根据设置的选项返回的额外信息。
示例
-
根据给定成员附近的半径范围内搜索:
GEOSEARCH key FROMMEMBER member BYRADIUS 100 KM WITHCOORD WITHDIST
返回距离
member
成员不超过 100 千米范围内的成员,并包含这些成员的经纬度和距离信息。 -
根据给定成员附近的矩形范围内搜索:
GEOSEARCH key FROMMEMBER member BYBOX 10 20 KM WITHHASH COUNT 5 ANY
返回距
member
成员所在矩形区域大小为 10 千米 * 20 千米范围内的至多 5 个成员,并包含这些成员的 geohash 信息。
6.GEOSEARCHSTORE
GEOSEARCHSTORE
将地理空间搜索结果存储到指定的目标键中。
与 GEOSEARCH
类似,在地理空间索引中进行搜索,但不同的是,它将搜索结果存储到一个新的键中,而不是直接返回结果。
语法
GEOSEARCHSTORE destination source
<FROMMEMBER member | FROMLONLAT longitude latitude>
<BYRADIUS radius <M | KM | FT | MI> | BYBOX width height <M | KM | FT | MI>>
[ASC | DESC]
[COUNT count [ANY]]
[STOREDIST]
destination
: 目标键,用于存储搜索结果。source
: 源键,包含地理空间数据。FROMMEMBER member
: 指定以哪个成员为中心进行搜索。FROMLONLAT longitude latitude
: 使用指定的经纬度作为搜索中心。BYRADIUS radius <M | KM | FT | MI>
: 根据给定的半径范围进行搜索,单位可以是米(M
)、千米(KM
)、英尺(FT
)或英里(MI
)。BYBOX width height <M | KM | FT | MI>
: 根据给定的矩形范围进行搜索,矩形的宽度和高度以及单位。ASC
或DESC
: 指定搜索结果的排序顺序,默认为升序(ASC
)。COUNT count [ANY]
: 指定返回的成员数量,可选参数ANY
表示返回的成员数量可能比指定数量稍多或稍少。STOREDIST
: 将成员与中心点的距离也存储到目标键中。
返回值
返回添加到目标键中的成员数量。
示例
-
根据指定成员附近的半径范围内搜索并存储结果:
GEOSEARCHSTORE destKey srcKey FROMMEMBER member BYRADIUS 100 KM
搜索距离
member
成员不超过 100 千米范围内的成员,并将结果存储到destKey
中。 -
根据指定经纬度附近的矩形范围内搜索并存储结果:
GEOSEARCHSTORE destKey srcKey FROMLONLAT 13.361389 38.115556 BYBOX 10 20 KM
搜索以经纬度 (13.361389, 38.115556) 为中心,矩形区域大小为 10 千米 * 20 千米范围内的成员,并将结果存储到
destKey
中。 -
根据指定成员附近的半径范围内搜索并存储结果,包括距离信息:
GEOSEARCHSTORE destKey srcKey FROMMEMBER member BYRADIUS 50 KM STOREDIST
搜索距离
member
成员不超过 50 千米范围内的成员,并将结果及其与中心点的距离存储到destKey
中。