需求:今天碰到一个需求是将骑手(相当于美团外卖的骑手)的实时定位保存下来,或者像京东物流的送货员的轨迹,我们可以看到我们的快递到哪个地方了,快递员现在在哪个位置。

思路:骑手登录之后前端每1分钟上传GPS定位,后端接收数据先保存到redis中, 然后采用定时任务批量处理redis中的数据批量存入mysql中。(暂时采用该方案,以后可能直接用HBase之类的了)。

实现:

前端上传的实体,前端也是批量上传的,List


redis的pipe redis的pipeline删除_redis


前端上传位置的List直接存Redis,并且以上传集合的手机号为key,因为同一台手机上传的手机号肯定是相同的。


redis的pipe redis的pipeline删除_redis 批量删除key_02


存到Redis的结构是list的形式;


redis的pipe redis的pipeline删除_redis的pipe_03


手机号为key, 下面是上传的集合对象;

1、从redis中批量获取每个key前n个数据。

2、入库,批量写入mysql数据。

3、删除redis中已经入库的数据(按手机号分组)

1>常规方法:


redis的pipe redis的pipeline删除_redis 批量删除_04

常规方法


这里我就不贴出改方法要消化的时间了,处理一万条数据反正让人吐血。

2>多线程方法处理:


redis的pipe redis的pipeline删除_redis 批量删除key_05

线程方法


redis的pipe redis的pipeline删除_redis的pipe_06

从redis中获取对象


redis的pipe redis的pipeline删除_上传_07

多线程删除redis中已经入库的对象


这样处理时间稍微好点,但是还是有点吐血;

3>管道方式处理:


redis的pipe redis的pipeline删除_redis的pipe_08

管道方式从redis获取对象集合


redis的pipe redis的pipeline删除_redis 批量删除_09


把循环遍历的方法放到管道中,大家自己去测试一下吧,效率是几十倍甚至上百倍,这就是与Mysql一样批量处理的好处。


redis的pipe redis的pipeline删除_redis_10

mysql的批量处理方式


请大家多多指教,验证一下效率如何。