虽然我们创建了订单,但是略过了寻找附近适合接单的司机。我们必须要把这个功能给补上,那就先来看看怎么查询附近的司机吧。假设司机端的小程序实时把自己的GPS定位上传,然后定位信息缓存到Redis里面。咱们怎么能利用Redis计算出,上车点方圆几公里的司机都有谁呢?这就需要使用Redis的Geo功能。
Redis的Geo主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。 下面我们用GEOADD
命令向Redis里面添加几个景点的定位。
GEOADD china 116.403963 39.915119 tiananmen 116.417876 39.915411 wangfujing 116.404354 39.904748 qianmen
然后我们GEORADIUS
命令查询距离某个定位点1公里范围以内的景点有哪些。
GEORADIUS china 116.4000 39.9000 1 km WITHDIST
既然Redis的GEO命令可以帮我们提取出某个坐标点指定距离以内的景点,如果Redis里面缓存的是司机的定位信息,那么我们用代驾单的起点坐标来查询附近几公里以内的司机,是不是也可以?而且Redis的Geo计算是在内存中完成的,比MySQL的Geo计算快了上千倍。
有个需要特别注意的问题就是Geo中的定位我们没办法设置超时时间,所以我们想要知道哪些司机上线中,就得额外创建带有超时的缓存。
我的设想是缓存司机信息用的Key是 "driver_online#driverId"
,对应的Value是 "接单距离#订单里程范围#定向接单的坐标"
,"超时时间为1分钟"。当系统接到订单之后,到Redis上面根据driverId查找缓存,找到了就是在线,找不到就是不在线。