mysql redis geo_Redis GEO & 实现原理深度分析

本文深入探讨了如何利用Redis GEO API实现附近搜索功能,如查找附近车辆,以及其背后的geohash编码和ZSet存储原理。通过ZADD指令和geohash将经纬度转换为可索引的值,实现高效的数据检索。同时,文章讨论了Redis GEO的局限性,并提及MySql和MongoDB的空间索引作为潜在的优化方案。
摘要由CSDN通过智能技术生成

f60d74f7948bca166b0253602f99b061.png

移动互联网已融入到我们生活中的方方面面。

我们平时找商家、找房子、找车都可以通过各种App来完成。作为:man:‍:computer:‍的笔者职业习惯性地思考这些功能是如何实现的呢?

例如寻找附近3公里范围内的出租车的需求,最直观的想法就是去 数据库 里面查表筛选出距离用户小于3公里的车辆,将数据返回给客户端。

这种方法有一个很严重的问题,需要对整张表里面的每一项都计算一次相对距离太耗时了。既然整张表数据量比较大那么我们能不能缩小扫描的范围呢?那么就会想到是否可以按业务特点缩小扫描范围比如只扫描用户当前位置所在城市的车辆,按照这个思路扩展开来发现数据量还是很大而且不能解决当用户处于两个城市的边界时的问题。

如何快速地索引数据是解决这个问题的关键,在浏览Redis API的时候发现其可以直接实现附近的XXX功能,下文中将介绍如何以 Redis 实现此类功能并深入分析其背后的实现原理。

2 Redis GEO API

2.1 增加地理位置信息

geo add key longitude latitude member [longitude latitude member ...]

复制代码

eg:

向cars:locations中增加车辆编号为1以及车辆编号为2的位置信息。

127.0.0.1:6379> geoadd cars:locations 120.346111 31.556381 1 120.375821 31.560368 2

复制代码

2.2 获取地理位置信息

eg:

获取车辆编号为1的车辆位置信息

127.0.0.1:6379> geopos cars:locations 1

1) 1) "120.34611314535140991"

2) "31.55637987511895659"

复制代码

2.3 获取两个地理位置的距离

eg:

获取编号为1的车辆与编号为2的车辆之间的距离

127.0.0.1:6379> geodist cars:locations 1 2 km

"2.8504"

复制代码

2.4 获取指定位置范围的地理信息位置集合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值