Redis-三种特殊数据类型-Geospatial

geospatial 地理位置

  • Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。
  • Redis GEO 操作方法有:
    • geoadd:添加地理位置的坐标。
    • geopos:获取地理位置的坐标。
    • geodist:计算两个位置之间的距离。
    • georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
    • georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
    • geohash:返回一个或多个位置对象的 geohash 值。

常用命令(只有6个)

1. geoadd key longitude latitude member [longitude latitude member ...]将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中
  • 先经度后维度,顺序不能错,否则超出经纬度范围报错
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> geoadd china:city 121.48941 31.40527 shanghai   # 添加member及其经纬度
(integer) 1
127.0.0.1:6379> geoadd china:city 114.02919 30.58203 wuhan
(integer) 1
127.0.0.1:6379> geoadd china:city 113.88308 22.55329 shenzhen 116.23128 40.22077 beijing
(integer) 2
2. geodist key member1 member2 [m|km|ft|mi] 用于返回member1 member2 给定位置之间的距离
127.0.0.1:6379> geodist china:city shanghai wuhan   # 计算两个member经纬度之间的距离
"717025.9339"
127.0.0.1:6379> geodist china:city shanghai wuhan km
"717.0259"
127.0.0.1:6379> geodist china:city beijing shenzhen km
"1977.4843"
127.0.0.1:6379> geodist china:city shanghai beijing km
"1088.6444"
127.0.0.1:6379> geodist china:city wuhan beijing km
"1090.4028"
3. georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key] 由给定的经度和纬度为圆心, 给的距离为半径,返回方圆范围内的member。
  • 携带参数withcoord,可以附带显示满足要求的城市的经纬度
  • 携带参数withdist 可以附带显示距离满足要求的城市的直线距离
  • 携带参数COUNT count 可以指定只显示符合要求member的个数
127.0.0.1:6379> georadius china:city 112.98626 28.25591 500 km   #长沙的经纬度
1) "wuhan"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 1000 km
1) "shenzhen"
2) "wuhan"
3) "shanghai"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 750 km
1) "shenzhen"
2) "wuhan"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 750 km withcoord
1) 1) "shenzhen"
   2) 1) "113.88307839632034302"
      2) "22.55329111565713873"
2) 1) "changsha"
   2) 1) "112.98626035451889038"
      2) "28.25590931465907119"
3) 1) "wuhan"
   2) 1) "114.02918905019760132"
      2) "30.58203052674790712"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 750 km withdist
1) 1) "shenzhen"
   2) "640.6404"
2) 1) "changsha"
   2) "0.0001"
3) 1) "wuhan"
   2) "277.7515"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 750 km count 2
1) "changsha"
2) "wuhan"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 750 km withcoord withdist count 2
1) 1) "changsha"
   2) "0.0001"
   3) 1) "112.98626035451889038"
      2) "28.25590931465907119"
2) 1) "wuhan"
   2) "277.7515"
   3) 1) "114.02918905019760132"
      2) "30.58203052674790712"
127.0.0.1:6379> 
4. GEORADIUSBYMEMBER key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key] 由给定的member为圆心, 给的距离为半径,返回方圆范围内的member
127.0.0.1:6379> geoadd china:city 112.98626 28.25591 changsha  
(integer) 1
127.0.0.1:6379> georadiusbymember china:city changsha 500 km  # 以指定member为圆心,指定距离为半径,查找方圆内的member
1) "changsha"
2) "wuhan"
127.0.0.1:6379> georadiusbymember china:city changsha 1000 km
1) "shenzhen"
2) "changsha"
3) "wuhan"
4) "shanghai"
5. geopos key member [member ...] 用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。
127.0.0.1:6379> geopos china:city beijing   # 显示指定member的经纬度
1) 1) "116.23128265142440796"
   2) "40.22076905438526495"
6. geohash key member [member ...] 用于获取一个或多个位置元素的 geohash 值
  • 返回11个字符的geohash字符串,用于将二维的经纬度转化为一维的字符串,如果两个字符串越接近,则距离越近
127.0.0.1:6379> geohash china:city wuhan  # 获取一个或多个member的 geohash 值
1) "wt3jfz390x0"
127.0.0.1:6379> geohash china:city beijing shenzhen
1) "wx4sucvncn0"
2) "ws0br3xnkn0"
127.0.0.1:6379> 

扩展

Geo底层实现原理是Zset,可以使用Zset命令来操作Geo(官方未给出的删除和显示操作)
127.0.0.1:6379> zrange china:city 0 -1
1) "shenzhen"
2) "changsha"
3) "wuhan"
4) "shanghai"
5) "beijing"
127.0.0.1:6379> zrem china:city beijing
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "shenzhen"
2) "changsha"
3) "wuhan"
4) "shanghai"
127.0.0.1:6379> 

完整测试用例


127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> geoadd china:city 121.48941 31.40527 shanghai   # 添加member及其经纬度
(integer) 1
127.0.0.1:6379> geoadd china:city 114.02919 30.58203 wuhan
(integer) 1
127.0.0.1:6379> geoadd china:city 113.88308 22.55329 shenzhen 116.23128 40.22077 beijing
(integer) 2
127.0.0.1:6379> geodist china:city shanghai wuhan   # 计算两个member经纬度之间的距离
"717025.9339"
127.0.0.1:6379> geodist china:city shanghai wuhan km
"717.0259"
127.0.0.1:6379> geodist china:city beijing shenzhen km
"1977.4843"
127.0.0.1:6379> geodist china:city shanghai beijing km
"1088.6444"
127.0.0.1:6379> geodist china:city wuhan beijing km
"1090.4028"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 500 km   #长沙的经纬度
1) "wuhan"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 1000 km
1) "shenzhen"
2) "wuhan"
3) "shanghai"
127.0.0.1:6379> georadius china:city 112.98626 28.25591 750 km
1) "shenzhen"
2) "wuhan"
127.0.0.1:6379> geopos china:city beijing   # 显示指定member的经纬度
1) 1) "116.23128265142440796"
   2) "40.22076905438526495"
127.0.0.1:6379> geoadd china:city 112.98626 28.25591 changsha  
(integer) 1
127.0.0.1:6379> georadiusbymember china:city changsha 500 km  # 以指定member为圆心,指定距离为半径,查找方圆内的member
1) "changsha"
2) "wuhan"
127.0.0.1:6379> georadiusbymember china:city changsha 1000 km
1) "shenzhen"
2) "changsha"
3) "wuhan"
4) "shanghai"
127.0.0.1:6379> geohash china:city wuhan  # 获取一个或多个member的 geohash 值
1) "wt3jfz390x0"
127.0.0.1:6379> geohash china:city beijing shenzhen
1) "wx4sucvncn0"
2) "ws0br3xnkn0"
127.0.0.1:6379> zrange china:city 0 -1
1) "shenzhen"
2) "changsha"
3) "wuhan"
4) "shanghai"
5) "beijing"
127.0.0.1:6379> zrem china:city beijing
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "shenzhen"
2) "changsha"
3) "wuhan"
4) "shanghai"
127.0.0.1:6379> 

参考-菜鸟

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值