自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 缓存与数据库一致性问题

概览缓存是一个有着更快的查询速度的存储技术,这里的更快是指比起从初始的数据源查询(比如数据库,以下都称作数据库)而言。我们经常会把频繁请求的或是耗时计算的数据缓存起来,在程序收到请求这些数据的时候可以直接从缓存中查询数据返回给客户端来提高系统的吞吐量,现在我们来看看有哪些缓存模式可以考虑。Cache Aside读取数据:先查询缓存,缓存存在,直接返回,缓存不存在,读取数据库,写入缓存。Read/write Throghwrite back使用场景,数据一致性不强的场景异步是更新缓存,使用m

2021-04-24 19:47:57 241

转载 MVCC的实现原理

MVCCMVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。mvcc - @百度百科

2021-04-19 21:34:35 422

原创 MySQL索引底层:B+树详解

前言当我们发现SQL执行很慢的时候,自然而然想到的就是加索引。对于范围查询,索引的底层结构就是B+树。今天我们一起来学习一下B+树哈~树简介、树种类B-树、B+树简介B+树插入B+树查找B+树删除B+树经典面试题树的简介树跟数组,链表,堆栈一样,它由有限个节点组成,组成具有层次关系的集合,一颗普通的树如下:树的种类按照有序性,可以分为有序树和无序树无序树:树中任意节点的子结点之间没有顺序关系有序树:树中任意节点的子结点之间有顺序关系按照节点包含子树个数,可以分为B树和

2021-04-19 21:32:53 1055

原创 【基本功】不可不说的Java“锁”事

推介文章:https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651749434&idx=3&sn=5ffa63ad47fe166f2f1a9f604ed10091&chksm=bd12a5778a652c61509d9e718ab086ff27ad8768586ea9b38c3dcf9e017a8e49bcae3df9bcc8&scene=38#wechat_redirect

2021-02-28 11:51:25 258 2

原创 ThredLocal

ThredLocal概述ThreadLocal是一个线程变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,例如A线程和B线程都想使用一个变量,此时就存在强资源的问题,而这个变量他可以有多份,此时就可以用ThreadLocal作为变量的管理者 ,不存在多线程隐患. 同时他隐式的可以作为一个线程内部的传递信息的一个工具 .​ ThreadLocal从另一个角度来解决线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据

2021-01-24 14:01:53 393

转载 redis的开发规范---BigKey

有句话说的很对,坚持一件事情很难,放弃一件事情很简单,这几个月一直在刷题,总结了很多面试题,csdn好几个月没写,csdn还是要坚持写。最近有个白名单的需求,把白名单放入redis的key中,这个是放商户id,商户有一万多个,可以算上bigkey了。阿里云Redis开发规范【强制】:拒绝bigkey(防止网卡流量、慢查询)string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。反例:一个包含200万个元素的list。非字符串的bigkey,不要使用del

2021-01-11 18:45:23 625

原创 dubbo的线程池

之前线上代码Xstream代码的GC问题,导致dubbo服务访问的时候,出现线程不足,无法处理业务线程。因为出现了这个问题,我就看了看dubbo线程池。1.介绍当我们在使用dubbo的时候,是可以通过调整线程池来达到调优的效果,我们可以在dubbo:protocol 标签中使用用threadpool属性选择自己想要使用的线程池,通过threads属性配置服务线程数,queues属性配置使用的队列。例如: <dubbo:protocol name="dubbo" threadpool="fix

2021-01-11 18:43:12 1496

原创 dubbo启停原理解析以及服务暴露

1、dubbo的工作原理初始化过程细节:第一步,就是将服务装载到容器中,然后准备注册服务。和Spring中启动过程类似,Spring启动时,将bean装载进容器中的时候,首先要解析bean。所以dubbo也是先读配置文件解析服务。解析服务:1)、基于dubbo.jar内的META-INF/spring.handlers配置,spring在遇到dubbo名称空间时,会回调DubboNamespaceHandler类。2)、所有的dubbo标签都统一用DubboBeanDefinitionParser进行

2020-06-15 10:05:13 396

转载 dubbo的spi原理

1.简介SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过 SPI 机制加载所有的组件。不过,Dubbo 并未使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好的满足需求。在 Dub

2020-06-15 10:04:47 456

原创 java面试题总结

整理一下java各个方面的面试题,方便阅读学习;spring方面spring的生命周期

2020-06-08 20:38:17 158

转载 RocketMq的消息消费-延时消息消费(三)

33333333

2020-06-06 11:48:40 3532

原创 ThreadPoolExecutor线程池任务执行失败的时候会怎样??

任务执行失败时的处理逻辑

2020-05-30 16:07:26 1407

转载 Spring中的循环依赖解决详解

前言说起Spring中循环依赖的解决办法,相信很多园友们都或多或少的知道一些,但当真的要详细说明的时候,可能又没法一下将它讲清楚。本文就试着尽自己所能,对此做出一个较详细的解读。另,需注意一点,下文中会出现类的实例化跟类的初始化两个短语,为怕园友迷惑,事先声明一下,本文的实例化是指刚执行完构造器将一个对象new出来,但还未填充属性值的状态,而初始化是指完成了属性的依赖注入。一、先说说Spring解决的循环依赖是什么Java中的循环依赖分两种,一种是构造器的循环依赖,另一种是属性的循环依赖。构造器的循

2020-05-28 10:41:35 159

原创 RocketMq消息消费-消息队列分布(二)

PullMessageService在启动时没有由于Linked pullRequestQueue中PullRequest对象,故PullMessageService线程将阻塞。问题一:PullRequest对象什么时候加入pullRequestQueue中??问题二:集群内多个消费者是如何负载主题下多个消息队列,并且新的消费者加入时,消息队列如何重新分布??...

2020-05-18 17:06:17 1160

原创 RocketMQ消息消费-消息拉取(一)

RocketMq消费方式mq的消费代码位置:由代码截图可以看出消费者消费有两种消费,一种是推,一种是拉。1)Push方式:由消息中间件(MQ消息服务器代理)主动地将消息推送给消费者;采用Push方式,可以尽可能实时地将消息发送给消费者进行消费。但是,在消费者的处理消息的能力较弱的时候(比如,消费者端的业务系统处理一条消息的流程比较复杂,其中的调用链路比较多导致消费时间比较久。概括起来地说就是“慢消费问题”),而MQ不断地向消费者Push消息,消费者端的缓冲区可能会溢出,导致异常;(2)Pull方

2020-05-18 10:52:15 5540 1

转载 记一次故障引发的线程池使用的思考(转)

一、悬案某日某晚 8 时许,一阵急促的报警电话响彻技术团队的工位,小虎同学,小峰同学纷纷打开监控平台一探究竟。分销员系统某核心应用,接口响应全部超时,dubbo 线程池被全部占满,并堆积了大量待处理任务,整个应用无法响应任何外部请求,处于“夯死”的状态。正当小虎小峰两位同学焦急的以各种姿势查看应用的各项指标时,5分钟过去了,应用居然自己自动恢复了。看似虚惊一场,但果真如此吗?二、勘查线索...

2020-04-18 17:16:01 908 2

转载 Spring IOC原理源码解析(@Autowired原理详解 :标识属性与方法)

源码推荐看这篇博客的时候打开Spring源码,一边看源码,一边看博客上代码的关键处的注释,这样能更好的理解Spring IOC的流程及内部实现和使用方法。如果你对IOC的原理有些了解,则这些注释能帮你更深入的理解其实现方式。Spring容器在每个Bean实例化之后,调用AutowiredAnnotationBeanPostProcessor的postProcessMergedBeanDefini...

2020-02-21 15:59:46 464

原创 ScheduledThreadPoolExecutor遇到的坑

线上表象:在项目中,有这样一个需求,将内存事件队列的事件定时上传到阿里云事件监控,使用ScheduledThreadPoolExecutor定时去拉取内存队列事件调用阿里云接口处理。// 初始化本地任务内存事件队列LinkedBlockingQueue<EventEntry> eventQueue = new LinkedBlockingQueue<>(10000);...

2020-02-21 08:39:37 7903 1

原创 面试官问你MyBatis SQL是如何执行的?

MyBatis 整体架构MyBatis 最上面是接口层,接口层就是开发人员在 Mapper 或者是 Dao 接口中的接口定义,是查询、新增、更新还是删除操作;中间层是数据处理层,主要是配置 Mapper -> XML 层级之间的参数映射,SQL 解析,SQL 执行,结果映射的过程。上述两种流程都由基础支持层来提供功能支撑,基础支持层包括连接管理,事务管理,配置加载,缓存处理等。接口层...

2020-02-16 11:05:49 769

转载 Mybatis 中使用的 9 种设计模式

1、Builder模式2、工厂模式3、单例模式4、代理模式5、组合模式6、模板方法模式7、适配器模式8、装饰者模式9、迭代器模式虽然我们都知道有23个设计模式,但是大多停留在概念层面,真实开发中很少遇到Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式。Mybatis至少遇到了以下的设计模式的使用:1、Builder模式,...

2020-01-12 17:34:28 170

原创 浅析Mybatis的Executor原理

当我们读取完配置文件,将我们的Mybatis配置成我们想要的要的样子之后,我们就要使用他对数据库进行一系列操作(增删改查)。而SqlSession这个看似无所不能的操作达人,其实是找了代练的。SqlSession将一切数据库具体操作委托给背后的Executor。Executor 类结构图我们先认识一下最大的大佬Executor; int update(MappedStatement ms...

2020-01-11 12:14:17 413

原创 ES索引写入性能优化

最近一直想总结一篇es的优化文章,看了几篇博客,总结一下,方便以后遇上es线上优化问题有参考之处:1、用bulk批量写入es批量写入时,应该使用es的bulk写入,bulk写入还是应该考虑es的node数,shard分片数。业务中尽量将写入es的数据聚合起来分批写入。bulk批量写入的性能比你一条一条写入大量的document的性能要好很多。但是如果要知道一个bulk请求最佳的大小,需要对单...

2019-12-21 10:18:19 958

转载 张一鸣:每个逆袭的年轻人,都具备的底层能力(转)

转载一篇很有意义的一篇程序人生文章,读完之后,感觉很有感触!!张一鸣,吾辈程序开发者学习之楷模!这张不经意流出的照片,是中国互联网中最成功的一拨人,但坐在他们中间的张一鸣,却显得格格不入。张一鸣,1983年出生于福建龙岩,与美团创始人王兴、雪球方三文并称“龙岩三杰”。这个桌上论年龄,张一鸣和滴滴的程维最年轻;论资历,张一鸣只有南开大学本科做背书。论战绩,同时期的美团、滴滴都是和同量级的...

2019-12-21 10:11:33 2318 1

转载 redis线程模型(转)

1、首先redis是单线程的,为什么redis会是单线程的呢?从redis的性能上进行考虑,单线程避免了上下文频繁切换问题,效率高;从redis的内部结构设计原理进行考虑,redis是基于Reactor模式开发了自己的网络事件处理器: 这个处理器被称为文件事件处理器(file event handler)。而这个文件事件处理器是单线程的,所以才叫redis的单线程模型,这也决定了redis是...

2019-12-17 21:37:06 396

原创 ES读写数据的工作原理以及文档读写模型实现原理

es写入数据的工作原理是什么啊?es查询数据的工作原理是什么?底层的lucence介绍一下呗?倒排索引了解吗?一、es写数据过程1、客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点)2、coordinating node 对document进行路由,将请求转发给对应的node(有primary shard)3、实际的node上的primary...

2019-12-08 15:43:59 880

转载 ZooKeeper面试那些事儿(转)

1.ZooKeeper是什么?ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。客户端的读请求可以被集群中的任意一台机器处理,如果读请求在节点上注册了监听器,这个监听器也是由所连接的zooke...

2019-12-07 11:26:59 106

转载 Java并发编程之ReentrantReadWriteLock详解

ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,实际上独占锁是一种相对比较保守的锁策略,在这种情况下任何“读/读”、“读/写”、“写/写”操作都不能同时发生,这在一定程度上降低了吞吐量。然而读操作之间不存在数据竞争问题,如果"读/读"操作能够以共享锁的方式进行,那会进一步提升性能。因此引入了ReentrantReadWriteLock,顾名思义,ReentrantRe...

2019-11-30 21:47:02 135

转载 Java并发编程之ReentrantLock详解(转)

简介ReentrantLock是一个可重入且独占式的锁,它具有与使用synchronized监视器锁相同的基本行为和语义,但与synchronized关键字相比,它更灵活、更强大,增加了轮询、超时、中断等高级功能。ReentrantLock,顾名思义,它是支持可重入锁的锁,是一种递归无阻塞的同步机制。除此之外,该锁还支持获取锁时的公平和非公平选择。ReentrantLock的类图如下:Re...

2019-11-30 20:57:58 117

转载 ConcurrentHashMap原理分析(1.7与1.8)(转)

前言以前写过介绍HashMap的文章,文中提到过HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会出现死循环,所以HashMap是线程不安全的。...

2019-11-27 09:17:27 132

原创 MyBatis底层实现原理: 动态代理的运用

一日小区漫步,我自己问自己:Mybatis中声明一个interface接口,没有编写任何实现类,Mybatis就能返回接口实例,并调用接口方法返回数据库数据,你知道为什么不?这激发了我写本篇文章的冲动。动态代理的功能:通过拦截器方法回调,对目标target方法进行增强。言外之意就是为了增强目标target方法。上面这句话没错,但也不要认为它就是真理,殊不知,动态代理还有投鞭断流的霸权,连目...

2019-11-24 16:21:24 503

转载 红黑树详细分析(转)

看见好的文章,然后细细品味,理解之后,转载到自己的博客中,也是一种学习!!1.红黑树简介红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1978年发明,在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的红黑树。红黑树具有良好...

2019-11-24 15:06:33 137

转载 漫话:什么是平衡(AVL)树?这应该是把AVL树讲的最好的文章了(转)

最近一直在看AVL树,也看了一些博客,这篇文章还是蛮能让人理解的,算法类的博客还是花点时间,耐心去理解的。这篇文章通过对话的形式,由浅入深带你读懂 AVL 树,看完让你保证理解 AVL 树的各种操作。1、若它的左子树不为空,则左子树上所有的节点值都小于它的根节点值。2、若它的右子树不为空,则右子树上所有的节点值均大于它的根节点值。3、它的左右子树也分别可以充当为二叉查找树。例如:...

2019-11-24 10:40:06 192

转载 Java线上问题排查调优神器Arthas(转)

这篇文章将介绍Java线上问题排查调优神器Arthas的基本功能,如何快速上手使用,底层实现原理。简介Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?遇到问题...

2019-11-24 09:29:10 532

原创 java 实现ftp断点传输

目录需求背景原理介绍代码实现1、需求背景上送交易订单每日达600万,高峰期将近上千万,压缩包高达500M,如果网络上传超时,或者网络出现波动,需要实现断点继续上送功能。2 原理介绍那么字面意思,我们已经理解了,实际上ftp断点传输是怎么实现的呢?实现起来也很简单,每次传输前,先检查下远程文件是否已经存在,如果存在了,那么我们就读取这个文件的大小。然后比较下带传输文件和现在的文件...

2019-11-24 09:11:29 326

转载 BlockingQueue深入解析-BlockingQueue看这一篇就够了

BlockingQueue深入解析-BlockingQueue看这一篇就够了本篇将详细介绍BlockingQueue,以下是涉及的主要内容:BlockingQueue的核心方法阻塞队列的成员的概要介绍详细介绍DelayQueue、ArrayBlockingQueue、LinkedBlockingQueue的原理线程池与BlockingQueue1、初识阻塞队列在新增的Concur...

2019-11-22 18:22:05 682

转载 技术人员要拿百万年薪,必须要经历这9个段位(转)

很多人都问,技术人员如何成长,每个阶段又是怎样的,如何才能走出当前的迷茫,实现自我的突破。所以我结合我自己10多年的从业经验,总结了技术人员成长的9个段位,希望对大家的职业生涯,有所帮助。下面陈述了互联网技术人员的10个阶段,我们目前处于哪一个阶段,下一步又该如何继续走下去刚接触编程的时候,会觉得这是个很神奇东西,平淡的英文字母,再加上标点符号,竟然可以有这么大魔力。会觉得编程是很有自豪感...

2019-11-22 15:05:11 139

原创 如何异步+队列实现接入阿里云事件监控

阿里云监控服务可用于收集获取阿里云资源的监控指标或用户自定义的监控指标,探测服务可用性,以及针对指标设置警报。使您全面了解阿里云上的资源使用情况、业务的运行状况和健康度,并及时收到异常报警做出反应,保证应用程序顺畅运行。阿里云事件监控文档地址因为线上交易,退款,请求超时需要事件监控报警,公司服务器部署在阿里云,只需要接入阿里云的事件监控,我这里主要描述客户端如何实现异步+消息队列接入阿里云的...

2019-11-16 10:51:19 309

转载 为什么MySQL用B+树做索引(转)

作者 l 安静的boy文章来源 l Hollis(ID:hollischuang)索引这个词,相信大多数人已经相当熟悉了,很多人都知道MySQL的索引主要以B+树为主,但是要问到为什么用B+树,恐怕很少有人能把前因后果讲述的很完整。本文就来从头到尾介绍下数据库的索引。索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。 索引最形象的比喻就是图书的目录了。注意这里的大量...

2019-11-14 07:39:52 127

原创 redis为什么采用跳表而不是红黑树详解

今天早上看到这样redis的面试题:redis为什么采用跳表而不是红黑树??面试题答案:在做范围查找的时候,平衡树比skiplist操作要复杂。在平衡树上,我们找到指定范围的小值之后,还需要以中序遍历的顺序继续寻找其它不超过大值的节点。如果不对平衡树进行一定的改造,这里的中序遍历并不容易实现。而在skiplist上进行范围查找就非常简单,只需要在找到小值之后,对第1层链表进行若干步的遍历就可以...

2019-10-28 08:13:09 9447 5

转载 TCP连接三次握手和四次分手

三次握手,四次分手是面试预热问题,这个问题还是很考验大家对底层通讯的思考!!面试会有如下问题:1、请画出三次握手和四次挥手的示意图2、为什么连接的时候是三次握手?3、什么是半连接队列?4、ISN(Initial Sequence Number)是固定的吗?5、三次握手过程中可以携带数据吗?6、如果第三次握手丢失了,客户端服务端会如何处理?7、SYN攻击是什么?8、挥手为什么需要四...

2019-10-10 22:57:28 205

空空如也

空空如也

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

TA关注的人

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