解决方案

在高并发场景下,数据库和缓存双写不一致情况,我们可以当写入数据库后删除缓存,当查的时候先查缓存,如果缓存为空再查数据库,最后写入缓存,但是这样还是存在一个问题。

如图所示,当出现这种情况时该方案就会出现问题,线程2阻塞一段时间后,又把stock=9有更新到缓存中,而数据库中的stock=10,下一次查时,会查到缓存中的stock=9

方案优化

对于这种问题,如果业务场景对数据一致性没有那么高,我们可以在更新缓存时设置一个过期时间,过期之后缓存也就不存在了,还有一种我们可以使用延迟双删方案。

间隔的n秒没有统一的标准,完全看个人的经验,所以这种方案还是存在问题。最佳解决方案时使用分布式锁。

我们可以使用redis读锁和写锁。我们使用redisson实现分布式锁。

Redisson

注入RedissonClient对象@Bean

public RedissonClient redissonClient(){

Config config = new Config();

config.useSingleServer().setAddress("redis://127.0.0.1:6379");

return Redisson.create(config);

}

读锁请求@GetMapping("read")

public String read(){

RReadWriteLock readWriteLock = redissonClient.getReadWriteLock(RedisConstant.READ_WRITE_LOCK);

//读之前加读锁,读锁的作用就是等待该lockkey释放写锁以后再读

RLock rLock = readWriteLock.readLock();

try {

rLock.lock();

String uuid = redisTemplate.opsForValue().get("uuid");

return uuid;

}finally {

rLock.unlock();

}

}

写锁请求@GetMapping("write")

public String write() throws InterruptedException {

RReadWriteLock readWriteLock = redissonClient.getReadWriteLock(RedisConstant.READ_WRITE_LOCK);

//写之前加写锁,写锁加锁成功,读锁只能等待

RLock rLock = readWriteLock.writeLock();

String s = "";

try {

rLock.lock();

s = UUID.randomUUID().toString();

Thread.sleep(10000);

redisTemplate.opsForValue().set("uuid",s);

}finally {

rLock.unlock();

}

return s;

}

php双写绕过,高并发下缓存与数据库双写不一致解决方案相关推荐

  1. 高并发下缓存与数据库双写不一致解决方案

    高并发下缓存与数据库双写不一致解决方案 参考文章: (1)高并发下缓存与数据库双写不一致解决方案 (2)https://www.cnblogs.com/wlwl/p/11601632.html (3) ...

  2. session.merge 缓存不更新_如何保证缓存与数据库双写时的数据一致性?

    在做系统优化时,想到了将数据进行分级存储的思路.因为在系统中会存在一些数据,有些数据的实时性要求不高,比如一些配置信息.基本上配置了很久才会变一次.而有一些数据实时性要求非常高,比如订单和流水的数据. ...

  3. Redis缓存穿透-热点缓存并发重建-缓存与数据库双写不一致-缓存雪崩

    解决缓存问题 1.解决Redis把内存爆满的三种方法 1.1 定期删除 1.2 惰性删除 1.3 内存淘汰策略 2. 缓存穿透--缓存击穿--缓存雪崩 3. 如何解决线上缓存穿透问题 3.1 缓存击穿 ...

  4. 教你从0到1搭建秒杀系统-缓存与数据库双写一致

    本文是秒杀系统的第四篇,我们来讨论秒杀系统中缓存热点数据的问题,进一步延伸到数据库和缓存的双写一致性问题. 在秒杀实际的业务中,一定有很多需要做缓存的场景,比如售卖的商品,包括名称,详情等.访问量很大 ...

  5. 掌握分布式环境缓存更新策略,提高缓存与数据库双写一致性!

    概述 随着时代的发展,服务系统架构也已经由最初的单体架构转变为分布式.微服务架构模式. 从数据体量上来看,各系统存储的数据量越来越大,数据的查询性能越来越低. 此时,就需要我们不断的进行优化,最常用的 ...

  6. 09丨缓存异常:如何解决缓存和数据库的数据不一致问题

    1.缓存和数据库的数据不一致是如何发生的?   首先,我们得清楚"数据的一致性"具体是啥意思.其实,这里的"一致性"包含了两种情况: 缓存中有数据,那么,缓存的 ...

  7. 高并发高可用复杂系统中的缓存架构(十六) 实现缓存与数据库双写一致性保障方案

    再来回顾下之前的思路: 数据更新:根据唯一标识路由到一个队里中,「删除缓存 + 更新数据」 数据读取:如果不在缓存中,根据唯一标识路由到一个队里中,「读取数据 + 写入缓存」 投入队里之后,就等待结果 ...

  8. Redis缓存与数据库双写一致性

    前言: 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用.在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作.         但是在更新缓存方面,对于更新完数据库,是更新缓存 ...

  9. java的for循环取出数据只是拿到最后一个_如何保证缓存与数据库双写的一致性...

    Cache Aside Pattern ​ 最经典的缓存+ 数据库读写的模式,就是这个Cache Aside Pattern 读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时 ...

最新文章

  1. 打破国外垄断,我国拿下一项“制芯”关键技术
  2. 如何帮助企业优化商业模式?看精益数据分析的“欺”与“破”
  3. 浏览器获取文件MD5值
  4. mysql 5.7 初始化数据库_MySQL 5.7 新特性之初始化
  5. (转)Spring Boot通过ImportBeanDefinitionRegistrar动态注入Bean
  6. 中国工程院出台“八不准” 为院士增选“划红线”
  7. 3d激光雷达开发(生成RangeImage)
  8. 造兵三国的服务器要维护多久,FAQ_造兵三国_九游手机游戏
  9. javascript中object的运算符操作使用
  10. .p7b证书转成iis使用的.pfx证书
  11. 数字图像处理入门(冈萨雷斯第三版)
  12. 共享打印机无法连接的解决办法
  13. HTML5响应式手机模板:【超炫购物模板】——仿拍鞋网商城手机网站模板( HTML+CSS+JavaScript) 企业手机网站模板...
  14. 浏览器无法加载本地文件
  15. prometheus中step或resolution的含义
  16. 云南大学软件测试,云南大学《软件测试》功能测试
  17. could not initialize proxy - the owning Session was closed解决
  18. 万分之二用百分之怎么表示_万分之三怎么写?
  19. OGC服务标准(地图资料篇.3)
  20. Spring-02 IOC与DI

热门文章

  1. selenium2与python自动化5-iframe和163邮箱登录
  2. java网络编程(三)
  3. 无序和有序列表的list-style-type 属性值
  4. 03--MySQL自学教程:MySQL安装后的目录结构介绍和简单语法指令
  5. java商城管理系统ssm_基于SSM+MYSQL的一个小型商城网站后台管理系统
  6. ubuntu mysql 多端口_ubuntu 16.04下mysql5.7.17开放远程3306端口
  7. linux系统日志_第十二章:走进Linux世界——系统日志管理,日志轮转。
  8. L2-003 月饼-团体程序设计天梯赛GPLT
  9. ccf-csp #201812-2 小明放学 (100分 附解析)
  10. python自带编译器闪退_python自带编译器在写入文件时闪退,或者一步步执行到写入时提示8170。解决办法:...