问答 / 0 / 17 / 创建于 2年前
需求:用户下单成功后,订单表中有经纬度。骑手登录之后会不停的更新经纬度。寻找最近1公里的骑手,1公里没有骑手,就扩大2公里。依次类推,每次增加1公里(可设置)。最终目标是把这个订单派发给骑手。目前用thinkphp5命令行运行,总是提示Allowed memory size of 134217728 bytes exhausted。命令行中通过递归增加公里,但测试只能运行5次,就出错。请问大家有什么好的方法来轮询订单派送。
1、限制增加次数(超过5公里的骑手,在业务上是否合理) 2、增加 PHP 运行内存 :stuck_out_tongue_winking_eye:
用 Redis 或者 ES 的 GEO 能力,不用自己算
同上 明显GEO合适些
上go语言
博客:redis三种特殊数据类型
可以用 Redis 的 GEOHASH 实现,省事
你说的递增它需要递归吗?
mysql有现成好用的计算距离的函数的,把骑手经纬度 定时保存到表里,直接查出按消费者距离排序的所有骑手,不是很方便吗?
$sql = 'select st_distance_sphere(point( ?,? ), point( machine_report_longitude, machine_report_latirtude ) ) distance from wws_machine where id= ? ';
用户下单流程把订单号和订单主键索引,经纬度存储到redis geo,就可以完成查询。
感觉5次轮询就把内存打爆了有点奇怪啊。 要不换种实现:骑手每N分钟上报位置,存到 redis(数据库也行),订单来了就取当时所有骑手的位置信息和用户位置做计算(存数据库要自己算),把订单派给最近的骑手就完了。也不用轮询,简单的计算也不耗内存。如果用 redis 的话,它自带的geo还更快。 redis geo 没用过,不过应该不难的。mongo 也有 geo
别递归了,直接for循环.或者搞一个限制,递归限制调用多少次,要不然无论多大内存都得内存溢出
简单点思考:直接在数据库里,根据经纬度计算距离排序,取第一条。
经理的要求你要翻译成程序可以理解的。
内存爆了你是有泄露,解决了这个问题就OK了
我要举报该,理由是:
1、限制增加次数(超过5公里的骑手,在业务上是否合理) 2、增加 PHP 运行内存 :stuck_out_tongue_winking_eye:
用 Redis 或者 ES 的 GEO 能力,不用自己算
同上 明显GEO合适些
上go语言
博客:redis三种特殊数据类型
可以用 Redis 的 GEOHASH 实现,省事
你说的递增它需要递归吗?
mysql有现成好用的计算距离的函数的,把骑手经纬度 定时保存到表里,直接查出按消费者距离排序的所有骑手,不是很方便吗?
用户下单流程把订单号和订单主键索引,经纬度存储到redis geo,就可以完成查询。
感觉5次轮询就把内存打爆了有点奇怪啊。 要不换种实现:骑手每N分钟上报位置,存到 redis(数据库也行),订单来了就取当时所有骑手的位置信息和用户位置做计算(存数据库要自己算),把订单派给最近的骑手就完了。也不用轮询,简单的计算也不耗内存。如果用 redis 的话,它自带的geo还更快。 redis geo 没用过,不过应该不难的。mongo 也有 geo
别递归了,直接for循环.或者搞一个限制,递归限制调用多少次,要不然无论多大内存都得内存溢出
简单点思考:直接在数据库里,根据经纬度计算距离排序,取第一条。
经理的要求你要翻译成程序可以理解的。
内存爆了你是有泄露,解决了这个问题就OK了