学习Redis,day9 Redis的特殊类型geospatial操作~

111 阅读4分钟

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战

Redis的特殊类型geospatial操作

基本命令整理如下:

1、添加地理位置GEOADD

示例:

 #127.0.0.1:6379> GEOADD china:city 33.32 116.50 beijing
 #(error) ERR invalid longitude,latitude pair    33.320000,116.500000
 127.0.0.1:6379> GEOADD china:city 116.40 39.90 beijing
 (integer) 1
 127.0.0.1:6379> GEOADD china:city 121.47 31.23 shanghai
 (integer) 1
 127.0.0.1:6379> GEOADD china:city 120.16 30.24 hangzhou 108.96 34.26 xian
 (integer) 2

注意事项:

  • 规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!
  • 有效的经度从-180度到180度。
  • 有效的纬度从 -85.05112878度到85.05112878度。
  • 当坐标位置超出上述指定范围时,该命令将会返回一个结果。

2、获取指定地理位置的经纬度GEOPOS

 127.0.0.1:6379> GEOPOS china:city beijing
 1) 1) "116.39999896287918091"
    2) "39.90000009167092543"
 127.0.0.1:6379> GEOPOS china:city xian
 1) 1) "108.96000176668167114"
    2) "34.25999964418929977"

3、两个地理位置之间的直线距离GEODIST

注意事项:

距离单位:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。

如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。

示例:

 127.0.0.1:6379> GEODIST china:city beijing xian     #北京到西安的直线距离(单位:米)
 "910056.5237"
 127.0.0.1:6379> GEODIST china:city beijing xian km  #北京到西安的直线距离(单位:千米)
 "910.0565"

4、根据以给定的经纬度为中心,找出某一半径内的地点GEORADIUS

5、查看距离给定经纬度(经度 纬度)的位置的给定半径范围内的城市(同一对象中)

 GEORADIUS 对象名 经度 纬度 距离 单位   

6、查看距离给定经纬度(经度 纬度)的位置的给定半径范围内的城市,并显示他的经度(同一对象中)

 GEORADIUS 对象名 经度 纬度 距离 单位 withdist

7、查看距离给定经纬度(经度 纬度)的位置的给定半径范围内的城市,并显示他的纬度(同一对象中)

 GEORADIUS 对象名 经度 纬度 距离 单位 withcoord

8、查看距离给定经纬度(经度 纬度)的位置的给定半径范围内的指定数量的城市,并显示他的经度和纬度,(同一对象中)

 GEORADIUS 对象名 经度 纬度 距离 单位 withdist withcoord count 显示数量

示例:

 127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km     #查看距离经纬度110 30 的1000km范围内的城市(china:city对象中)
 1) "chongqing"
 2) "xian"
 3) "shengzhen"
 4) "hangzhou"
 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km      #查看距离经纬度110 30 的500km范围内的城市(china:city对象中)
 1) "chongqing"
 2) "xian"
 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist #查看距离经纬度110 30 的500km范围内的城市并显示他的经度(china:city对象中)
 1) 1) "chongqing"
    2) "341.9374"
 2) 1) "xian"
    2) "483.8340"
 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord    #查看距离经纬度110 30 的500km范围内的城市并显示他的纬度(china:city对象中)
 1) 1) "chongqing"
    2) 1) "106.49999767541885376"
       2) "29.52999957900659211"
 2) 1) "xian"
    2) 1) "108.96000176668167114"
       2) "34.25999964418929977"  
 #查看距离经纬度110 30 的500km范围内的一个城市并显示他的距离和经度,纬度,(china:city对象中)
 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 1   
 1) 1) "chongqing"
    2) "341.9374"
    3) 1) "106.49999767541885376"
       2) "29.52999957900659211"
 #查看距离经纬度110 30 的500km范围内的两个城市并显示他的距离和经度,纬度,(china:city对象中)
 127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 2
 1) 1) "chongqing"
    2) "341.9374"
    3) 1) "106.49999767541885376"
       2) "29.52999957900659211"
 2) 1) "xian"
    2) "483.8340"
    3) 1) "108.96000176668167114"
       2) "34.25999964418929977"

根据地点查找地点GEORADIUSBYMEMBER

 #查看距离西安500km范围内的城市并显示他的经度和纬度
 127.0.0.1:6379> GEORADIUSBYMEMBER china:city xian 500 km withdist withcoord
 1) 1) "xian"
    2) "0.0000"
    3) 1) "108.96000176668167114"
       2) "34.25999964418929977"

返回一个或多个位置元素的 Geohash 表示GEOHASH

该命令将返回11个字符的Geohash字符串!

 #将二维的经纬度转换为一维的字符串。如果两个字符串越相似,那么距离越近!
 127.0.0.1:6379> GEOHASH china:city beijing chongqing
 1) "wx4fbxxfke0"
 2) "wm5xzrybty0"

GEO底层的实现原理其实就是Zset!我们可以使用Zset命令来操作geo!

示例:

 127.0.0.1:6379> ZRANGE china:city 0 -1      #查看地图中的全部元素
 1) "chongqing"
 2) "xian"
 3) "shengzhen"
 4) "hangzhou"
 5) "shanghai"
 6) "beijing"
 127.0.0.1:6379> ZREM china:city beijing     #删除地图中的beijing元素
 (integer) 1
 127.0.0.1:6379> ZRANGE china:city 0 -1
 1) "chongqing"
 2) "xian"
 3) "shengzhen"
 4) "hangzhou"
 5) "shanghai"

明天继续加油!