如何使用定时器,将redis数据更新到mysql做持久化

分析

  • 前提须知:(一)vo的阅读量+1,(二)vo的收藏量+1,(三)vo的点赞量+1
  • 以上三篇文章所用的vo类是存在redis中为同一个类型,一篇文章对应一个vo对象在redis中
  • 以下定时操作,将redis中文章id为key对应的vo对象,持久化进mysql中
    在这里插入图片描述

mysql的文章实体类

  • 画红圈才是此演示用到的数据内容
    在这里插入图片描述

redis中作为value的vo类

  • 文章的id作为key,一个文章对应一个这样的vo类,存入redis中
    在这里插入图片描述

定时器

  • 首先在启动类上贴上注解@EnableScheduling 开启定时任务
  • 通过通配符*在redis中查出每个文章id对应的vo,返回成集合
  • 将此集合中每个vo对象的值更新到对应的mysql的文章对象值中去
@Component
public class RedisDataPersistenceJob {

    @Autowired
    private IStrategyStatisVORedisService strategyStatisVORedisService;
    @Autowired
    private IStrategyService strategyService;

    @Scheduled(cron = "0/10 * * * * ?")
    public void doWork() {
        System.out.println("---------------vo对象持久化-begin----------------");
//        从redis中获取所有vo对象             keys strategy_statis_vo:*
        List<StrategyStatisVO> vos = strategyStatisVORedisService.queryVosByPattern("*");
//        遍历vo对象,将数据更新到对应攻略表中
        for (StrategyStatisVO vo : vos) {
            strategyService.updateStatisVo(vo);
        }
        System.out.println("---------------vo对象持久化-end----------------");
    }
}

此定时器使用到的方法

查出redis中每个文章对应的vo对象数据–redis操作

  • 注入private StringRedisTemplate template; 操作redis
  • 通过传过来的通配符匹配key,查询匹配到的key集合(此演示使用了*通配符,查所有)
  • 将key集合遍历,查询到每一个对应的vo对象,并存入vo集合中
  public List<StrategyStatisVO> queryVosByPattern(String pattern) {
        List<StrategyStatisVO> vos = new ArrayList<>();
// keys strategy_statis_vo:*
        Set<String> keys = template.keys(RedisKeys.STRATEGY_STATIS_VO.join(pattern));
        if (keys!=null && keys.size()>0){
            for (String key:keys){
                String voStr = template.opsForValue().get(key);
                StrategyStatisVO vo = JSON.parseObject(voStr, StrategyStatisVO.class);
                vos.add(vo);
            }
        }
        return vos;
    }

将每个vo数据更新到对应的文章数据中 --mysql操作

  • 使用的是mybatisPlus作为持久层接口
public void updateStatisVo(StrategyStatisVO vo) {
        UpdateWrapper<Strategy> wrapper = new UpdateWrapper();
        wrapper.eq("id", vo.getStrategyId())
                .set("viewnum", vo.getViewnum())
                .set("replynum", vo.getReplynum())
                .set("favornum", vo.getFavornum())
                .set("sharenum", vo.getSharenum())
                .set("thumbsupnum", vo.getThumbsupnum());
        super.update(wrapper);
    }
  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
A:使用springboot实现将redis数据同步到MySQL可以采取以下步骤: 1. 配置pom.xml依赖,引入redisMySQL驱动。 2. 编写RedisRepository类,继承RedisTemplate,并实现将Redis数据转为MySQL数据的方法。 3. 编写MySQLRepository类,使用JdbcTemplate进行MySQL数据操作。 4. 编写同步服务类,使用注解@Scheduled定时任务,从RedisRepository获取Redis数据并转成MySQL数据,再存储到MySQLRepository中。 5. 在Springboot启动类中添加@EnableScheduling注解开启定时任务。 6. 运行程序,即可实现将Redis数据同步到MySQL。 下面是示例代码: 1. pom.xml依赖配置 ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.2.2.RELEASE</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.17</version> </dependency> </dependencies> ``` 2. RedisRepository类 ```java public class RedisRepository extends RedisTemplate<String, Object> { public RedisRepository(RedisConnectionFactory redisConnectionFactory) { setConnectionFactory(redisConnectionFactory); afterPropertiesSet(); } // 将Redis数据转为MySQL数据 public List<Map<String, Object>> redisToMysqlData() { List<Map<String, Object>> dataList = new ArrayList<>(); Cursor<Map.Entry<String, Object>> cursor = this.opsForHash().scan("redis_key", ScanOptions.NONE); while (cursor.hasNext()) { Map.Entry<String, Object> entry = cursor.next(); Map<String, Object> data = new HashMap<>(); data.put("id", entry.getKey()); data.put("value", entry.getValue()); dataList.add(data); } return dataList; } } ``` 3. MySQLRepository类 ```java public class MySQLRepository{ private final JdbcTemplate jdbcTemplate; public MySQLRepository(DataSource dataSource) { jdbcTemplate = new JdbcTemplate(dataSource); } // 存储MySQL数据 public void storeMysqlData(List<Map<String, Object>> dataList) { dataList.forEach(data -> { String sql = "INSERT INTO `mysql_table` (`id`, `value`) VALUES (?, ?)"; Object[] params = new Object[]{data.get("id"), data.get("value")}; jdbcTemplate.update(sql, params); }); } } ``` 4. 同步服务类 ```java @Service public class SyncService { private final RedisRepository redisRepository; private final MySQLRepository mySQLRepository; public SyncService(RedisRepository redisRepository, MySQLRepository mySQLRepository) { this.redisRepository = redisRepository; this.mySQLRepository = mySQLRepository; } // 定时任务,每5分钟同步一次 @Scheduled(cron = "0 */5 * * * ?") public void syncRedisToMySQL() { List<Map<String, Object>> dataList = redisRepository.redisToMysqlData(); mySQLRepository.storeMysqlData(dataList); } } ``` 5. 启动类添加@EnableScheduling注解 ```java @SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 这样就完成了将Redis数据同步到MySQL的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值