自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 Redis:Redisson分布式锁的锁续期原理

之前说的如果使用setnx做分布式锁的时候,会有锁续期的问题,也就是说如果锁过期时间10s,而业务处理花了30s,而redisson就可以处理恰好处理这类锁续期的问题;而这类自动续期的机制就是所谓的看门狗机制总的来说就是默认锁过期时间是30s,而自动续期机制在源码当中就是开启了定时任务,定时间隔是看门狗时间的三分之一,也就是10s,所以就是在业务没有处理完的情况下锁默认每隔10s续期到30s;下面主要看看源码当中是怎么定义的;看门狗源码分析源码:RedissonLock.classprivate

2022-03-01 22:43:55 6072

原创 分布式缓存一致性:双写模式和失效模式

1、双写模式双写模式:就是写完数据库之后再去写缓存,保持缓存一致性;脏数据问题:如上图,线程A和B都去写数据库,正常情况下应该是,A先写数据库先写缓存,B后写数据库后写缓存;但是由于卡顿等原因,导致写缓存2在最前,写缓存1在后面就出现了不一致;出现脏数据,但是这是暂时性的脏数据问题,在数据稳定,缓存过期以后,又能得到最新的正确数据;2、失效模式失效模式:简言之就是写完数据库,不用写缓存,而是删缓存,等有请求进来读数据的时候,缓存中没有,就会查数据库,然后主动放到缓存里面。也叫触发主动更新;3、

2022-02-28 23:28:38 2377 1

原创 Redis:缓存失效问题(缓存穿透、雪崩、击穿)

缓存穿透查询一个永不存在的数据指查询一个一定不存在的数据,由于缓存是不命中,将去查询数据库,但是数据库也无此记录,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义;风险:利用不存在的数据进行攻击,数据库瞬时压力增大,最终导致崩溃解决:null结果缓存,并加入短暂过期时间;布隆过滤器、mvc拦截器布隆过滤器对于有些场景,当访问一个本就不存的数据时,这时我们不需要去走redis和数据库查询,应该直接返回一个错误的提示,这样可以防止恶意访

2022-02-28 23:11:13 328

原创 认证服务:验证码防刷校验与密码加密

验证码防刷校验为了避免验证码重复发送,可以引入redis将验证码缓存起来;发送验证码,先去缓存中查,如果有,判断时间,确保60s之后才能再次发送验证码;如果没有,就可以发送;验证码的再次校验,使用redis将验证码缓存起来,并设置过期时间,如果验证码匹配成功,就立即删除缓存;key->sms:code:15825826017value->45678_当前时间(System.currentTimeMillis())设置认证服务的常量public class AuthServ

2022-02-28 23:02:51 614

原创 RabbitMQ:保证消息的可靠性(消息丢失、重复、积压、顺序)

使用RabbitMQ最终一致性方案,一定要保证可靠消息以下四种情况是消息队列在分布式情况下保证消息可靠的常见问题;消息丢失(最怕)1、消息发送出去,由于网络问题没有抵达服务器解决:(1)做好容错方法(try-catch),发送消息可能会网络失败,失败后要有重试机制,可记录到数据库,采取定期扫描重发的方式;(2)做好日志记录,每个消息状态是否都被服务器收到都应该记录;(3)做好定期重发,如果消息没有发送成功,定期去数据库扫描未完成的消息进行重发;2、消息抵达Broker,Broker要将消息写

2022-02-28 22:51:04 2846

原创 SpringBoot:自动配置原理(一文搞懂)

自动装配原理pom.xml依赖管理<!--有一个父项目,用来做依赖管理的--><parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.5</version> <relativePath/

2022-02-28 22:18:16 2658

原创 谷粒商城:订单锁库存保证事务最终一致性

RabbitMQ延时队列(实现定时任务)场景:比如未付款订单,超过一定时间后,系统自动取消订单并释放占有物品常用解决方案:spring的schedule定时任务轮询数据库缺点:消耗系统内存,增加数据库压力,存在较大的时间误差解决:RabbitMQ的消息TTL的死信Exchange结合消息的TTL就是消息的存活时间RabbitMQ可以对队列和消息分别设置TTL:推荐给队列设置过期时间对队列设置就是队列没有消费者连着的保留时间,也可以对每个单独的消息做单独的设置,超过了这个时间,我们认为这个.

2022-02-28 22:09:57 3152

原创 分布式事务:基本原理CAP&BASE

分布式事务CAP定理与BASE理论CAP定理分布式存储系统的CAP原理(分布式系统的三个指标):Consistency(强一致性):在分布式系统中的所有数据备份,在同一时刻是否同样的值。对于数据分布在不同节点上的数据来说,如果在某个节点更新了数据,那么在其他节点如果都能读取到这个最新的数据,那么就称为强一致,如果有某个节点没有读取到,那就是分布式不一致。Availability(可用性):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(要求数据需要备份)Par

2022-02-27 18:27:05 114

原创 Spring:本地事务和事务失效

事务的基本性质数据库事务的几个特性:A(原子性)C(一致性)I(隔离性)D(持久性),即ACID原则事务的隔离级别从1-4,数字越大,并发能力越低1、读未提交该隔离级别下的事务会读到其他未提交事务的数据,此现象也成为脏读;2、读已提交一个事务可以读取另一个已提交的事务,多次读会造成不一样的结果,此现象称为不可重复读问题;Oracle和SQL Server的默认隔离级别3、可重复读是MySQL默认的隔离级别,在同一个事务里,只要未结束,读到的都是一致的,就算外面把数据删了,还是一致的;但是,

2022-02-27 18:14:11 411

原创 Feign:远程和异步调用丢失头信息的问题

示例以谷粒商城订单系统远程调用购物车系统为例!!!Feign远程调用丢失header请求头的问题Feign在远程调用之前要构造请求 调用很多拦截器,订单服务的ToTrade请求带了cookie等头信息,但是要进行远程调用时,Feign创建了一个新的请求,这个新请求里面没有任何头信息,所以会丢失请求头;导致购物车服务认为这个请求没登录;解决:加上feign远程调用的请求拦截器RequestInterceptor,会首先调用请求拦截器的apply()方法,在apply()方法里面通过Reques

2022-02-27 18:02:38 1058

原创 谷粒商城:秒杀系统设计与编写

1. 秒杀系统设计秒杀(高并发)系统关注的问题1、服务单独职责+独立部署秒杀系统为单独的服务,即使自己扛不住压力挂掉,也不要影响其他服务2、秒杀链接加密防止恶意攻击,模拟秒杀请求,1000次/s的攻击;防止链接暴露,自己工作人员,提前秒杀商品;我们使用了带uuid随机码的机制;3、库存预热+快速扣减秒杀读多写少,无需每次实时校验库存,我们库存预热,放到redis中,信号量控制进来秒杀的请求;为了保证redis可以保证千万并发,可以给redis做集群,做成分片高可用;我们是用定时任务提取三天

2022-02-27 17:01:59 1095

原创 谷粒商城:秒杀商品定时上架

1.定时任务1、spring中6位组成,不允许第七位的年,即秒、分、时、日、月、周2、在周几的位置,1-7代表周一到周日,MON-SUN3、定时任务不应该是阻塞的,默认是阻塞的。(1)可以让业务以异步的方式运行,自己提交给线程池(2)支持定时任务线程池,设置TaskShedulingProperties​ spring.task.scheduling.pool.size=5 #默认size是1,也就是阻塞(3)让定时任务异步执行,自动配置类 TaskExecutionAutoConfigu

2022-02-27 16:56:26 1133

原创 JUC并发:CompletableFuture异步编排

1. 线程回顾初始化线程的4种方式:继承Thread实现Runnable接口实现Callable接口 + FutureTask (可以拿到返回结果,可以处理异常)线程池具体线程池的详细内容,可以去看我线程池的文章2. CompletableFuture介绍Future是Java 5添加的类,用来描述一个异步计算的结果。你可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel方法停止任务的执行。虽然Future以及相关使用方

2022-02-27 14:18:25 332

原创 JUC并发:单例模式,双重检测锁,枚举

饿汉式单例一开始加载全部内存资源,如果一些数据没有被使用,就会造成浪费空间package com.zgq.single;//饿汉式==>构造器私有;一开始加载全部内存资源public class Hungry { // 一开始加载全部内存资源,可能会浪费空间 private byte[] data1 = new byte[1024*1024]; private byte[] data2 = new byte[1024*1024]; private byte[]

2022-02-27 14:04:45 125

原创 JVM:GC垃圾收集算法详解(一文搞懂)

文章内容主要是自己学习过程中整理的笔记内容,有些地方可能还不太完善预备知识1、JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots?什么是垃圾:简单说就是内存中已经不再被使用到的空间就是垃圾;要进行垃圾回收,如何判断一个对象是否可以被回收?(1)引用计数法:(2)GC Roots(枚举根节点做可达性分析,即根搜索路径算法)从GC Roots的对象开始自顶向下进行链路的扫描和访问,如果引用可达,说明对象是活跃的,可存活;否则链路覆盖不到就是引用不可达,被判定为死亡;所以必须从GC

2022-02-27 11:16:13 654

原创 JVM:JVM常见参数配置

JVM常见参数配置JVM的参数类型:1、标配参数:-version,-help,-showversion2、x参数(了解):-Xint:解释执行;-Xcomp:第一次使用就编译成本地代码;-Xmixed:混合模式;3、xx参数:(1)Boolean类型:公式:-XX:+或-某个属性值,+表示开启,-表示关闭;例子:-XX:+PrintGCDetails:打印GC收集信息;-XX:+UseSerialGC:使用串行垃圾收集器;(2)K-V设值类型:公式:-XX:属性key=属性值valu

2022-02-27 10:56:26 1183

原创 JUC并发:ThreadLocal原理与源码解析

ThreadLocal原理ThreadLocal给我们的独立线程提供存放局部变量缓存。避免线程安全问题1、多线程情况下2、每个线程之间相互隔离3、传递参数应用场景:Seata解决分布式事务问题创建一个全局的事务Id缓存到ThreadLocal中;执行我们的目标方法从ThreadLocal去除全局的事务Id传递给接口TreadLocal核心API1、Get获取当前线程缓存的局部变量2、Set根据当前线程做缓存局部变量3、Remove从当前线程移除缓存通过Threa

2022-02-25 12:41:26 266

原创 JUC并发:AQS源码详细解析

LockSupport原理是什么:线程等待唤醒机制(wait/notify)的升级加强版;LockSupport当中的park()和unpark()的作用分别是阻塞线程和解除阻塞线程;Synchronized,Lock和LockSupport对比SynchronizedLock的ConditionLockSupport等待wait()await()park()唤醒notify()signal()unpark(Thread thread)wait,not

2022-02-25 12:34:09 252

原创 JUC并发:线程池详解,从原理到实际使用

线程池池化技术:事先准备好一些资源,有人要用,就来我这里拿,用完之后还给我线程池的好处:线程复用,可以控制最大并发数,管理线程1、降低资源的消耗;2、提高响应速度;3、方便管理;三大方法、七大参数、四种拒绝策略三大方法:1、ExecutorService threadPool = Executors.newSingleThreadExecutor();// 创建单个线程2、ExecutorService threadPool = Executors.newFixedThreadPool

2022-02-25 11:48:36 154

原创 JUC并发:8锁现象,判断锁的是谁

8锁现象如何判断锁的是谁!永远的知道什么是锁,锁到底锁的是谁?????深刻理解我们的锁1、synchronized 锁的对象是方法的调用者!多个方法用的是同一个锁,谁先拿到谁执行!2、增加了一个普通方法后!普通方法不受锁的影响,所以会先走普通方法!3、两个对象,两个同步方法,则有两个方法的调用者,所以是有两把锁!4、增加两个静态的同步方法,只有一个对象。static 静态方法 ,类一加载就有了!锁的是Class,全局唯一;5、两个对象!增加两个静态的同步方法,锁的是Class,全局唯一,还

2022-02-25 10:58:29 235

原创 JUC并发:集合类线程不安全

集合类线程不安全时都会发生java.util.ConcurrentModificationException 并发修改异常!是集合类在并发下都会遇到的异常1. List不安全解决方案:1、List list = new Vector<>();2、工具类:List list = Collections.synchronizedList(new ArrayList<>());3、JUC版: List list = new CopyOnWriteArrayList<>

2022-02-25 10:32:32 161

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除