微服务 SpringBoot 整合 Redis GEO 实现附近商户功能
在点评项目中如何实现附近商家的查询呢,展示出距离自己 5 公里内的商户,这样的功能如何实现?
答案是可以采用 Redis 来实现,当然可能有很多实现方式,本文主要介绍如何使用 Redis 实现 附近商户的搜索功能
一、Redis GEO 数据结构用法
GEO 基本语法、指令
GEO 就是 GeoLocation 的简写形式,代表地理坐标。Redis 在 3.2 版本中加入了对 GEO 的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。
常见的命令
GEOADD:添加一个地理空间信息,包含:经度(longitude)、纬度(latitude)、值(member)
GEODIST:计算指定的两个点之间的距离并返回
GEOHASH:将指定 member 的坐标转为 hash 字符串形式并返回
GEOPOS:返回指定 member 的坐标
GEORADIUS:指定圆心、半径,找到该圆内包含的所有 member,并按照与圆心之间的距离排序后返回。6.以后已废弃
GEOSEARCH:在指定范围内搜索 member,并按照与指定点之间的距离排序后返回。范围可以是圆形或矩形。6.2.新功能
GEOSEARCHSTORE:与 GEOSEARCH 功能一致,不过可以把结果存储到一个指定的 key。 6.2.新功能
使用 GEO 存储经纬度、查询距离
本篇博文 Redis 版本为 6.2 版本
进入 redis 查询 geo 相关指令
使用 GEO 完成以下功能实现两点之间的距离查询,以及指定范围内的地点
需求如下:
使用 GEO 添加北京(天安门 116.397469 39.908821 、故宫 116.397027 39.918056、北海公园 116.389977 39.933144)经纬度
查询天安门与故宫之间的距离
在以上添加的地点中查询天安门广场 (116.397827 39.90374) 附近 2 公里的地点
GEOADD 添加
GEOPOS 查看指定地点经纬度信息
GEOHASH 查看指定地址经纬度 HASH 值
拓展: GEOPOS 和 GEOHASH 的区别在于 GEOHASH 节约了 经纬度存储的 内存、减少不必要的内存消耗,从而提升性能
GEODIST 查看天安门与故宫之间的距离
GEOSEARCH 查询天安门广场附近 2 公里的地点
二、SpringBoot 整合 Redis 导入店铺数据到 GEO
编写 SpringBoot 单元测试进行导入 Redis 数据
运行完毕,查看 Redis 即可
三、SpringBoot 整合 Redis 实现 附近商户功能
需求介绍
实现附近商户查询功能
采用 GEO 数据结构实现附近商户查询
完成分页功能
思路分析:
通过传输过来的 x、y 经纬度,然后我们根据该经纬度去查询 redis 中附近的商户,查出后即可返回,进行封装,查出来的结果进行循环添加至 Shop 地点距离,即可完成。
核心源码
ShopController
ShopService
进行测试
作者:Bug 终结者_
链接:https://juejin.cn/post/7187937697883750457
来源:稀土掘金
评论