当前位置:   article > 正文

springboot下mongodb 与 redis 数据同步(实现事物同步)_redis的数据如何同步到mongodb

redis的数据如何同步到mongodb

1.pom文件

 

  1. <!--redis支持 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-redis</artifactId>
  5. </dependency>
  6. <!--mongo支持-->
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  10. </dependency>

2.yml配置

  1. spring:
  2. redis:
  3. host: 127.0.0.1
  4. port: 6379
  5. application:
  6. name: smart-bop
  7. cloud:
  8. config:
  9. profile: dev
  10. server:
  11. port: '${web_server_port:8081}'
  12. tomcat:
  13. basedir: tomcat
  14. accesslog:
  15. enabled: true
  16. directory: logs
  17. logging:
  18. file: log/smart-bop.log
  19. level:
  20. ROOT: INFO
  21. org.springframework.web.filter.CommonsRequestLoggingFilter: DEBUG
  22. com.eingsoft.emop: DEBUG
  23. mongodb:
  24. uri: 'mongodb://root:Rdis2fun@192.168.1.18:27017,192.168.1.18:27018,192.168.1.18:27019/bop?authSource=admin&connect=replicaSet&readPreference=secondaryPreferred&safe=true&authMechanism=SCRAM-SHA-1&maxPoolSize=500&minPoolSize=10'
  25. classification:
  26. root: ICM

3.添加mongo的事物整合

 

  1. @Value("${mongodb.uri}")
  2. private String mongodbUri;
  3. @Beanpublic MongoDbFactory mongoFactory() {
  4. return new SimpleMongoDbFactory(new MongoClientURI(mongodbUri));
  5. }
  6. @Bean(name = "mongoTemplate")
  7. public MongoTemplate mongoTemplate() {
  8. return new MongoTemplate(mongoFactory());
  9. }
  10. @Bean(name = "mongoTransactionManager")
  11. public MongoTransactionManager mongoTransactionManager(MongoTemplate template) {
  12. return new MongoTransactionManager(template.getMongoDbFactory());
  13. }
  14. @Beanpublic ValidatingMongoEventListener validatingMongoEventListener() {
  15. return new ValidatingMongoEventListener(validator());
  16. }

4.业务代码(注释掉的可以不需要)

  1. //TODO 保证mongodb 与 redis 数据同步ParameterDefinition-测试909
  2. //注解保证mongo事物(声明式事物)
  3. @Transactional
  4. //@Transactional(rollbackFor = { Exception.class })
  5. public void save(ParameterDefinition parameterDefinition) throws Exception{
  6. //开启redis事务权限(采用手动事务)
  7. parameterDefinitionRedisTemplate.setEnableTransactionSupport(true);
  8. try {
  9. //开启redis事务
  10. parameterDefinitionRedisTemplate.multi();
  11. String name = parameterDefinition.getName();
  12. //直接更新redis再通知其他节点,跟新map
  13. String redisKry = Constant.Parameter_Definition_Sufix+name;
  14. //更新redis parameterDefinitionRedisTemplate.delete(redisKry);
  15. parameterDefinitionRedisTemplate.opsForValue().set(redisKry, parameterDefinition);
  16. //保存到mongo if (parameterDefinition.getRuntimeType() == null) {
  17. parameterDefinition.setStaticType(ParameterType.valOf(parameterDefinition.getTypeName()));
  18. parameterDefinition.setRuntimeType(ParameterType.valOf(parameterDefinition.getTypeName()));
  19. }
  20. //测试回滚 int i = 1/0;
  21. parameterDefRepository.save(parameterDefinition);
  22. //redis成功就提交 parameterDefinitionRedisTemplate.exec();
  23. } catch (Exception e) {
  24. //redis失败了就回滚 parameterDefinitionRedisTemplate.discard();
  25. log.error(e);
  26. log.error("ParameterDefinitionService save发生异常,回滚mongo与redis");
  27. //TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  28. //自定义抛出异常,方便被aop的异常通知捕获到
  29. //throw new Exception("ParameterDefinitionService save发生异常,回滚mongo与redis"); }
  30. }

效果已经验证成功啦,这里就不演示啦。

 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号