MySQL实现数据同步(生产者)将数据存放到Redis中(SpringBoot)

依赖:除一下两个还有mybatisplus、MySQL、lombok

<!--  此依赖为监听MySQL的数据变化-->    
        <dependency>
            <groupId>com.zendesk</groupId>
            <artifactId>mysql-binlog-connector-java</artifactId>
            <version>0.27.1</version> <!--2022.09.17版的-->
        </dependency>

<!-- 创建SpringBoot项目加入redis的starter依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

 实现思路:需要把同步的数据库的所有数据读取出来

  1.  先查询某个数据库中的所有表名以及主键
  2. 根据表名去查询表中所有的数据(因为需要字段名对应的值,所有存储到map中)
  3. 把封装好的数据存入中间件(我这里用的Redis)

 代码实现:

  1. 实体类:表名称、表主键、表数据(字段名、值)
    1. @Data
      public class TableDataAndKey {
          String tableName;
          String key;
          
          List<Map<String,Object>> data;
      }
  2.  读取数据库数据(第一个查询传入数据库名称,查询到所有的表名以及主键。第二个查询传入表名称,查询到表的所有数据存放到map中)
    1. <mapper namespace="com.lcx.mapper.MapperDb">
          
          <select id="allTableName" resultType="com.lcx.entity.TableDataAndKey">
              select a.TABLE_NAME 'tableName',a.column_name 'key' from information_schema.Columns a
              where TABLE_SCHEMA=#{dbName} AND COLUMN_KEY='PRI'
          </select>
          <select id="selectList" resultType="java.util.Map" parameterType="java.lang.String">
              select * from ${tableName}
          </select>
      
      
      </mapper>

        

           @Autowired
          MapperDb mapperDb;
          
          //存放表数据(pojo:表名称、主键、map<字段名,值>)
          public static List<TableDataAndKey> tableData; 
       
          public  void tableNameAll(String name){
              //读取zy数据库中所有表名以及主键
              List<TableDataAndKey> tableName = mapperDb.allTableName(name);
              for (TableDataAndKey list : tableName) {
                  //根据表名称查询到表中的数据,并存放在map中
                  List<Map<String, Object>> maps = mapperDb.selectList(list.getTableName());
                  list.setData(maps);
              }
              tableData=tableName;
          }

      这样数据库所有表的数据已经存进实体类中了,然后定义了一个静态list变量存放进去。我这里实现了ApplicationRunner接口,重写run方法。当项目启动的时候调用tableNameAll()方法传入数据库名称就可以。这样静态list变量就有数据了

       
  3. 把数据存放进中间件(我这里用的Redis用kafka等等都可以)
    1. @Component
      @Order(2)//规定执行顺序
      public class DataToRedis implements ApplicationRunner {
          private static final String PRODUCT_LIST_KEY = "key_测试";
          @Autowired
          RedisTemplate redisTemplate;
      
      
          @Override
          public void run (ApplicationArguments args) throws Exception 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值