后端技术
文章平均质量分 84
菠萝-琪琪
这个作者很懒,什么都没留下…
展开
-
Raft 思想在架构中实践
TiDB 是 NewSql 一款很火的数据库,解决了 Mysql 对于海量数据的处理缺陷以及横向扩展能力(分布式),在此基础上还同时拥有 ACID 的事务特性,如果之前使用过Mysql 那么学习使用 TiDB 基本没有什么学习成本我们重点来说说 TiDB中的 TiKV,TiDB 也是采用了存算分离架构,TiKV 就是存储层。原创 2023-07-24 10:31:12 · 378 阅读 · 0 评论 -
ShardingSphere数据分片、读写分离、数据屏蔽教程
ShardingSphere数据分片、读写分离、数据屏蔽教程原创 2023-05-12 10:10:56 · 1023 阅读 · 1 评论 -
缓存中间件Caffeine超详细源码解读
读源码是一件非常复杂、困难、枯燥的过程,这个复杂过程我给大家踩了,各位看官躺平看就行啦。原创 2023-02-12 18:28:11 · 2273 阅读 · 0 评论 -
Java编码的坑你知多少?
在Java中,RandomAccess和Cloneable、Serializable一样,都是标志性接口,不需要任何实现,只是用来表明其实现类具有某种特质的,实现了Cloneable表明可以被拷贝,实现了Serializable接口表明被序列化了,实现了RandomAccess则表明这个类可以随机存取,对我们的ArrayList来说也就标志着其数据元素之间没有关联,即两个位置相邻的元素之间没有相互依赖和索引关系,可以随机访问和存储。是内部类,并且是静态(static修饰)的即为静态内部类。原创 2022-12-09 19:13:48 · 601 阅读 · 0 评论 -
kafka每秒千万级优化思路
如果秒级产生150MB的数据,如果Consumer消费的速度不够快,那么8G的PageCache可能不到半小时就没了,那么就会带来新的问题了,consumer消费的数据由于在PC上面找不到,就会不停的去硬盘查找数据,那么内存度和交换度的性能是数量级的差别,新的Topic数据大概率会存储在日志数量最少的borker磁盘上,如果这部分topic数据量比较大,那么就会导致存储不均衡,这个borker磁盘会率先报警,部分borker磁盘到达存储阈值后会对kafka带了很大的性能影响。可以通过如下命令查看迁移状态。原创 2022-10-12 19:19:15 · 1509 阅读 · 0 评论 -
Sentinel 深度分析
流控配置:资源名的填写分feign/dubbo不同方式:feign 填写请求地址 dubbo 填写sentinel注解的value值@SentinelResource(value = "circle.checkPopulation", blockHandler = "checkPopulation", blockHandlerClass = {BlockExceptionHandler.class})有种更加简单的方式,直接通过簇点链路菜单看各个资源地址,直接进行流控配置针对来原创 2022-05-17 14:09:10 · 526 阅读 · 0 评论 -
用Java设计实现多实例多库查询
服务的边界职责:大数据层取数统一实现入口(数据源的路由,ADB/CK/HBASE... 大数据操作层数据源的路由) 支持多实例、多库、多表的异构数据查询通过 查询 语义分析+元信息解析,拆解 查询输入 中的异构数据源处理,所有异构数据处理采用异步 Callback 方式解决的问题:多个数据来源写入到不同实例、不同库中,并且一个圈选可以支持圈多个实例(不同库)中的标签、事件数据 单表数据量过大,目前只能通过压缩保留时间解决,需要可以进行按时间段拆表分表查询数据单实例配置上限问题,实例升级..原创 2022-03-08 21:04:14 · 4196 阅读 · 0 评论 -
Java 函数式编程的妙用
Jdk8之后新增的一个重要的包 :java.util.function该包下所有的接口都是函数式接口, 按分类主要分为四大接口类型:Function、Consumer、Predicate、Supplier 接口 参数 返回值 说明 Supplier 无 T 供给型:无参,返回一个执行泛型对象 Consumer ...原创 2021-09-30 13:51:00 · 376 阅读 · 0 评论 -
Elasticsearch断路器相关知识及使用
背景在使用elasticsearch时,如果使用了高基数的聚合查询,有可能导致内存溢出OOM,导致elasticsearch的节点问题,进一步引发该节点上的分片漂移,从而影响线上的查询问题。原因Elasticsearch在执行高基数查询时,会默认为每组数据生成一个桶,并且存放在内存中,当基数很大也就是分组数据的重复性不高时,就会生成很多的桶,从而占用大量的内存。内存使用介绍ES的JVM heap按使用场景分为可GC部分和常驻部分。 可GC部分内存会随着GC操作而被回收;...原创 2021-08-14 22:24:18 · 2056 阅读 · 1 评论 -
傻瓜式SpringBoot-WebFlux入门
再说响应式编程前先来了解下WebSocker在Spring中的支持 注解名 描述 使用场景 WebSocket @ServerEndpoint WebSocket使用,定义端点路径 定义在某个类上,使用ws进行请求就会找到这个端点进入这个类 @OnOpen ws连接建立成功后进入的回调方法 ...原创 2021-08-05 14:08:32 · 1836 阅读 · 0 评论 -
Redis 间歇性抖动<集群下mget的性能问题>
redis问题在最近公司内部使用redis的时候,在部分场景中发现redis经常会间歇性的抖动,具体表现为在短时间内redis rt上涨明显,RedisCommandTimeoutException异常陡增,如下图:监控面板是按照分钟级别进行统计,所以rt上涨看起来不是很明显。这种情况肯定不太正常,并且在近期出现的频率有上升趋势。定位原因遇到这种问题,首先会想到是不是redis本身抖动造成的,看表象其实很像,无规律,间歇性,影响时间很短,所以第一时间找了DBA确认当时是不是r原创 2021-07-11 14:29:23 · 2115 阅读 · 3 评论 -
SpringBoot事务不起作用问题的解决方案
背景在做业务开发时,遇到了一个事务不起作用的问题。大概流程是这样的,方法内部的方法调用了一个带事务的方法,失败后事务没有回滚。查阅资料后,问题得到解决,记录下来分享给大家。场景在一个UserService里面,一个内部方法callSaveUser调用该service里面的saveUser方法 @Override @Transactional(rollbackFor = RuntimeException.class) public void saveUser(User use.原创 2021-07-04 09:52:59 · 917 阅读 · 0 评论 -
JMeter实用教程【二】-BeanShell的使用
为什么要使用BeanShell之前在做客服域相关接口生产环境压测的时候,遇到一个问题,那就是签名如何生成,网关的同学是有提供相关签名计算的jar包,如何使用提供的jar包在JMeter中生成签名?BeanShell这个小工具可以帮到你。BeanShell简介Beanshell 是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性。BeanShell执行 标准Java语句和表达式,另外包括一些脚本命令和语法。它将脚本化对象看作简单闭包方法(s.原创 2021-06-01 10:52:23 · 1824 阅读 · 2 评论 -
地球上目前最好的本地缓存框架:Caffeine
Guava Cache这个是一开始大家用的本地缓存框架,他极大的简化了我们操作缓存时需要考虑的丢弃策略、刷新策略等等....并且当时这个框架的各方面性能也是要高于Ehcache2框架的但是时代再次发生了变化 ----------------------------------------华丽的分割线Caffeine 框架横空出世显来几个性能测试报告来做开胃菜GuavaCache 和 Caffeine两个框架最根本的区别就在于淘汰策略的算法上:LRU 算法(G...原创 2021-05-17 17:28:30 · 1032 阅读 · 0 评论 -
System.currentTimeMillis() 真的还能用吗?
很多同学在项目中会有需要打印代码执行时间的需求,那么我们的代码一般会是下面这样的可是你真的了解过当你的系统是一种高并发应用要求极限QPS的时候这种方式对你系统的伤害嘛?HotSpot源码的hotspot/src/os/linux/vm/os_linux.cpp文件中,有一个javaTimeMillis()方法,这就是System.currentTimeMillis()的native实现。调用gettimeofday()需要从用户态切换到内核态;gettimeofday()的表现受Linux系原创 2021-04-30 10:38:26 · 513 阅读 · 0 评论 -
2021年了你还在使用logback做日志框架吗
Log4jLog4j是Apache的一个Java的日志库,通过使用Log4j,我们可以控制日志信息输送的目的地(控制台、文件、数据库等);我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。LogbackLogback,一个“可靠、通用、快速而又灵活的Java日志框架”。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。lo原创 2021-04-28 20:50:57 · 371 阅读 · 0 评论 -
TimingWheel 令人拍案叫绝的设计
常规时间轮都知道时钟有指针、刻度、每刻度表示的时长等属性,Netty时间轮的设计也差不多,只是时钟的指针有时、分、秒,而Netty只用了一个指针。那么Netty是如何把定时任务加入时间轮的呢?下面先看一幅时间轮的构造图当指针指向某一刻度时,它会把此刻度中的所有task任务一一取出并运行那么问题来了:时间轮的指针走一轮是多久? 时间轮是采用什么容器存储这些task的? 定时任务的运行时间若晚于指针走一轮的终点(见图7-1中的N),则此时此任务该放在哪个刻度?刻度的间隔时间标注为tickD原创 2021-04-16 23:50:20 · 233 阅读 · 0 评论 -
JVM-G1 性能调优思路与实战
现在大多数公司的Java生产版本都是再JDK8,所以本次性能调优主要针对G1来展开GC的主要回收区域就是年轻代(young gen)、老年代(tenured gen)、持久区(perm gen),在jdk8之后,perm gen消失,被替换成了元空间(Metaspace),元空间会在普通的堆区进行分配。垃圾收集为了提高效率,采用分代收集的方式,对于不同特点的回收区域使用不同的垃圾收集器。系统正常运行情况young是比较频繁的,full gc会触发整个heap的扫描和回收。在G1垃圾收集器中,最好的优化状原创 2021-04-16 15:14:46 · 3501 阅读 · 0 评论 -
Java 堆外内存操作和使用场景
JDK5 之后才出现了堆外内存得API给到开发进行调用,那么我们为什么要使用堆外内存呢?加速GC回收,大量对象产生在堆内,GC回收得压力是很大得 更自由、更高效得使用整个计算机内存 更高性能得跨进程数据通信,避免了主内存得多次copy使用堆外内存需要考虑哪些问题呢?准确得时间释放无需在使用得堆外内存带着上面得问题我们接着往下看Java 堆外内存得操作方式利用unsafe直接操作(危险性比较高,官方不推荐) 利用NIO得ByteBuffer,JVM会进行堆外内存管理,当堆内得引.原创 2021-03-27 20:43:40 · 1831 阅读 · 1 评论 -
NIO-ByteBuffer API使用详解(堆外内存)
bytebuffer其实就是缓存区,缓冲区就是在内存中预留指定大小的存储空间对I/O数据作临时存储,这部分内存空间即为缓冲区。使用缓冲区可以减少动态分配和回数内存的次数。在java NIO中,缓冲区的作用也是用来临时存储数据。缓冲区可以看作通道(channel)与客户端(或服务器)的中转站,写入数据到channel或者从channel中读取数据,这样利于数据的高效读写。一、 Fields所有缓冲区都有四个属性:capacity、limit、position、mark,并遵循:mark <= p原创 2021-03-25 13:27:21 · 734 阅读 · 0 评论 -
Lambda底层原理最强解析
最近再次重温Lambda函数编程这本书的时候,思考起第一次看这本书只是为了了解如何深入使用Lambda,却没有去思考为什么可以Lambda了,话比较绕口~~哈哈你可能会好奇Java编译器是如何实现Lambda表达式,而Java虚拟机又是如何对它们进行处理的。如果你认为Lambda表达式就是简单地被转换为匿名类,那就太天真了。由于Lambda表达式提供了函数式接口中抽象方法的实现,这让人有一种感觉,似乎在编译过程中让Java编译器直接将Lambda表达式转换为匿名类更直观。不过,匿名类有着种种不尽如人原创 2021-03-20 10:52:57 · 1836 阅读 · 0 评论 -
AtomicInteger超级升级版LongAdder详解
LongAdder原理分析AtomicLong通过CAS提供了非阻塞的原子性操作,相比使用阻塞算法的同步器来说它的性能已经很好了,但是JDK开发组并不满足于此。使用AtomicLong时,在高并发下大量线程会同时去竞争更新同一个原子变量,但是由于同时只有一个线程的CAS操作会成功,这就造成了大量线程竞争失败后,会通过无限循环不断进行自旋尝试CAS的操作,而这会白白浪费CPU资源。因此JDK 8新增了一个原子性递增或者递减类LongAdder用来克服在高并发下使用AtomicLong的缺点。既然Ato原创 2021-03-17 11:05:18 · 544 阅读 · 0 评论 -
CountDownLatch升级版同步器Phaser
Phaser得功能远比CountDownLatch和CyclicBarrier更加强大,在特定场景中可以发挥更加重要得作用用Phaser替代CountDownLatch从JDK7开始,新增了一个同步工具类Phaser,其功能比CyclicBarrier和CountDownLatch更加强大。1.用Phaser替代CountDownLatch考虑讲CountDownLatch时的例子,1个主线程要等10个worker线程完成之后,才能做接下来的事情,也可以用Phaser来实现此功能。在CountDow原创 2021-03-09 22:35:11 · 258 阅读 · 0 评论 -
面试经典必问:ReentrantLock 中CLH队列
ReentrantLock 中的加锁操作都是通过Syn这个抽象类来完成,具体解析在之前得博客已经分析过了,请参考:ReentrantLock AQS操作解析得不到锁的线程,如何排队?JUC中锁的排队策略,是基于CLH队列的变种实现的。因此,我们先看看啥是CLH队列CLH队列如上图所示,获取不到锁的线程,会进入队尾,然后自旋,直到其前驱线程释放锁。可能会有同学问为啥有2种指针在node上面,这个之后会在解释这样做的好处:假设有1000个线程等待获取锁,锁释放后,只会通知队列中的第一个线程原创 2021-03-05 13:58:07 · 1702 阅读 · 0 评论 -
Java 并发编程如何入门
书籍阅读:方腾飞的《Java并发编程的艺术》(虽然豆瓣上的评价一般,但是对于构建Java并发的整体映像还是有所提高的,至少我知道了有哪些东西要深入学习) 《The Art of Multiprocessor Programming》这本书比较艰涩,不是很好懂,但是过一遍还是好处多多,建议初学者了解下概念的过过,后期可以再来翻看 《Java Concurrency in Practice》这本书号称Java并发编程的圣经,确实可以看出作者有很丰富的并发实践经验学习心得 -- Java并发包的基础..原创 2021-03-04 13:32:13 · 224 阅读 · 1 评论 -
Netty 入门教程
Netty是Java程序员必须要掌握的一项技能,Netty是一个非常优秀的网络编程框架,熟练掌握可以让我们省下很大一部分网络编程的工作Netty是什么? 官方定义:Netty 是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能服务器和客户端。 简单地说Netty封装了JDK的NIO,不用再写一大堆复杂的代码。既然代替了原生的NIO,肯定有比它好的理由,主要有如下几点: 1.Netty底层IO模型可以随意切换,比如可以从NIO切换到BIO,但一般很少会这么做。 2.Net原创 2021-03-04 11:06:10 · 759 阅读 · 2 评论 -
MongoTemplate 聚合查询
一、概述1.聚合的表达式MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。下表展示了一些聚合的表达式:表达式 描述 实例 $sum 计算总和。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) $avg 计算平均值 db.my.原创 2021-03-02 21:23:25 · 4848 阅读 · 0 评论 -
Java 动态追踪技术
JDK 1.5出现的API:java.lang.instrument.Instrumentation看完文档之后,我们发现这么两个接口:redefineClasses和retransformClasses。一个是重新定义class,一个是修改class。这两个大同小异,看reDefineClasses的说明:This method is used to replace the definition of a class without reference to the existing class原创 2021-02-27 22:46:12 · 1028 阅读 · 0 评论 -
强大的语法生成器:Antlr 使用
ShardingJDBC内部使用的也是Antlr4来做语法生成器的,当初在看sharding源码的时候被很多.g4结尾的文件迷惑住了,后来才知道原来这个就是Antlr4Antlr他不单单只可以分析SQL,Druid内部使用的是Sql-parse框架来做SQL解析的,这个框架也很优秀但是局限于SQL解析Antlr 是一款强大的语法生成器工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件。基本上是当前 Java 语言中使用最为广泛的语法生成器工具。Twitter搜索使用ANTLR进行语法分析,每原创 2021-02-23 22:51:05 · 2889 阅读 · 0 评论 -
解锁面试必问题:ThreadLocal 正确姿势
ThreadLocal 百度上面对于他的解释已经非常非常多了,但是很多其实都是复制来复制去,并且很多都是说的错的,最离谱的是百度上面头几页说ThreadLocal在Set的时候内部的ThreadLocalMap存放的Key是当前线程对象...,真的简直在虾扯蛋,不知道误导了多少人ThreadLocal的API非常简单,这里就不在描述了,主要针对他源码以及设计思路来分析设计者的用意,要了解ThreadLocal原理那么先要了解Thread和ThreadLocalMap是啥...Thread是Java种原创 2021-02-17 22:01:00 · 135 阅读 · 0 评论 -
Java 阻塞队列原理
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。阻塞队列提供了四种处理方法:方法\处理方式 抛出异常 返回特殊值 一直阻塞 超时退出 插入方法 add(e) offer(e)原创 2021-02-15 19:48:56 · 1799 阅读 · 0 评论 -
Java的类加载过程
前言一个Java文件从编码完成到最终执行,一般主要包括两个过程编译 运行编译,即把我们写好的java文件,通过javac命令编译成字节码,也就是我们常说的.class文件。运行,则是把编译生成的.class文件交给Java虚拟机(JVM)执行。而我们所说的类加载过程即是指JVM虚拟机把.class文件中类信息加载进内存,并进行解析生成对应的class对象的过程。举个通俗点的例子来说,JVM在执行某段代码时,遇到了class A, 然而此时内存中并没有class A的相关信息,于是JV原创 2021-02-11 00:17:40 · 1337 阅读 · 3 评论 -
SpringBoot 2.X启动流程解析
本文以调试一个实际的SpringBoot启动程序为例,参考流程中主要类类图,来分析其启动逻辑和自动化配置原理。总览: 上图为SpringBoot启动结构图,我们发现启动流程主要分为三个部分,第一部分进行SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器,第二部分实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块、及核心的创建上下文环境模块,第三部分是自动化配置模块,该模块作为springboot自动配置核心,在后面的分析中会详...原创 2021-02-07 15:23:13 · 396 阅读 · 0 评论 -
JWT 新一代认证登录方案
JWT 全称是 JSON Web Token,是目前非常流行的跨域认证解决方案,在单点登录场景中经常使用到。有些人觉得它非常好用,用了它之后就不用在服务端借助 redis 实现认证过程了,但是,还有一部分人认为它生来就有缺陷,根本不能用。传统的认证方式从一个登录场景说起你平时用过那么多网站和 APP,其中有很多都是需要登录的吧,那咱们就选一个场景出来说说。以一个电商系统为例,如果你想要下单,首先需要注册一个账号,拥有了账号之后,需要输入用户名(比如手机号或邮箱)、密码完成登录过程。之后你原创 2021-02-03 22:20:22 · 369 阅读 · 0 评论 -
Java 实现归并排序
归并排序的流程其实很简单:先分解再合并,整个排序的时间复杂度是稳定的:nlongn,再百万级数据量的排序大致维持在0.5 ~ 1s内下面是拆分的流程图:下面是合并的流程图:动态效果图:代码实现:/** * <p>Title:归并排序</p> * <p>Description:</p> * * @author QIQI * @date */public class GuibinSort { public s原创 2021-02-03 14:59:15 · 140 阅读 · 0 评论 -
ThreadPoolExecutor线程池实现原理及其实践
随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。1.1 线程池是什么线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的原创 2021-01-28 00:46:45 · 535 阅读 · 0 评论 -
Lombok 安装以及使用大全
安装打开 IDEA 的 Settings 面板,并选择 Plugins 选项,然后点击 “Browse repositories”在输入框输入”lombok”,得到搜索结果,点击安装,然后安装提示重启 IDEA,安装成功;引入依赖在自己的项目里添加 lombok 的编译支持,在 pom 文件里面添加 dependency<dependency> <groupId>org.projectlombok</groupId> <a.原创 2021-01-26 17:51:32 · 117 阅读 · 0 评论 -
大厂面试中常问的栈排序
很多大厂的笔试题中都会要求面试者写一段栈排序,因为栈这个数据结构平时我们用的比较少,导致很多面试者一下子都有点懵逼,这里就来给大家解惑一下吧题目:一个栈中有10个随机大小的元素,这个是初始栈 可以让你申请一个空栈作为交换使用 不准使用任何其他数据结构进行存储 最终按照从小到大的顺序输出原始栈思路:Stack这个数据结构的核心API我们必须要了解下,不然真的无从下手,Pop,Push,Peek三种核心操作 Pop会让栈顶数据出栈,同时删除原始栈顶的数据 Push添加元素到栈顶 .原创 2021-01-26 00:31:13 · 148 阅读 · 0 评论 -
CMS 常见问题分析和解决方案
1.0引言自 Sun 发布 Java 语言以来,开始使用 GC 技术来进行内存自动管理,避免了手动管理带来的悬挂指针(Dangling Pointer)问题,很大程度上提升了开发效率,从此 GC 技术也一举成名。GC 有着非常悠久的历史,1960 年有着“Lisp 之父”和“人工智能之父”之称的 John McCarthy 就在论文中发布了 GC 算法,60 年以来, GC 技术的发展也突飞猛进,但不管是多么前沿的收集器也都是基于三种基本算法的组合或应用,也就是说 GC 要解决的根本问题这么多年一直都.原创 2021-01-25 00:34:17 · 6219 阅读 · 2 评论 -
通过ReentrantLock的源码解析AQS的原理
Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架1 ReentrantLock1.1 ReentrantLock特性概览ReentrantLock意思为可重入锁,指的是一个线程能够对一个临界资源重复加锁。为了帮助大家更好地理解ReentrantLock的特性,我们先将ReentrantLock跟原创 2021-01-19 11:28:33 · 747 阅读 · 2 评论