自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 问答 (1)
  • 收藏
  • 关注

原创 谈谈Raft

本文主要参考极客时间-etcd 实战课GitChat-分布式锁的最佳实践之:基于 Etcd 的分布式锁谈到分布式协调组件,我们第一个想到的应该是大名鼎鼎的Zookeeper,像我们常用的Kafka(最新版本的Kafka已经抛弃了Zookeeper),Hadoop都用到了Zookeeper,而另外一个分布式协调组件etcd随着k8s的出现,也映入了我们的眼帘。谈到etcd,不得不说说etcd的基石—Raft。远古时代-单点系统在远古时代,我们数据都只存在于一个节点,不管是读数据也好,写数据也罢,都在

2022-01-10 09:45:00 839

原创 RocketMQ扫盲篇

本篇博客主要参考:《浅入浅出》-RocketMQ 敖丙APACHE-RocketMQ Gitee RocketMQ官方文档RocketMQ 实战与进阶 GitChat又是好久没有写博客了,虽然可以找出无数个没有写的博客的理由,但是说到底,还是一个字“懒”。今天我终于吃了一颗治疗懒癌的药丸,决定写一篇博客。介绍什么好呢,思来想去,还是介绍下RocketMQ吧,毕竟写了30多篇博客,还没有好好写过关于MQ的博客呢。本篇博客比较基础,不涉及到源码分析,只是扫盲。MQ有什么用解耦我觉得从某种角度来

2020-10-20 13:46:02 693

原创 Spring中眼花缭乱的BeanDefinition

本篇博客主要参考:Spring官网阅读(四)BeanDefinition(上)引入主题为什么要读Spring源码,有的人为了学习Spring中的先进思想,也有的人是为了更好的理解设计模式,当然也有很大一部分小伙伴是为了应付面试,Spring Bean的生命周期啦,Spring AOP的原理啦,Spring IoC的原理啦,应付面试,看几篇博客,对照着看看源码,应该就没什么问题了,但是如果想真正的玩懂Spring,需要花的时间真的很多,需要你沉下心,从最基础的看起,今天我们就来看看Spring中的基础——

2020-08-18 11:11:44 403

原创 蜻蜓点水说说Redis的ziplist的奥秘

本篇博客参考:Redis 深度历险:核心原理与应用实践Redis内部数据结构详解(4)——ziplistRedis的压缩列表ZipList上篇博客中,我给大家蜻蜓点水般的介绍了Redis中SDS的奥秘,说明Redis之所以那么快,还有一个很重要、但是经常被大家忽视的一点,那就是Redis精心设计的数据结构。本篇博客,还是继续这个话题,给大家介绍下Redis另外一种底层数据结构:ziplist。在Redis中,有五种基本数据类型,除了上篇博客提到的String,还有list,hash,zset,se

2020-08-06 14:19:22 377

原创 蜻蜓点水说说Redis的String的奥秘

本篇博客参考:掘金Redis小册 敖丙如果面试官问你,单线程的Redis为什么那么快,你可能脱口而出,因为单线程,避免上下文切换;因为基于内存,比硬盘读写快很多;因为采用的是多路复用网络模型。不管你是否真的理解了,这个回答足以应付一半以上的面试官了,但是如果可以再进行补充就更好了:因为Redis对各种数据结构进行了精心的设计,比如String采用的是SDS,比如list采用的是ziplist,quicklist等等,可能这样的回答就比较出彩了,至少可以说出部分面试者不太清楚的事情。今天我们就来看看R

2020-07-27 15:37:59 136

原创 Spring中你可能不知道的事(二)

在上一节中,我介绍了Spring中极为重要的BeanPostProcessor BeanFactoryPostProcessor Import ImportSelector,还介绍了一些其他的零碎知识点,正如我上一节所说的,Spring实在是太庞大了,是众多Java开发大神的结晶,很多功能,很多细节,可能一辈子都不会用到,不会发现,作为普通开发的我们,只能尽力去学习,去挖掘,也许哪天可以用到呢。让我们进入正题吧。Full Lite在上一节中的第一块内容,我们知道了Spring中除了可以注册我们最常用的

2020-07-23 20:39:03 93

原创 Spring中你可能不知道的事(一)

Spring作为Java的王牌开源项目,相信大家都用过,但是可能大家仅仅用到了Spring最常用的功能,Spring实在是庞大了,很多功能可能一辈子都不会用到,今天我就罗列下Spring中你可能不知道的事。一是可以帮助大家以后阅读源码,知道Spring为什么会这么写,二是可以作为知识储备,当人家不会的时候,你正好知道这个点,三下五除二就搞定了,嘿嘿。三是平时吹牛的时候可以更有资本。。。当然最重要的就是可以对Spring有一个更全面的认识。register现在官方推荐应该就是用JavaConfig的风格来

2020-07-23 20:37:54 159

原创 有点深度的聊聊JDK动态代理

在接触SpringAOP的时候,大家一定会被这神奇的功能所折服,想知道其中的奥秘,底层到底是如何实现的。于是,大家会通过搜索引擎,知道了一个陌生的名词:动态代理,慢慢的又知道了动态代理有多种实现方式,比如 JDK动态代理,Cglib 等等。今天我就来简单说说JDK动态代理。JDK动态代理的简单应用我们还是从一个最简单的例子着手:首先我们需要定义一个接口:public interface UserService { void query();}然后实现这个接口:public class

2020-07-23 20:34:43 103

原创 简单的单例模式其实也不简单

单例模式可以说只要是一个合格的开发都会写,但是如果要深究,小小的单例模式可以牵扯到很多东西,比如 多线程是否安全,是否懒加载,性能等等。还有你知道几种单例模式的写法呢?如何防止反射破坏单例模式?今天,我就花一章内容来说说单例模式。关于单例模式的概念,在这里就不在阐述了,相信每个小伙伴都了如指掌。我们直接进入正题:饿汉式public class Hungry { private Hungry() { } private final static Hungry hungry =

2020-07-23 20:34:12 76

原创 Volatile的那些事

上一篇中,我们了解了Synchronized关键字,知道了它的基本使用方法,它的同步特性,知道了它与Java内存模型的关系,也明白了***Synchronized可以保证“原子性”,“可见性”,“有序性”***。今天我们来看看另外一个关键字Volatile,这也是极其重要的关键字之一。毫不夸张的说,面试的时候谈到Synchronized,必定会谈到Volatile。一个小栗子public class Main { private static boolean isStop = false;

2020-07-23 20:33:42 97

原创 Synchronized的那些事

在上一篇博客中,我“蜻蜓点水”般的介绍了下Java内存模型,在这一篇博客,我将带着大家看下Synchronized关键字的那些事,其实把Synchronized关键字放到上一篇博客中去介绍,也是符合 “Java内存模型”这个标题的,因为Synchronized关键字和Java内存模型有着密不可分的关系。但是这样,上一节的内容就太多了。同样的,这一节的内容也相当多。好了,废话不多说,让我们开始吧,###Synchronized基本使用首先从一个最简单的例子开始看:public class Main {

2020-07-23 20:33:14 72

原创 浅谈Java内存模型

Java内存模型虽说是一个老生常谈的问题 ,也是大厂面试中绕不过的,甚至初级面试也会问到。但是真正要理解起来,还是相当困难,主要这个东西看不见,摸不着。网上已经有大量的博客,但是人家的终究是人家的,自己也要好好的去理解,去消化。今天我也来班门弄斧,说下Java内存模型。说到Java内存模型,不得不说到 计算机硬件方面的知识。计算机硬件体系我们都知道CPU 和 内存是计算机中比较核心的两个东西,它们之间会频繁的交互,随着CPU发展越来越快,内存的读写的速度远远不如CPU的处理速度,所以CPU厂商在CPU

2020-07-23 20:32:40 85

原创 被标记为事务的方法互相调用的坑(下)

参考:https://www.iteye.com/topic/1122740上一节,主要分析了 被标记为事务的方法互相调用,事务失效的原因,思考比较多,这一节主要说说解决方案,思考会少一些。####解决方案的核心: 通过代理对象去调用方法1.把方法放到不同的类:我们需要新建一个接口:public interface OtherService { void insertCodeMonkey();}再定义一个类去实现这个接口:@Servicepublic class OtherSer

2020-07-23 20:32:05 72

原创 被标记为事务的方法互相调用的坑(上)

相信大家一定用过Spring中的注解型事务,配合上Spring Boot,只需要在方法上打一个@Transactional 就可以完成,真香。但是如果大家对其中的机制一知半解的话,可能一不小心就会掉进坑,然后久久无法爬出来。下面我就分享下 被标记为事务的方法互相调用的坑。首先我写两个事务方法: @Autowired AccountMapper mapper; @Transactional @Override public void insertCodeBear

2020-07-23 20:31:30 126

原创 几种实现延时任务的方式(二)

在上一节中,我们讲了三种方式来实现延时任务,其实,将三种方式结合起来用,对于一些中小型公司已经足够了,但是在中大型互联网公司还是远远不够的。想必大家对Redis起码有一个初步的概念:基于内存的非关系型数据库。在平时的业务开发中,Redis经常会被用做缓存,来提高网站的性能,减少数据库的访问,所以一想到Redis,脑海中第一个浮现出来的就是缓存。没办法,对于搬砖业务开发,所使用到的Redis基本也仅仅局限于缓存/代替Session了。但是Redis的应用场景很多很多。下面我就用Redis来实现延时任务。

2020-07-23 20:30:59 204

原创 几种实现延时任务的方式(一)

大家肯定都有过在饿了么,或者在美团外卖下单的经历,下完单后,超过一定的时间,订单就被自动取消了。这就是延时任务。延时任务的应用场景相当广泛,不仅仅上面所说的饿了吗,美团外卖,还有12306,或者是淘宝,携程等等 都有这样的场景。这延时任务是怎么实现的呢?跟着我,继续看下去吧。###1.在SQL查询,Serive层组装的时候做手脚在拼接SQL或者Serive层做一些判断,比如 订单状态为 “已下单,但未支付”,同时 当前时间超过了 下单时间 15分钟,显示在用户端或者后台的订单状态就改为 “已取消”。这

2020-07-23 20:30:29 865

原创 几种实现延时任务的方式(三)

上篇文章介绍了使用Redis来实现延时任务,这是一个比较好的方案,但是这种方式是把Redis作为消息队列去使用,而Redis作为消息队列还是有一些缺点的:Redis本身没有提供监控、管理界面,需要自己去实现。我们无法方便的知道现在队列的情况,比如是否有积压,消费情况是如何的,生产情况又是如何的。消息可能被重复消费,如果是幂等性操作也没什么,但是如果非幂等性操作,就需要其他的解决方案来解决这个问题。Redis本身没有ACK机制,消息没有那么可靠,当然这个缺点在这个案例中,并不是那么明显,因为我们可以在

2020-07-23 20:29:42 167

原创 帮助你更好的理解Spring循环依赖

网上关于Spring循环依赖的博客太多了,有很多都分析的很深入,写的很用心,甚至还画了时序图、流程图帮助读者理解,我看了后,感觉自己是懂了,但是闭上眼睛,总觉得还没有完全理解,总觉得还有一两个坎过不去,对我这种有点笨的人来说,真的好难。当时,我就在想,如果哪一天,我理解了Spring循环依赖,一定要用自己的方式写篇博客,帮助大家更好的理解,等我理解后,一直在构思,到底怎么应该写,才能更通俗易懂,就...

2020-07-16 17:10:30 96

原创 MyBatis和Spring整合的奥秘

本篇博客源码分析基于Spring 5.1.16.RELEASE,mybatis-spring 2.0.0,较高版本的mybatis-spring源码有较大区别。Spring之所以是目前Java最受欢迎的框架,几乎所有的Java项目都在使用,就是因为它良好的生态,很多技术可以与之整合,为什么其他技术可以和Spring相整合,就是因为Spring拥有很多扩展点,阅读Spring源码,有一部分原因就是...

2020-07-07 11:19:36 139

原创 策略模式、策略模式与Spring的碰撞

策略模式是GoF23种设计模式中比较简单的了,也是常用的设计模式之一,今天我们就来看看策略模式。实际案例我工作第三年的时候,重构旅游路线的机票查询模块,旅游路线分为四种情况:如果A地-B地往返都可以直达,那么查询两张机票(往返)如果A地-B地去程无法直达,需要中转,但是返程可以直达,那么查询三张机票(去程两张,返程一张)如果A地-B地去程可以直达,但是返程需要中转,那么查询三张机票(去...

2020-06-30 11:47:53 128

原创 从一条数据说起——InnoDB行存储数据结构

本篇博客参考掘金小册——MySQL 是怎样运行的:从根儿上理解 MySQL先给大家讲一个故事,我刚参加工作,在一个小作坊里面当【码畜】(尽管现在也是),有一天老板从我背后走过,说了一句举世震惊的话:我看你们的数据库和excel一样,不就是一行行数据,人家excel还可以对单元格进行美化,还有各种函数,生成各种报表,你们的数据库有什么复杂的?我竟无力反驳。为什么要说这个故事呢,当然是为了引出今天...

2020-05-07 14:18:24 333 1

原创 MySQL中的事务和MVCC

本篇博客参考掘金小册——MySQL 是怎样运行的:从根儿上理解 MySQL以及极客时间——MySQL实战45讲。虽然我们不是DBA,可能对数据库没那么了解,但是对于数据库中的索引、事务、锁,我们还是必须要有一个较为浅显的认识,今天我就和大家聊聊事务。为什么要有事务说到事务,不得不提到转账的事情,几乎所有的关于事务的文章都会提到这个老掉牙的案例,我也不例外。转账在数据库层面可以简单的抽象成...

2020-04-15 22:11:59 114

原创 Reactor模型

要无障碍阅读本文,需要对NIO有一个大概的了解,起码要可以写一个NIO的Hello World。说到NIO、Netty,Reactor模型一定是绕不开的,因为这种模式架构太经典了,但是好多人在学习的时候,往往会忽视基础的学习,一上来就是Netty,各种高大上,但是却没有静下心来好好看看Netty的基石——Reactor模型。本文就带着大家看看Reactor模型,让大家对Reactor模型有个浅显......

2020-03-23 22:56:35 663 2

原创 强软弱虚引用,只有体会过了,才能记住

以前学习强软弱虚引用的时候,只是走马观花看看博客,并没有自己写代码去实践、去证明,导致每次看完后,过不了多久就忘了,后来下定决心,一定要自己敲敲代码,这样才能让印象更加深刻,古人云:纸上得来终觉浅,绝知此事要躬行。Java中的四种引用Java中有四种引用类型:强引用、软引用、弱引用、虚引用。Java为什么要设计这四种引用Java的内存分配和内存回收,都不需要程序员负责,都是由伟大的JVM去...

2020-03-09 11:19:02 201

原创 有点长的博客:Redis不是只有get set那么简单

我以前还没接触Redis的时候,听到大数据组的小伙伴在讨论Redis,觉得这东西好高端,要是哪天我们组也可以使用下Redis就好了,好长一段时间后,我们项目中终于引入了Redis这个技术,我用了几下,感觉Redis也就那么回事啊,不就是get set吗?当我又知道Redis还有自增、自减操作,而且这些操作还是原子性的,秒杀就可以用这个技术,我就觉得我已经熟悉Redis了。相信有不少curd boy...

2020-03-03 15:07:14 249 1

原创 谈谈数据库,缓存一致性

几年前,我在看博客的时候,看到有一篇博客的标题就是关于数据库,缓存一致性的,不以为然,直接跳过去了,心想,这么简单的问题还讨论个鬼啊。这种想法持续了很久,直到某天,我看到越来越多的人都在讨论数据库,缓存一致性的问题,才好好的看了下博客,才发现原来数据库,缓存一致性真不是一个简单的问题。今天我也来谈谈数据库,缓存一致性问题。科普考虑到有一些小伙伴可能技术不是那么好,可能没有接触过缓存,所以这里还...

2019-12-28 17:32:40 102

原创 大白话布隆过滤器

本文是站在小白的角度去讨论布隆过滤器,如果你是科班出身,或者比较聪明,又或者真正想完全搞懂布隆过滤器的可以移步。不知道从什么时候开始,本来默默无闻的布隆过滤器一下子名声大燥,仿佛身在互联网,做着开发的,无人不知,无人不晓,哪怕对技术不是很关心的小伙伴也听过它的名号。我也花了不少时间去研究布隆过滤器,看了不少博客,无奈不是科班出身,又没有那么聪明的头脑,又比较懒...经过“放弃,拿起,放弃,拿起”...

2019-05-23 11:03:38 73

原创 剑指Spring源码(三)俯瞰Spring的Bean的生命周期(大众版)

距离上一次写Spring源码解析,已经过去了快要好几个月了,主要原因还是Spring的源码解析类文章太难写了,不像我先前写的什么CAS源码,AQS源码,LinkedBlockingQueue等等,这些无非就是分析几个核心方法,代码也不算太长,就像比较复杂的AQS源码也是两篇搞定的,虽然AQS源码也很多东西也不能算是百分百的理解,但是核心思想应该是还算理解的。解析完毕成就感也满满的,写完博客,看着大...

2019-05-14 12:01:26 97

原创 ThreadLocal源码解析,内存泄露以及传递性

我想ThreadLocal这东西,大家或多或少都了解过一点,我在接触ThreadLocal的时候,觉得这东西很神奇,在网上看了很多博客,也看了一些书,总觉得有一个坎跨不过去,所以对ThreadLocal一直是一知半解的,好在这东西在实际开发中毕竟用的不多,所以也就得过且过了。当然我说的“用的不多”,只是对于普通的上层业务开发而言,其实在很多框架中,都用到了ThreadLocal,甚至有的还对Thr...

2019-05-12 22:02:33 73

原创 并发编程基础(下)

书接上文。上文主要讲了下线程的基本概念,三种创建线程的方式与区别,还介绍了线程的状态,线程通知和等待,join等,本篇继续介绍并发编程的基础知识。sleep当一个执行的线程调用了Thread的sleep方法,调用线程会暂时让出指定时间的执行权,在这期间不参与CPU的调度,不占用CPU,但是不会释放该线程锁持有的监视器锁。指定的时间到了后,该线程会回到就绪的状态,再次等待分配CPU资源,然后再次...

2019-05-05 16:59:46 60

原创 并发编程基础(上)

从我开始写博客到现在,已经写了不少关于并发编程的了,差不多还有一半内容整个并发编程系列就结束了,而今天这篇博客是比较简单的,只是介绍下并发编程的基础知识( = =!其实,对于大神来说,前面所有博客都是基础)。本来我不太想写这篇博客,因为这篇博客的很多内容都是以记忆为主,而且网上也有大把大把的博客,都写的相当不错,但是我最终决定还是要写一写,因为没有这篇博客,并发编程系列就不能算是一个完整的系列。...

2019-04-28 19:09:02 43

原创 Random在高并发下的缺陷以及JUC对其的优化

Random可以说是每个开发都知道,而且都用的很6的类,如果你说,你没有用过Random,也不知道Random是什么鬼,那么你也不会来到这个技术类型的社区,也看不到我的博客了。但并不是每个人都知道Random的原理,知道Random在高并发下的缺陷的人应该更少。这篇博客,我就来分析下Random类在并发下的缺陷以及JUC对其的优化。Random的原理及缺陷public static void ...

2019-04-21 15:24:08 102

原创 LinkedBlockingQueue源码解析

上一篇博客,我们介绍了ArrayBlockQueue,知道了它是基于数组实现的有界阻塞队列,既然有基于数组实现的,那么一定有基于链表实现的队列了,没错,当然有,这就是我们今天的主角:LinkedBlockingQueue。ArrayBlockQueue是有界的,那么LinkedBlockingQueue是有界还是无界的呢?我觉得可以说是有界的,也可以说是无界的,为什么这么说呢?看下去你就知道了。...

2019-04-14 22:06:32 70

原创 ArrayBlockQueue源码解析

清明节和朋友去被抖音带火的一个餐厅,下午两点钟取晚上的号,前面已经有十几桌了,四点半餐厅开始正式营业,等轮到我们已经近八点了。餐厅分为几个区域,只有最火的区域(在小船上)需要排号,其他区域基本上是随到随吃的,最冷清的区域几乎都没什么人。菜的价格异常的贵,味道也并不好。最后送出两张图:image.pngimage.png好了,进入今天的正题,今天要讲的是ArrayBl...

2019-04-07 16:38:46 68

原创 难以理解的AQS(下)

在上一篇博客,简单的说下了AQS的基本概念,核心源码解析,但是还有一部分内容没有涉及到,就是AQS对条件变量的支持,这篇博客将着重介绍这方面的内容。条件变量基本应用我们先通过模拟一个消费者/生产者模型来看下条件变量的基本应用:当有数据的时候,生产者停止生产数据,通知消费者消费数据;当没有数据的时候,消费者停止消费数据,通知生产者生产数据;public class CommonRes...

2019-03-31 09:54:58 57

原创 难以理解的AQS(上)

在一篇博客中,我们看了下CopyOnWriteArrayList的源码,不是很难,里面用到了一个可重入的排他锁: ReentrantLock,这东西看上去和Synchronized差不多,但是和Synchronized是完全不同的东西。Synchronized锁的特性是JVM保证的,ReentrantLock锁的特性是上层的Java代码控制的。而ReentrantLock的基础就是AQS,事实上...

2019-03-24 11:24:54 135

原创 CopyOnWriteArrayList源码解析

Java并发包提供了很多线程安全的集合,有了他们的存在,使得我们在多线程开发下,可以和单线程一样去编写代码,大大简化了多线程开发的难度,但是如果不知道其中的原理,可能会引发意想不到的问题,所以知道其中的原理还是很有必要的。今天我们来看下Java并发包中提供的线程安全的List,即CopyOnWriteArrayList。刚接触CopyOnWriteArrayList的时候,我总感觉这个集合的名...

2019-03-15 22:23:48 58

原创 浅谈负载均衡算法与实现

记得,我刚工作的时候,同事说了一个故事:在他刚工作的时候,他同事有一天兴冲冲的跑到公司说,你们知道吗,公司请了个大牛。大牛?对,那人会写AJAX!哇,真是大牛啊,跟着他,可以学不少东西啊。我听了笑了,但有点难以理解,因为现在几乎只要是一个开发,都会写AJAX,怎么写个AJAX就算大牛呢?后来我明白了,三年前高深莫测的技术到现在变得普普通通,不足为奇,就像我们今天要讲的负载均衡,在几何时,负载均衡只...

2019-03-08 22:08:55 84

原创 CAS、原子操作类的应用与浅析及Java8对其的优化

前几天刷朋友圈的时候,看到一段话:如果现在我是傻逼,那么我现在不管怎么努力,也还是傻逼,因为我现在的傻逼是由以前决定的,现在努力,是为了让以后的自己不再傻逼。话糙理不糙,如果妄想现在努力一下,马上就不再傻逼,那是不可能的,需要积累,需要沉淀,才能慢慢的不再傻逼。好了,鸡汤喝完。今天我们的内容是CAS以及原子操作类应用与源码浅析,还会利用CAS来完成一个单例模式,还涉及到伪共享等。因为CAS是并...

2019-03-02 19:28:48 94

原创 三种方式实现观察者模式 及 Spring中的事件编程模型

观察者模式可以说是众多设计模式中,最容易理解的设计模式之一了,观察者模式在Spring中也随处可见,面试的时候,面试官可能会问,嘿,你既然读过Spring源码,那你说说Spring中运用的设计模式吧,你可以自信的告诉他,Spring中的ApplicationListener就运用了观察者模式。让我们一步一步来,首先我们要知道到底什么是观察者模式,用Java是如何实现的,在这里,我将会用三种方式来...

2019-02-23 18:58:20 77

空空如也

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

TA关注的人

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