如何保证缓存与数据库的双写一致性(4)
导读:如何保证缓存与数据库的双写一致性,2.1. 分布式锁优化 思考:一般什么情况下数据才会进行缓存? 答案:读多写少数据才会进行缓存 所以我们可以使用读写锁进行优化分布式锁: 共享锁 :读锁
如何保证缓存与数据库的双写一致性

2.1. 分布式锁优化
思考:一般什么情况下数据才会进行缓存?
答案:读多写少数据才会进行缓存
所以我们可以使用读写锁进行优化分布式锁:
- 共享锁:读锁readLock,加锁之后,其他线程可以共享读操作
- 排他锁:独占锁writeLock也叫,加锁之后,阻塞其他线程读写操作
在读数据的时候我们可以使用共享锁,保证所有线程可以读,但是不可以写。

在写数据的时候我们可以使用排他锁,保证所有线程可以读,但是不可以写

redisson代码实现
- 读操作
public Item getById(Integer id){
RReadWriteLock readWriteLock =redissonClient.getReadWriteLock(s:"ITEM_READ_WRITE_LOCK");
//读之前加读锁,读锁的作用就是等待该Lockkey释放写锁以后再读
RLock readLock =readWriteLock.readLock();
try {
//开锁
readLock.lock();
System.out.println("readLock...");
Item item =(Item)redisTemplate.opsForValue().get("item:"+id);
if(item !=null){
return item;|
}
//查询业务数据
item =new Item(id,name:"华为手机",desc:"华为手机",price:5999.00);
//写入缓存
redisTemplate.opsForValue().set("item:"+id,item);
//返回数据
return item;
}finally {
readLock.unlock();
}
}
- 写操作
public void updateById(Integer id){
RReadWriteLock readWriteLock =redissonClient.getReadWriteLock(s:"ITEM_READ_WRITE_LOCK");
//写之前加写锁,写锁加锁成功,读锁只能等待
RLock writeLock =readWriteLock.writeLock();
try {
//开锁
writeLock.lock();
System.out.println("writeLock...");
//更新业务数据
Item item =new Item(id,name:"华为手机",desc:"华为手机",price:5299.00);
try {
Thread.sleep(millis:10000);
}catch(InterruptedException e){
e.printStackTrace();
}
//删除缓存
redisTemplate.delete(key:"item:"+id);
}finally {
writeLock.unlock();
}
}
2.双写一致,最终一致性解决方案
public Item getById(Integer id){
RReadWriteLock readWriteLock =redissonClient.getReadWriteLock(s:"ITEM_READ_WRITE_LOCK");
//读之前加读锁,读锁的作用就是等待该Lockkey释放写锁以后再读
RLock readLock =readWriteLock.readLock();
try {
//开锁
readLock.lock();
System.out.println("readLock...");
Item item =(Item)redisTemplate.opsForValue().get("item:"+id);
if(item !=null){
return item;|
}
//查询业务数据
item =new Item(id,name:"华为手机",desc:"华为手机",price:5999.00);
//写入缓存
redisTemplate.opsForValue().set("item:"+id,item);
//返回数据
return item;
}finally {
readLock.unlock();
}
}public void updateById(Integer id){
RReadWriteLock readWriteLock =redissonClient.getReadWriteLock(s:"ITEM_READ_WRITE_LOCK");
//写之前加写锁,写锁加锁成功,读锁只能等待
RLock writeLock =readWriteLock.writeLock();
try {
//开锁
writeLock.lock();
System.out.println("writeLock...");
//更新业务数据
Item item =new Item(id,name:"华为手机",desc:"华为手机",price:5299.00);
try {
Thread.sleep(millis:10000);
}catch(InterruptedException e){
e.printStackTrace();
}
//删除缓存
redisTemplate.delete(key:"item:"+id);
}finally {
writeLock.unlock();
}
}双写一致,最终一致性可能在我们实际使用中用到的最多,解决方案也比较多
异步通知保证数据的最终一致性
异步通知保证数据的最终一致性
相关阅读
-
Ceph分布式存储集群部署详细步骤教程
为大家介绍Ceph分布式存储集群部署详细步骤教程的方法内容,相关内容具体如下: Ceph的部署工具: ceph-deploy:官方的部署工具,不再积极维护ceph-deploy。它不支持RHEL8,CentOS 8或更新的操作系
-
前端模板网站有哪些 关于web制作网站的模板
全面为您解析前端模板网站有哪些和关于web制作网站的模板的内容,接下来分享详细内容。 1.GitHub Desktop 对于新手来说,要记住那么多git命令可能有点困难,建议新手用git可视化工具,会方便
-
什么是802.11ac WIFI5? 802.11ac最大传输速率
今天为大家介绍什么是802.11acIT技巧方面的经验,下面小编为您详细解答 802.11ac,也被称为WiFi 5,是无线局域网(WLAN)的一种标准,旨在提供更快的数据传输速度和更好的性能。该标准于2013年
-
中间件解析:概念、类型与实际应用全面探讨
为网友们详解中间件解析的教程内容,一起来看看吧! 一、什么是中间件 在软件开发领域,中间件(Middleware)是一种位于操作系统和应用程序之间的软件,它为应用程序提供了一种统一的、


