自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 浅谈mysql的mvcc机制

这里写目录标题前言mvccreadviewRead Committed隔离级别定义RR定义前言mvccMVCC(Mutil-Version Concurrency Control),就是多版本并发控制。简单来说,每条数据其实都有两个隐藏字段,一个是trx_id,一个是roll_pointer,trx_id就是最近一次更新这条数据的事务id,roll_pointer就是指向更新这个事务之前生成的undo log(这里不展开叙述)下面举个栗子:事务A在之前插入了一行数据,值是A,事务已提交。会出现

2021-10-06 23:04:04 131

原创 浅谈threadlocal

文章目录简单介绍应用场景工作原理内存泄漏是怎么回事key要设计为弱引用如何解决hash冲突简单介绍ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题应用场景Spring采用Threadlocal的方式,来保证单个线程中的数据库操作使用的是同一个数据库连接,同时,采用这种方式可以使业务层使用事务时不需要感知并管理connec

2021-09-16 12:07:22 167

原创 浅谈mysql的执行计划是何方神圣

前言平时我们优化sql,通过explain,分析得到的执行计划研究透彻,知道每个执行计划在底层是如何执行的,那么再进行相关的调优就轻而易举了。所谓的执行计划,落实到底层,无非就是先访问哪个表,用哪个索引还是全表扫描,拿到数据之后如何去聚簇索引回表,是否要基于临时磁盘文件做分组聚合或者排等序等等基本介绍接下来我们分析一下执行计划里包含的各个字段都是什么意思字段名意义id每个select都会对应一个id,一个复杂的sql里有多个select,那么有可能出现多条执行计划sele

2021-07-11 00:25:43 131

原创 浅谈mysql的成本及如何选择执行计划

这里写目录标题前言什么是‘成本’怎么计算全表扫描索引查询总结前言在实际使用过程中,或许会遇到一个问题,在执行单表查询或者多表关联查询,似乎有多重执行计划可以选择,使用索引A?还是索引B?还是都不用,直接上全表扫描?到底使用哪种方式,今天我们就来探讨一下什么是‘成本’跑一个SQL语句,一般成本是两块从磁盘读数据到内存就是IO成本,而且MySQL里都是一页一页读的,读一页的成本的约定为1.0对数据进行运算,验证是否符合条件,耗费CPU资源的,属于CPU成本,一般约定读取和检测一条数据是否符合条件的

2021-07-03 12:22:43 233

原创 浅谈如何设计索引

这里写目录标题前言如何设计索引设计原则保证sql中尽量多的字段能用上索引尽量使用那些基数比较大的字段使用前缀索引索引字段不使用函数主键使用自增的前言我们在设计索引时,通常应该考虑哪些因素,给哪些字段建立索引,如何建立索引,建立好索引后应该如何使用才是最合适的,下面篇幅会简单介绍下我的经验(文字比较多哈,但也会穿插一些栗子哦)如何设计索引在开发角度来说,接到一个需求,针对业务需求建立好一张表的结构之后,就知道这个表有哪些字段,每个字段是什么类型的,会包含哪些数据。我们要考虑第一点,就是未来我们对表进行

2021-06-19 23:47:20 624

原创 浅谈Redis原理

浅谈Redis原理前言性能为什么单线程模型也能效率这么高工作原理文件事件处理器(file event handler)线程模型I/O模型阻塞I/O非阻塞I/OIO 多路复用selectpollepoll前言众所周知,redis是单线程,性能极高,处理速度极快。单机的redis已经可以扛起上万的QPS,集群模式下,可以支撑十万级别的读写并发。为什么redis性能这么快,下面我们一起来探究一下性能为什么单线程模型也能效率这么高纯内存操作核心是基于非阻塞的IO多路复用机制单线程避免了多线程的频繁上

2021-05-16 18:27:14 106

原创 java web应用优雅停机

背景:系统发版时,当前正在运行的请求会中断,导致部分请求没有完成。为确保应用在停机时不影响调用方,首先需要告诉路由机构不再发新请求到即将停机的节点,同时要确保已接收的请求能被成功处理如何支持实现优雅停机分三个阶段完成,1、流量下线,停止新流量的进入(web,rpc,mq,job)2、等待一段时间,确保当前JVM内的流量处理完成3、停机,关闭JVM,优雅关闭容器(Spring)java微服务体系下,服务器在接受到停止信号(如kill -15 $pid),先会注销在注册中心的注册信息,关闭请求接受

2020-12-25 14:22:04 414

原创 基于shardingsphere分库分表

文章目录前言一、分库分表1、what2、why3、带来的问题二、组件对比1、shardingsphere2、mycat三、核心概念1、SQL逻辑表真实表数据节点绑定表广播表2、分片分片键分片算法标准分片算法复合分片算法Hint分片算法分片策略标准分片策略复合分片策略Hint分片策略不分片策略四、实践方案总结前言一、分库分表1、what从字面上理解,把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上2、why(1)mysql单机存储上限。(mysql表中的数据都

2020-12-17 10:59:05 399

原创 分布式事务对比及方案

前言分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。背景由于业务上的实时性,需及时反馈事件的成功与否,基于mq的最终一致性方案已不符合现状。如:下单场景客户下单时,需要扣减库存,使用优惠券、扣减积分,最后生成订单,..

2020-11-30 19:29:23 255

原创 apollo配置及使用

Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。阿波罗配置说明:1、创建项目2、添加namespace(可自建或关联已有的公共namespace)3、出现下面界面时说明创建成功springboot项目配置说明(本人目前使

2020-11-24 17:02:42 2544

原创 基于guava的ratelimiter限流设计

限流1.流行的两种下流方式常见的限流算法有:计数器、令牌桶、漏桶1.1 计数器算法采用计数器实现限流有点简单粗暴,一般我们会限制一秒钟的能够通过的请求数,比如限流qps为100,算法的实现思路就是从第一个请求进来开始计时,在接下去的1s内,每来一个请求,就把计数加1,如果累加的数字达到了100,那么后续的请求就会被全部拒绝。等到1s结束后,把计数恢复成0,重新开始计数。具体的实现可以是这样的:对于每次服务调用,可以通过 AtomicLong#incrementAndGet()方法来给计数器..

2020-11-16 15:40:47 118

原创 定时任务实现自动补偿队列踩坑实录

踩坑背景:目前的架构是mq消费失败会丢进补偿队列,补偿队列没有消费者,采用定时任务轮询去取补偿队列中的消息,while循环会一直取补偿队列中的消息,除非补偿队列为空时,才会终止循环。如下图所示线上故障状况:大量锁等待,锁超时,连接mq超时分析代码后发现,那…如果补偿队列有源源不断的大批量消息,那么会存在三个问题。1、while循环一直不结束。2、若消费补偿队列时失败,则会存放在errorList,若有大批量的消息失败,会导致有这个list会无限增大,最严重时甚至OOM3、确认时采取了一次.

2020-11-09 21:38:45 1353

原创 关于熔断降级的理解

前言熔断不是为了保护下游系统,熔断也不是为了保护核心流程永远可用,熔断是为了让“A–>B”快速返回,从而避免 ”慢接口消耗过多的php fpm进程或tomcat http线程导致其他接口得不到执行的机会“,最终避免系统雪崩不存在“无法熔断”的接口,熔断的前期就是B已经挂了,”不存在能不能作熔断“的问题。A–>B是网络调用,A的代码一定会处理TimeoutException。所以,至少可以使用“TimeoutException的返回值 来当做 熔断期间的返回值“正文1:..

2020-11-01 02:07:22 578

原创 java多线程分段捞取数据

背景从一个数据量约十多亿的表中,捞出符合时间范围内所需的数据解决方案在Java8中,CompletableFuture提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合 CompletableFuture 的方法。它可能代表一个明确完成的Future,也有可能代表一个完成阶段( CompletionStage ),它支持在计算完成以后触发一些函数或执行某些动作。它实现了Future和Com..

2020-10-25 13:42:23 928

原创 Spring @Value注入属性获取不到值

@Value注入失败第一步检测语法是否正确@Value("${test}")private String test;2.第二步检测配置文件中是否有进行配置test=test3.第三步检测是否增加了@Component注解在spring中,使用了spring的注解,那么就需要使用spring来进行管理对象,而不能自己进行new,否则就会导致失败。4.第四步检测代码中的书写方...

2019-08-29 15:55:09 3502 1

空空如也

空空如也

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

TA关注的人

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