redis除了提供了五大基本数据类型String、List、Set、Hash、Zset,还有3个比较特殊的数据类型,Geospatial、Hyperloglog、Bitmap,这三个数据类型有一些比较有趣的应用场景,下面说说Geospatial,主要可以应用于跟地图相关的应用
相关命令
geoadd #将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
geodist #返回两个给定位置之间的距离。
geohash #返回一个或多个位置元素的 Geohash 表示
geopos #从key里返回所有给定位置元素的位置(经度和纬度)
georadius #以给定的经纬度为中心,返回键包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素
georadiusbymember #中心点是由给定的位置元素决定的,返回键包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素
参考文档:http://www.redis.cn/commands/geoadd.html
GEOADD
指定的地理空间位置(纬度、经度、名称)添加到指定的key中
127.0.0.1:6379> geoadd city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd city 117.19 39.01 tianjin
(integer) 1
127.0.0.1:6379> geoadd city 121.47 31.23 shanghai 118.77 32.04 nanjing 113.28 23.13 guangzhou 114.09 22.55 shenzhen
(integer) 4
GEODIST
返回两个给定位置之间的距离,如果两个位置之间的其中一个不存在,那么命令返回空值。
可以指定单位,默认是米
* m 米
* km 千米
* mi 英里
* ft 英尺
# 北京到天津的直线距离
127.0.0.1:6379> geodist city beijing tianjin
"120008.3662"
127.0.0.1:6379> geodist city beijing tianjin km
"120.0084"
根据百度地图测量工具看,计算出来的距离长度是没错的,误差是由于经度纬度填写导致的。
GEOHASH
返回一个或多个位置元素的 Geohash 表示
127.0.0.1:6379> geohash city beijing tianjin
1) "wx4fbxxfke0"
2) "wwgmftx1sz0"
GEOPOS
从key
里返回所有给定位置元素的位置(经度和纬度)。
127.0.0.1:6379> geopos city beijing tianjin shanghai nanjing guangzhou shenzhen
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
2) 1) "117.19000071287155151"
2) "39.01000119404034905"
3) 1) "121.47000163793563843"
2) "31.22999903975783553"
4) 1) "118.76999884843826294"
2) "32.03999960287850968"
5) 1) "113.27999979257583618"
2) "23.13000101271457254"
6) 1) "114.09000009298324585"
2) "22.5500010475923105"
GEORADIUS
以给定的经纬度为中心,返回键包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素。
可以指定单位,默认是米
- m 表示单位为米。
- km 表示单位为千米。
- mi 表示单位为英里。
- ft 表示单位为英尺。
应用:通过给定的半径距离来找附近的人等
127.0.0.1:6379> georadius city 120 20 1000 km #以120,20为中心,寻找方圆1000米的城市
1) "shenzhen"
2) "guangzhou"
127.0.0.1:6379> georadius city 120 20 1000 km withdist#返回位置元素的同时,将位置元素和中心之间的距离一并返回
1) 1) "shenzhen"
2) "674.9271"
2) 1) "guangzhou"
2) "777.2656"
127.0.0.1:6379> georadius city 120 20 1000 km withcoord#将位置信息和经度纬度一并返回
1) 1) "shenzhen"
2) 1) "114.09000009298324585"
2) "22.5500010475923105"
2) 1) "guangzhou"
2) 1) "113.27999979257583618"
2) "23.13000101271457254"
127.0.0.1:6379> georadius city 120 20 1000 km withcoord count 1#选取前1个匹配的元素
1) 1) "shenzhen"
2) 1) "114.09000009298324585"
2) "22.5500010475923105"
127.0.0.1:6379> georadius city 120 20 1000 km withcoord asc#从近到远
1) 1) "shenzhen"
2) 1) "114.09000009298324585"
2) "22.5500010475923105"
2) 1) "guangzhou"
2) 1) "113.27999979257583618"
2) "23.13000101271457254"
127.0.0.1:6379> georadius city 120 20 1000 km withcoord desc#从远到近
1) 1) "guangzhou"
2) 1) "113.27999979257583618"
2) "23.13000101271457254"
2) 1) "shenzhen"
2) 1) "114.09000009298324585"
2) "22.5500010475923105"
GEORADIUSBYMEMBER
找出位于指定元素周围的其他元素
127.0.0.1:6379> georadiusbymember city beijing 1000 km
1) "nanjing"
2) "tianjin"
3) "beijing"
127.0.0.1:6379> georadiusbymember city beijing 300 km
1) "tianjin"
2) "beijing"
可以用Zset的命令来操作Geo
127.0.0.1:6379> zrange city 0 -1
1) "shenzhen"
2) "guangzhou"
3) "shanghai"
4) "nanjing"
5) "tianjin"
6) "beijing"
127.0.0.1:6379> zrem city tianjin
(integer) 1
127.0.0.1:6379> zrange city 0 -1
1) "shenzhen"
2) "guangzhou"
3) "shanghai"
4) "nanjing"
5) "beijing"