【Redis】特殊数据类型 Geo (地理位置)

🎯前言

除了五中基本的数据类型外,Redis还支持两种特殊的数据类型,第一种 Geo (地理位置):用于存储地理位置相关的数据,例如经纬度、距离等。第二种 Stream (流):是一个高级的列表类型,支持对列表的批量操作,如添加多个元素、获取多个元素等。

Redis GEO(Geo Redis)是一个用于存储和操作地理空间数据的 Redis 模块。它提供了一组命令,可以将地理位置数据存储为 Redis 键值,并支持各种地理位置查询和操作。

Redis GEO 可以在需要处理地理位置数据的场景中使用,例如近邻查询、地理位置路由、基于地理位置的服务等。使用 Redis GEO 可以高效地处理大量的地理位置数据,并且可以与其他 Redis 数据类型(例如列表、哈希表)结合使用,以提供更复杂的地理位置服务。

🎯Geo (地理位置 关命令介绍)

Redis GEO 的常用命令:

  1. GEODEL:删除给定位置上的元素。
  2. GEOADD:向给定位置添加元素。
  3. GEOPOS:获取给定元素的经纬度。
  4. GEORADIUS:半径为 radius 的圆中第一个元素。
  5. GEORADIUSBYMEMBER:在距离给定元素 radius 距离的圆中查找元素。
  6. GEOHASH:获取给定元素的哈希值。 
  7. GEODIST:获取两个元素之间的距离。

🎯Geo (地理位置 相关命令操作)

GEOADD (添加地理位置的坐标)

说明:

geoadd 用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中

语法:

GEOADD key longitude latitude member [longitude latitude member ...]
  1. key:要添加点的键值。
  2. longitude:要添加点的经度。
  3. latitude:要添加点的纬度。
  4. member:要添加点的成员属性,可以根据需要进行设置。

示例:

127.0.0.1:6379> GEOADD city 116.403039  39.915351 "beijing" 117.220164  39.095583 "tianjin"
(integer) 2
127.0.0.1:6379> GEODIST city beijing tianjin
"115025.3461"
127.0.0.1:6379> GEORADIUS city 116 39 1000 km
1) "tianjin"
2) "beijing"
127.0.0.1:6379> GEORADIUS city 116 39 200 km
1) "tianjin"
2) "beijing"
127.0.0.1:6379> GEORADIUS city 116 39 120 km
1) "tianjin"
2) "beijing"
127.0.0.1:6379>  GEORADIUS city 116 39 100 km
(empty list or set)
127.0.0.1:6379>

该命令(GEOADD city 116.403039  39.915351 "beijing" 117.220164  39.095583 "tianjin")将beijing和tianjin这两个点添加到city 这个键值下,每个点都由它们的经纬度坐标和成员属性"beijing"和"tianjin"组成。


GEOPOS (获取地理位置的坐标)

说明:

GEOPOS命令用于获取一个或多个点的经纬度坐标。

语法:

GEOPOS key member [member ...]
  1. key:要获取点的键值。
  2. member:要获取点的成员属性,可以根据需要进行设置。

示例:

127.0.0.1:6379> GEOPOS city beijing tianjin nonexistent
1) 1) "116.40304058790206909"
   2) "39.91535036301187489"
2) 1) "117.22016483545303345"
   2) "39.09558351926427378"
3) (nil)
127.0.0.1:6379>

 该命令将返回beijing 和 tianjin这两个点的经纬度坐标。


GEODIST (计算两个位置之间的距离)

说明:

GEODIST命令用于计算两个给定位置之间的距离,以双精度浮点数的形式返回。

语法:

GEODIST key member1 member2 [unit]
  1. key:可以是一个键值,但该参数不是必需的。
  2. member1:要计算距离的位置1的成员属性。
  3. member2:要计算距离的位置2的成员属性。
  4. unit:可以指定返回的距离单位,可以是m(米)、km(千米)、mi(英里)或ft(英尺)。

示例:

127.0.0.1:6379> GEODIST city beijing tianjin
"115025.3461"
127.0.0.1:6379> GEODIST city beijing tianjin m
"115025.3461"
127.0.0.1:6379> GEODIST city beijing tianjin km
"115.0253"
127.0.0.1:6379> GEODIST city beijing tianjin mi
"71.4736"
127.0.0.1:6379> GEODIST city beijing tianjin ft
"377379.7446"
127.0.0.1:6379>

 该命令将返回beijing 和 tianjin这两个点之间的距离,默认单位为米。


GEOHASH (返回一个或多个位置对象的 geohash 值)

说明:

Redis GEO 使用 GEOHASH 来保存地理位置的坐标。GEOHASH  用于获取一个或多个位置元素的 GEOHASH 值。

语法:

GEOHASH key member [member ...]
  1. key:可以是一个键值,但该参数不是必需的。
  2. member1:要计算距离的位置1的成员属性。
  3. member2:要计算距离的位置2的成员属性。

示例:

127.0.0.1:6379> GEOHASH city beijing tianjin
1) "wx4g0f65g20"
2) "wwgq7mjh7b0"
127.0.0.1:6379>

该命令将返回北京和天津这两个点之间的距离。请注意,您需要提供正确的地理位置信息才能正确使用此命令。


GEORADIUS (根据用户给定的经纬度坐标来获取指定范围内的地理位置集合)

说明:

根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。

语法:

GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC
  1. key:要查找的点的键值。
  2. longitude:要查找的点的经度。
  3. latitude:要查找的点的纬度。
  4. radius:可以设置半径的大小,后面需要指定单位,如m、km、ft或mi。
  5. [WITHCOORD]:如果需要,可以使用WITHCOORD选项来返回包含距离计算的点的经纬度坐标。
  6. [WITHDIST]:如果需要,可以使用WITHDIST选项来返回包含距离计算的点的距离。
  7. [WITHHASH]:如果需要,可以使用WITHHASH选项来返回包含距离计算的点的哈希值。
  8. [COUNT count]:如果需要,可以使用COUNT count选项来指定返回的距离计算的点的数量。
  9. [ASC]:如果需要,可以使用ASC选项来指定按距离升序排列返回的距离计算的点。

示例:

127.0.0.1:6379> GEOADD city 116.403039  39.915351 "beijing" 117.220164  39.095583 "tianjin"
(integer) 2
127.0.0.1:6379> GEORADIUS city 117 39 200 km WITHDIST
1) 1) "tianjin"
   2) "21.7878"
2) 1) "beijing"
   2) "113.9887"
127.0.0.1:6379> GEORADIUS city 117 39 200 km WITHCOORD
1) 1) "tianjin"
   2) 1) "117.22016483545303345"
      2) "39.09558351926427378"
2) 1) "beijing"
   2) 1) "116.40304058790206909"
      2) "39.91535036301187489"
127.0.0.1:6379> GEORADIUS city 117 39 200 km WITHDIST WITHCOORD
1) 1) "tianjin"
   2) "21.7878"
   3) 1) "117.22016483545303345"
      2) "39.09558351926427378"
2) 1) "beijing"
   2) "113.9887"
   3) 1) "116.40304058790206909"
      2) "39.91535036301187489"


GEORADIUSBYMEMBER (在距离给定元素 radius 距离的圆中查找元素)

说明:

GEORADIUSBYMEMBER命令用于计算给定成员属性在指定半径范围内的其他点的距离和坐标。

语法:

GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DES
  1. key:要查找的点的键值。
  2. member:要查找的点的成员属性。
  3. radius:可以设置半径的大小,后面需要指定单位,如m、km、ft或mi。
  4. [WITHCOORD]:如果需要,可以使用WITHCOORD选项来返回包含距离计算的点的经纬度坐标。
  5. [WITHDIST]:如果需要,可以使用WITHDIST选项来返回包含距离计算的点的距离。
  6. [WITHHASH]:如果需要,可以使用WITHHASH选项来返回包含距离计算的点的哈希值。
  7. [COUNT count]:如果需要,可以使用COUNT count选项来指定返回的距离计算的点的数量。
  8. [ASC|DES:如果需要,可以使用ASC选项来指定按距离升序排列返回的距离计算的点,或者使用DES选项来指定按距离降序排列返回的距离计算的点。

示例:

127.0.0.1:6379> GEOADD city 116.403039  39.915351 "beijing" 117.220164  39.095583 "tianjin"
(integer) 2
127.0.0.1:6379> GEORADIUS city 116.403039 39.915351 500 km WITHDIST COUNT 10 ASC
1) 1) "beijing"
   2) "0.0002"
2) 1) "tianjin"
   2) "115.0255"

举例:如命令(GEORADIUS city 116.403039 39.915351 500 km WITHDIST COUNT 10 ASC)根据GEORADIUS命令,计算距离北京市中心(经度116.403039,纬度39.915351)200千米范围内其他点的距离,并按照距离升序排列返回最接近的10个点及其距离。

该命令将返回距离北京市中心(经度116.403039,纬度39.915351)200千米范围内的其他点,并按照距离升序排列返回最接近的10个点及其距离。


GEORADIUS 和 GEORADIUS 区别

  • GEORADIUS 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
  • GEORADIUS 和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUS 的中心点是由给定的位置元素决定的, 而不是使用经度和纬度来决定中心点。

### Redis 支持的数据类型 Redis 是一种高性能的键值存储系统,支持多种数据类型以满足不同的应用场景需求。以下是 Redis 主要支持的数据类型: #### 1. **字符串 (String)** String 类型是 Redis 中最基础的数据类型之一,一个 key 对应一个 value[^2]。该类型的值可以是一个普通的字符串、整数或浮点数。由于它是二进制安全的,因此可以存储任意形式的数据,例如 JPG 图片文件或序列化的对象等。单个字符串的最大长度可达 512 MB。 #### 2. **哈希 (Hash)** Hash 类型用于存储字段和值之间的映射关系。它非常适合表示对象属性及其对应的值。每个 hash 可以存储多达 2^32 - 1 个字段/值对[^1]。 #### 3. **列表 (List)** List 类型是一种链表结构,适合用于实现队列或栈的功能。通过命令可以在列表两端快速插入或删除元素。Lists 常被用作消息队列或其他需要顺序处理的任务场景中[^1]。 #### 4. **集合 (Set)** Set 类型是一组无序且唯一的字符串成员组成的集合。Sets 提供了高效的交集、并集以及差集运算能力,在去重等方面非常有用[^1]。 #### 5. **有序集合 (Sorted Set)** Sorted Sets 同样由唯一字符串组成,但它还关联了一个分数(score),使得所有成员能够按照 score 排序。这允许我们轻松获取排名靠前的结果或者其他范围查询功能。 #### 6. **位图 (Bitmaps)** Bitmap 并不是一个独立的数据类型,而是基于 Strings 实现的一种高效方式来操作 bit-level 数据。它可以用来统计在线人数等多种应用场合。 #### 7. **超日志 (HyperLogLog)** HyperLogLog 是一种概率算法,专门设计用于估计基数(cardinality estimation)问题——即计算某个 set 中有多少不重复元素。相比传统方法,这种方法占用内存极低却依然保持较高的准确性[^1]。 #### 8. **地理空间索引(Geo)** Geo 功能让 Redis 能够存储地理位置信息,并提供距离计算等功能。这对于 LBS(Location Based Services) 应用来说非常重要。 ```python # 示例代码展示部分常用的操作 import redis r = redis.Redis(host='localhost', port=6379, decode_responses=True) # 设置字符串类型 r.set('name', 'Alice') # 获取字符串类型 print(r.get('name')) # 使用hash类型 r.hset('user:Alice', mapping={'age': 25, 'gender': 'female'}) print(r.hgetall('user:Alice')) # 列表操作 r.lpush('queue', 'task1') r.rpush('queue', 'task2') print(r.lrange('queue', 0, -1)) # 集合操作 r.sadd('unique_items', 'item1', 'item2', 'item3') print(r.smembers('unique_items')) ```
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你才是臭弟弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值