Redis 三种特殊类型之 Geospatial 类型
简单介绍
Geospatial(地理空间)在 Redis 3.2 版本推出, 是一种地理位置相关的数据结构。该功能可以推算地理位置的信息,两地之间的距离,方圆几里的人。一般可以用于朋友的定位,附近的人,打车的距离等场景。
基本指令
# GEOADD 添加地理位置信息,这里注意不能包括两极地区
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 106.50 29.53 chongqing 114.05 22.52 shenzhen 120.16 30.14 hangzhou 108.96 34.26 xian # 添加多个地理位置信息
(integer) 4
# GEOPOS 获取指定位置的经度和纬度
127.0.0.1:6379> GEOPOS china:city chongqing # 获取一个位置的定位
1) 1) "106.49999767541885376"
2) "29.52999957900659211"
127.0.0.1:6379> GEOPOS china:city chongqing beijing shanghai # 获取多个位置的定位
1) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "116.39999896287918091"
2) "39.90000009167092543"
3) 1) "121.47000163793563843"
2) "31.22999903975783553"
# GEODIST 返回两个指定位置之间的直线距离,可以指定具体单位,默认为米
127.0.0.1:6379> GEODIST china:city beijing chongqing km # 获取北京和重庆之间的距离,单位取 km
"1464.0708"
# GEORADIUS 以给定的经纬度为中心,返回某一半径内的所有元素
127.0.0.1:6379> GEORADIUS china:city 110 30 2000 km # 在经度110,纬度30,半径 2000 千米内的所有位置
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> GEORADIUS china:city 110 30 2000 km withcoord # 同时显示所有位置坐标
1) 1) "chongqing"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) 1) "108.96000176668167114"
2) "34.25999964418929977"
3) 1) "shenzhen"
2) 1) "114.04999762773513794"
2) "22.5200000879503861"
4) 1) "hangzhou"
2) 1) "120.1600000262260437"
2) "30.14000050377078566"
5) 1) "shanghai"
2) 1) "121.47000163793563843"
2) "31.22999903975783553"
6) 1) "beijing"
2) 1) "116.39999896287918091"
2) "39.90000009167092543"
127.0.0.1:6379> GEORADIUS china:city 110 30 2000 km withdist # 同时显示所有位置的距离,默认正序,可倒序 desc
1) 1) "chongqing"
2) "341.9374"
2) 1) "xian"
2) "483.8340"
3) 1) "shenzhen"
2) "924.6408"
4) 1) "hangzhou"
2) "977.7700"
5) 1) "shanghai"
2) "1105.9098"
6) 1) "beijing"
2) "1245.2858"
127.0.0.1:6379> GEORADIUS china:city 110 30 2000 km withhash # 同时显示左右位置的哈希
1) 1) "chongqing"
2) (integer) 4026042091628984
2) 1) "xian"
2) (integer) 4040115445396757
3) 1) "shenzhen"
2) (integer) 4046432193584628
4) 1) "hangzhou"
2) (integer) 4054121460196926
5) 1) "shanghai"
2) (integer) 4054803462927619
6) 1) "beijing"
2) (integer) 4069885360207904
127.0.0.1:6379> GEORADIUS china:city 110 30 2000 km count 2 # 限制返回数量为 2
1) "chongqing"
2) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 2000 km store china:city # 和集群有关
(integer) 6
127.0.0.1:6379> GEORADIUS china:city 110 30 2000 km storedist china:city # 和集群有关
(integer) 6
# GEORADIUSBYMEMBER 以给定的位置为中心,其余参与和上指令完全一样
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km # 返回集合中距离北京 1000 千米的所有位置
1) "beijing"
2) "xian"
# GEOHASH 获取各个位置经纬度的哈希值,长度为 11 位
127.0.0.1:6379> GEOHASH china:city beijing
1) "wx4fbxxfke0"
127.0.0.1:6379> GEOHASH china:city shanghai xian chongqing
1) "wtw3sj5zbj0"
2) "wqj6zky6bn0"
3) "wm5xzrybty0"
# 删除位置,查看所有位置,通过 zset 相关指令,同时也说明了其底层用到了 zset
127.0.0.1:6379> ZRANGE china:city 0 -1 # 查看集合中所有的位置
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> ZREM china:city beijing # 删除集合中指定的位置
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
应用场景
- 查看附近的人
- 微信位置共享
- 地图上直线距离的展示