分布式锁2-缓存一次性解决
分布式锁Redisson笔记: 分布式锁Redisson
缓存特点:保证缓存数据的最终一致性,不能保证缓存数据的及时、强一致性
1 优化获取分类的数据
1)代码
public Map<String, List<Category2Vo>> getCatalogJsonFromDbWithRedissonLock() {
//1.锁的名字,锁的粒度越细,越细越快
//锁的粒度,具体缓存的是某个数据。11号商品(product-11-lock),product-lock
RLock lock = redisson.getLock("catalogJson-lock");
lock.lock();//加锁
System.out.println("获取分布式锁成功。。。");
Map<String, List<Category2Vo>> dataFromDb=null;
try {
dataFromDb = getDataFromDb();//获得数据库数据
}finally {
lock.unlock();//释放锁
}
return dataFromDb;
}
a.怎么保持数据库数据与redis数据一致?
数据一致性
1)双写模式
原理:修改数据库,还要查询数据库数据,同步到redis缓存,太麻烦
缺点: 数据不一致(但是,可以保证缓存数据的 最终一致性)
解决方案: 配合 加读写锁
2)失效模式
原理:修改数据库数据、删除redis缓存数据。等待下次查询,主动更新redis缓
存数据
缺点: 数据不一致(但是,可以保证缓存数据的 最终一致性)
解决方案: 配合 加读写锁
3).双写模式、失效模式 都会数据不一致,怎么办?
解决方案: 配合 加读写锁
2 redis缓存 总结
1).数据一致性 要求高的,去数据库查(缓存+过期时间)
2).数据一致性 要求不高的,就要缓存。怕有脏数据,加上读写锁
3)cannal进行数据库与缓存 数据同步
4) 适用于读多写少的情况
3.Cannal
1).介绍
2).使用场景
a. canal原理–同步缓存数据
当数据数据发生变化,会把数据存到canal(canal好像数据库副本),再把缓存的数据更新
b. canal原理–推荐系统
如京东等,根据用户的购物车、浏览信息、爱好等,通过canal分析计算 形成新的表,进行对商品的显示。