学习目标
学习并解决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();
}
目前只是学习了单体系统的双写,后续继续学习分布式系统的,然后加上。
此文章仅供本人学习使用,如有问题请各位指正。