redis与mysql双写一致学习

学习目标

学习并解决redis缓存与mysql数据库双写问题。


学习内容:

问题描述

由于我们的缓存的数据源来自于数据库,而数据库的数据是会发生变化的,因此,如果当数据库中数据发生变化,而缓存却没有同步,此时就会有一致性问题存在。

解决方案

在这里我所学习的是在单体系统中采用人工编码的方式来解决问题,分布式系统还需要TCC等分布式事务方案。

当我们要更新数据时,对于数据库和缓存我们应该思考先清除缓存,还是先写数据库,在这里可以显而易见的是,如果先清除缓存的话,如果在更新数据的期间有请求来访问数据,那么请求就会直击数据库,因此所得到的数据可能就是脏数据,所以在此处采用在数据库中写入数据,再去删除redis中的数据,然后在查询数据的时候更新缓存。

这里还有一个查询缓存的代码就懒得贴了。

@Override
    @Transactional //保证操作的原子性
    public Result update(Shop shop) {
        Long id=shop.getId();
        if(id==null){
            return Result.fail("id不能为空");
        }
        //更新数据库
        updateById(shop);
        //删除缓存
        stringRedisTemplate.delete(CACHE_SHOP_KEY+id);
        return Result.ok();
    }

目前只是学习了单体系统的双写,后续继续学习分布式系统的,然后加上。

此文章仅供本人学习使用,如有问题请各位指正。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值