博主
258
258
258
258
专辑

第十七节 ES聚合查询-数据同步,增量和全量

亮子 2024-03-05 01:57:13 7889 0 0 0

第10单元-ES聚合查询-03-数据同步,增量和全量

项目需求:

用户发布的朋友圈,需要在30分钟审核期后,同步到ES中。

需求描述:

用户发布的朋友圈,需要在30分钟审核期后,同步到ES中。除了定时全量同步数据以外,也需要定时对朋友圈信息进行同步。


1、全量同步

全量同步是指在数据同步过程中,将源数据全部复制到目标系统的过程。这种同步方式通常用于初始化目标系统的数据,或者在源数据发生大规模变化时进行全面更新。全量同步的特点包括:

  1. 数据完整性:全量同步能够确保目标系统中的数据与源系统完全一致,不会丢失任何数据。

  2. 初始同步:在数据同步任务开始时,通常会进行一次全量同步,以确保目标系统中有完整的数据副本。

  3. 耗时较长:由于需要复制大量数据,全量同步通常需要较长的时间来完成,尤其是在数据量较大的情况下。

  4. 增量同步的补充:全量同步通常会与增量同步结合使用,全量同步用于初始化数据,而增量同步用于持续同步源系统的变化数据。

全量同步在数据迁移、数据备份、数据初始化等场景中经常被使用。然而,由于耗时较长且可能会影响系统性能,因此在实际应用中需要根据具体情况进行合理规划和使用。

2、增量不同

数据的增量同步是指在数据同步过程中,只同步源系统中发生变化的数据到目标系统,而不是全量复制所有数据。这种同步方式通常用于持续保持目标系统中的数据与源系统的同步更新。增量同步的特点包括:

  1. 只同步变化数据:增量同步只会将源系统中发生变化的数据同步到目标系统,而不会复制所有数据。

  2. 减少同步时间:由于只同步变化的数据,增量同步通常比全量同步耗时更短,能够更快地完成数据同步任务。

  3. 增量更新:增量同步通常会定期或实时地检测源系统中的数据变化,并将变化的数据同步到目标系统,从而保持目标系统的数据与源系统的实时更新。

  4. 与全量同步结合:增量同步通常会与全量同步结合使用,全量同步用于初始化数据,而增量同步用于持续同步源系统的变化数据。

增量同步在数据同步、数据备份、数据复制等场景中经常被使用。它能够有效减少同步时间,降低系统负担,并且能够保持目标系统与源系统的数据同步更新。

3、全量同步与增量同步的演示代码

  • 演示代码
    @Scheduled(cron = "0 0/1 * * * ?")
    public void syncTbUserInfo() {

        String syncTbKey = "SYNC-TB-VO";
        Date syncTime = null;
        String s = stringRedisTemplate.opsForValue().get(syncTbKey);
        if(s == null) {

            // 实现全量同步
            log.info("=========== 全量同步的 TbUserInfo 到ES中 ====================");

            List<TbUserInfoVo> tbUserInfo = tbUserInfoMapper.getTbUserInfo(null);
            for (TbUserInfoVo tbUserInfoVo : tbUserInfo) {
                elasticsearchRestTemplate.save(tbUserInfoVo);

                // 更新同步标识(更新时间)
                syncTime = tbUserInfoVo.getCreateTime();
            }

            // 更新同步标识
            if(syncTime != null) {
                stringRedisTemplate.opsForValue().set(syncTbKey, "" + syncTime.getTime());
            }

            return;
        }

        // 实现增量同步了
        log.info("=========== 增量同步的 TbUserInfo 到ES中 ====================");

        // 只有更新时间大于这个标识的时间,才需要同步
        Date date = new Date(Long.valueOf(s));
        List<TbUserInfoVo> tbUserInfo = tbUserInfoMapper.getTbUserInfo(date);
        for (TbUserInfoVo tbUserInfoVo : tbUserInfo) {
            elasticsearchRestTemplate.save(tbUserInfoVo);

            // 更新同步标识(更新时间)
            syncTime = tbUserInfoVo.getCreateTime();
        }

        // 更新同步标识
        if(syncTime != null) {
            stringRedisTemplate.opsForValue().set(syncTbKey, "" + syncTime.getTime());
        }

    }
  • 自定义SQL语句的mapper
    <select id="getTbUserInfo" resultType="com.bwie.vo.TbUserInfoVo">
        select a.id,a.user_name,a.user_role,b.nick_name,b.avatar,b.age,a.create_time from tb_user as a
        left join tb_user_info as b on a.id=b.user_id
        where 1=1
              <if test="beginTime != null">
                <![CDATA[
                    and a.create_time > #{beginTime}
                ]]>
              </if>
        order by a.create_time
    </select>