有这样一个需求,有一个定时任务,会去从ElasticSearch中聚合出数据,假定数据只有一个name属性,此时会将这一批数据存到MySQL中,存到MySQL中的数据会额外添加几个字段,比如address等,用户通过前端页面可以更新address字段(name不允许更新)。
所以问题就是每次定时任务,ES中查出来一批数据,需要和现有的MySQL中的进行对比,如果某个name已经存在了,那么不更新,如果发现有新的name,那么插入MySQL,如何操作效率会最高呢?
最简单的一种,就是遍历ES查出来的所有数据,每一条用name去MySQL里查一下,如果select不出来,那么将这一条存到list中,最后遍历完成之后将整个list批量插入MySQL。
有其他方法吗?或者上述方法存在问题?(特别在大数据量情况下,OOM之类的)
使用的是MyBatis和MySQL。
这个要看你的实时性要求有多高,我以前也弄过类似的,我用 redis 的 hash 结构,一分钟之内在 redis 内做更新,每隔一分钟会把数据更新进数据库,采用批量更新,批量插入,在每分钟 100 万的量可以承受住