Heim  >  Fragen und Antworten  >  Hauptteil

php - laravel中导入excel 数据量很大的情况下 处理重复数据时如果做最好

用laravel excel导入用户的excel
能够预计到的一个excel大概会有几千到几万条不等。
需要判断不导入重复的用户,比如导入10000人 数据库里面已经有100人了 那么这100人需要被判断出来 做另外的逻辑处理。另外9900人导入。并且记录着9900的插入状态 比如成功8000条 失败1900条。想在想到几个方案 不知道哪个比较合理
1、传统的批量的插入方法,无法精确到每条数据是否重复或者记录返回状态。但是效率应该是比较高的。
2、用for循环 插入前 先查询然后是否存在 然后插入完再记录状态 从业务逻辑上是最能符合需求的 但是效率很低,估计很容易就要500错误或者timeout。
3、在2的基础上改进 把整个过程写进队列 chunk分组后 进队列 然后后台处理。缺点就是用户相对来说体验比较差,不能立等可取 还需要配合通知系统来做这个。
4、查了下 还有种是用事务 分块提交,不知道这种如何 还没有测试。也请各位大大指教。

不知道各位大大还有什么更好的办法。能够在效率和逻辑中都比较平衡的。感谢了

世界只因有你世界只因有你2735 Tage vor1126

Antworte allen(2)Ich werde antworten

  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-16 13:00:18

    看题目的意思,我理解是
    1、excel 上传
    2、excel 分析,入库
    3、返回数据给用户

    整个过程,应该是比较耗时的,可以给用户【处理中】的状态,后台处理,等完全处理好之后,输出结果。

    至于判断是否重复用户,记录成功失败的状态,可以考虑先存入 redis 会比较快,最后所有结果 入库 处理

    Antwort
    0
  • 大家讲道理

    大家讲道理2017-05-16 13:00:18

    说下我的思路,不喜勿喷.

    假设数据库和excel中的唯一标识为用户身份证号码:

    • 将数据库中现有的身份证号查出来,

    • Excel上传之后,遍历每一行,并判断当前这一条数据中的身份证号是否在数据库中查出来的是数组中

    • 如果不在,写入数据库中,并在查出来的数组中追加这个身份证号,

    • 如果在,跳过

    我这边线上环境,一次上传一个5w+行的Excel文件,等待时间也就6秒左右.
    当然,每个线上环境和Excel文件的单行列数是不一样的,
    仅供楼主参考.

    Antwort
    0
  • StornierenAntwort