官方相关介绍:https://redis.io/commands/geoadd
版本支持
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
当我根据某个元素查询指定半径的其他元素时,发现元素名称打错了,就报了如下错误:
![](https://www.zanglikun.com/wp-content/uploads/2021/07/1627379113-78805a221a988e7.png)
zset member 就是zset集合!
实验四:可用Zset实现原理实现删除某个位置
# 查询所有的 china:city 元素
zrange china:city 0 -1
# 删除北京元素
zrem china:city beijing
特殊说明: 上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取全部资料 ❤
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取全部资料 ❤
评论(0)