官方相关介绍:https://redis.io/commands/geoadd

菜鸟教程:https://www.runoob.com/redis/redis-geo.html

在线测试:https://try.redis.io/

版本支持

Redis GEO是 Redis 3.2版本之后才支持的。所以我们要确定我们的版本是否支持,打开redis-cli 输入 info 就可以查看redis的信息了!但是要注意一点,Redis GEO相关,可能新命令需要高级版本Redis服务版本支持。

原理:GEOHASH算法(我们无需关注),将经纬度坐标转为score,存储在zset实现的。

特别说明:Redis实现GEO适用性较窄:Redis是非关系型数据库,如果需要实现搜索附近的烧烤店还是比较复杂的,附近有1万家各种类型的商铺,redis无法通过店铺ID与店铺类型关系的筛选作用!推荐使用MongoDB也支持GEO,可以简单实现一些关系查询。ElasticSearch的GEO维护性太高,如果已经有人维护、设计ElasticSearch还是优先推荐ElasticSearch实现GEO的!

注意事项:

经度范围是:-180° 到180°的

纬度范围是 :-85.0511278° 到 85.05112878°

Redis GEO相关的命令

  • GEOADD :将经纬度添加到key中 参数:Key、精度、维度、名称
  • GEODIST : 获取两个坐标之间的距离 默认单位是m 参数 :Key、 名称1、 名称2、单位(可不填写,千米就是km)
  • GEOHASH : 返回11位丢失精度的经纬度字符串(如果两个字符串越接近,说明越接近)
  • GEOPOS
  • GEORADIUS : 获取某一点的某半径内的元素 参数:Key、精度、维度、半径、单位(km)、其他参数(可出现多个WITHDIST、WITHCOORD、WITHHASH、ASC、DESC,更多参数建议去官网查看,更详细) 从 Redis 版本 6.2.0 开始,此命令被视为已弃用。在迁移或编写新代码时
  • GEORADIUSBYMEMBER : 以某个元素为中心,查询某半径范围内的元素 参数:Key、名称、半径、单位、其他参数(更多参数建议去官网查看,更详细))
  • GEOSEARCH:代替GEORADIUS
  • GEOSEARCHSTORE:代替GEORADIUSBYMEMBER

实验一:添加城市

# 将116.40 39.90 添加到china:city中,并命名为北京
geoadd china:city 116.40 39.90 beijing

# 连续填写城市
geoadd china:city 121.47 31.23 shanghai 114.05 22.52 shenzhen 120.16 30.24 hangzhou 108.96 34.26 xian

实验二:两个坐标的距离

geodist china:city beijing xian
>> "910056.5237"

geodist china:city beijing xian km
>> "910.0565"

实验三:查询指定区域范围的其他元素

# 查询符合距离115.00 38.00 1000千米的前100个元素
georadius china:city 115.00 38.00 1000 km asc count 100
1) "beijing"  
2) "hangzhou"
3) "shanghai"
4) "xian"

# 查询符合距离115.00 38.00 500千米的元素
georadius china:city 115.00 38.00 500 km
1) "beijing"

实验四:查询某个元素来指定半径

# 查询元素北京范围内1000千米的元素
georadiusbymember china:city beijing 1000 km
1) "beijing"
2) "xian"

底层实现就是Zset

当我根据某个元素查询指定半径的其他元素时,发现元素名称打错了,就报了如下错误:

zset member 就是zset集合!

实验四:可用Zset实现原理实现删除某个位置

# 查询所有的 china:city 元素
zrange china:city 0 -1

# 删除北京元素
zrem china:city beijing
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取全部资料 ❤