前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Redis同步mysql实现解决方案

Redis同步mysql实现解决方案

作者头像
Diuut
发布2022-11-22 20:07:02
发布2022-11-22 20:07:02
1.6K00
代码可运行
举报
文章被收录于专栏:DiuutDiuut
运行总次数:0
代码可运行

需求 redis中数据同步到mysql中数据,如果在更新途中redis又更新了,按照Redis中最新的数据进行更新。

实现思路:存储redis数据用RedisTemplate.opsForValue进行数据存储,在数据发生改变的时候,优先向redis中更新数据,然后先一个set集合中add新的数据的key值。业务端的操作就结束了,接下来通过一个专门的定时任务服务,通过设置@Scheduled(fixedDelay = 500)设置一个任务专门从上面的存放key值的set中pop出key值,然后从redis中查询出来,再通过这个key值更新到对应的mysql数据库中,这个任务从启动就开始执行,执行结束后等待fixedDelay后设置的毫秒时间,又接着执行下一次该任务。以此往复,就会将前台发送至set中的key对应的redis数据更新至mysql中,以实现数据同步。

实现代码:
代码语言:javascript
代码运行次数:0
运行
复制
/**
     * 更新Redis中User信息
     * @param userUid 用户uid
     * @param user  User对象
     */
    public void saveUser(int userUid,User user){
        try {
            redisLockUtil.lock("userLock-uid:" + userUid);
            log.info("userLock-uid: " + userUid + "上锁");
            String userData = JSONObject.toJSONString(user);
            redisTemplate.opsForValue().set("user-uid:" + userUid, userData, 7, TimeUnit.DAYS);
            redisTemplate.opsForSet().add("redis-update-queue", "user-uid:"+userUid);
            //向更新列表set中发送需要更新的数据的key
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        } finally {
            redisLockUtil.unlock("userLock-uid:" + userUid);
            log.info("userLock-uid: " + 10135 + "解锁");
        }
    }

在定时任务中还可以采用自定义线程池的方式手动设置线程数量等参数,以达到最优的更新mysql的效率。

代码语言:javascript
代码运行次数:0
运行
复制
@EnableAsync
@Configuration
@Slf4j
public class UserDataUpdateQueue {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private UserDao userDao;

    @Async("taskExecutor")
    @Scheduled(fixedDelay = 500)
    public void getUserUpdateQueue() {
        log.info("------getUserUpdateQueue------");
        while (redisTemplate.opsForSet().size("xyddz-redis-update-queue") > 0) {
            List<Object> pop = redisTemplate.opsForSet().pop("xyddz-redis-update-queue", 10);
            for (Object userData : pop) {
                String userStr = (String) redisTemplate.opsForValue().get(userData.toString());
                if (!StringUtils.isEmpty(userStr)) {
                    User user = JSONObject.parseObject(userStr, User.class);
                    userDao.save(user);
                    log.info("更新User-Uid:" + user.getUid());
                }
            }
        }
    }
}

Post Views: 122

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年5月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现代码:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档