移动互联网已融入到我们生活中的方方面面。
我们平时找商家、找房子、找车都可以通过各种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 获取指定位置范围的地理信息位置集合