redis学习(八)

redis学习(八)

三种特殊类型

Geospatial 地理位置

朋友的定位,附近的人,打车距离计算?
Redis 的 Geo 在Redis3.2 版本就推出了! 这个功能可以推算地理位置的信息,两地之间的距离,方圆
几里的人!
可以查询一些地理位置的测试数据:http://www.jsons.cn/lngcodeinfo/0706D99C19A781A3/
只有 六个命令:

image-20200725204707728

官方文档:https://www.redis.net.cn/order/3685.html

getadd

getadd 添加地理位置

  • 规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!

  • 有效的经度从-180度到180度。

  • 有效的纬度从-85.05112878度到85.05112878度。

  • 当坐标位置超出上述指定范围时,该命令将会返回一个错误

127.0.0.1:6666> geoadd china:city 31.23 121.47 shanghai # 这里报错。
(error) ERR invalid longitude,latitude pair 31.230000,121.470000
127.0.0.1:6666> geoadd china:city 116.40 39.90 beijing # 下面格式才对。
(integer) 1
127.0.0.1:6666> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6666> geoadd china:city 120.16 30.24 hangzhou
(integer) 1
127.0.0.1:6666> geoadd china:city 108.96 34.26 xian
(integer) 1
127.0.0.1:6666> geoadd china:city 113.66 34.75 zhengzhou
(integer) 1
# 获取当前坐标定位。
127.0.0.1:6666> geopos china:city beijing # 获取指定城市的经纬度。
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
127.0.0.1:6666> geopos china:city beijing shanghai
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
2) 1) "121.47000163793563843"
   2) "31.22999903975783553"
# geodist 两人之间的距离
# 单位 m,km,mi英里,ft英尺。
127.0.0.1:6666> geodist china:city beijing shanghai km # 北京到上海单位千米。
"1067.3788"
127.0.0.1:6666> geodist china:city beijing zhengzhou # 北京到郑州单位米。
"621882.2073"
127.0.0.1:6666> geodist china:city beijing zhengzhou km
"621.8822"
# georadius 以给定的经纬度为中心, 找出某一半径内的元素
# 我附近的人? (获得所有附近的人的地址,定位!)通过半径来查询!
# 获得指定数量的人,200
# 所有数据应该都录入:china:city ,才会让结果更加请求
127.0.0.1:6666> georadius china:city 110 30 1000 km # 根据110 30 经纬度为坐标,寻找方圆1000km内的城市。
1) "xian"
2) "hangzhou"
3) "zhengzhou"
127.0.0.1:6666> georadius china:city 110 30 500 km
1) "xian"
127.0.0.1:6666> georadius china:city 110 30 500 km withdist # 显示范围内城市,加距离。
1) 1) "xian"
   2) "483.8340"
127.0.0.1:6666> georadius china:city 110 30 500 km withcoord # 显示他人的定位信息。
1) 1) "xian"
   2) 1) "108.96000176668167114"
      2) "34.25999964418929977"
127.0.0.1:6666> georadius china:city 110 30 1000 km withdist withcoord count 1 # 筛选出最近的一个结果。
1) 1) "xian"
   2) "483.8340"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"
127.0.0.1:6666> georadius china:city 110 30 1000 km withdist withcoord 
1) 1) "xian"
   2) "483.8340"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"
2) 1) "hangzhou"
   2) "977.5143"
   3) 1) "120.1600000262260437"
      2) "30.2400003229490224"
3) 1) "zhengzhou"
   2) "630.2160"
   3) 1) "113.65999907255172729"
      2) "34.74999926510690784"
127.0.0.1:6666> georadius china:city 110 30 1000 km withdist withcoord count 2 # 两个。
1) 1) "xian"
   2) "483.8340"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"
2) 1) "zhengzhou"
   2) "630.2160"
   3) 1) "113.65999907255172729"
      2) "34.74999926510690784"
# 找出指定范围内的其他元素。通过a找b。
127.0.0.1:6666> georadiusbymember china:city beijing 1000 km 
1) "zhengzhou"
2) "beijing"
3) "xian"
127.0.0.1:6666> georadiusbymember china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"
# geohash返回11位的字符串。将二维的经纬度,转换为一个字符串,两个字符串越相近,表示距离也越近。
127.0.0.1:6666> geohash china:city beijing zhengzhou
1) "wx4fbxxfke0"
2) "ww0vdqh9mv0"
# geo的底层就是zset,同理可以使用zset的命令。
127.0.0.1:6666> zrange china:city 0 -1
1) "xian"
2) "hangzhou"
3) "shanghai"
4) "zhengzhou"
5) "beijing"
127.0.0.1:6666> zrem china:city beijing
(integer) 1
127.0.0.1:6666> zrange china:city 0 -1
1) "xian"
2) "hangzhou"
3) "shanghai"
4) "zhengzhou"