- 博客(55)
- 收藏
- 关注
原创 823.带因子的二叉树
【带因子的二叉树】,给出一个含有不重复整数元素的数组 arr ,每个整数 arr[i] 均大于 1。用这些整数来构建二叉树,每个整数可以使用任意次数。其中:每个非叶结点的值应等于它的两个子结点的值的乘积。满足条件的二叉树一共有多少个?答案可能很大,返回 对 109 + 7 取余 的结果。
2023-08-29 09:40:26 434
原创 分布式事务几种实现方案
分布式事务是指涉及多个参与者的事务,这些参与者可能分布在不同的计算机、进程或者网络中。分布式事务需要保证ACID属性,即原子性、一致性、隔离性和持久性。
2023-07-19 00:13:30 186
原创 OpenResty-lua-cache-lua-redis-sub
前言对于一个 JAVAER来说,肯定都搞过并发吧,对于高并发而言,目前大家都知道的几种解决方案,如下几种1:缓存降低DB的访问频率,比如说redis等2:多线程提升task处理速度3:加机器通过负载均衡–治标不治本,土豪随意4:消息队列削峰填谷接下来我要给大家介绍一款开源的,基于nginx做了增强的,由国人研发的,很多大厂使用的 openResty,可以使用其中的一些模块去做实现相应的需求,比如说缓存,访问redis,mysql 等等实现部分1:安装自行跳转 http://open
2022-02-27 21:57:15 2019
原创 分布式事务解决方案
背景在微服务架构中,假设存在下列调用A->B,在A调用B之前还有自己的一些操作C,如果C成功,调用B失败,此时是可以根据事务来回滚的,但是如果先调用B且成功,接着做操作C失败了,那么咋办?B提供一个相反操作的接口(不一定能解决)事务补偿事务消息实现方案事务补偿机制基本原理解释在系统A开启一个事务,在事务中,先操作本系统的数据库a,同时向数据库a插入一条补偿任务,提交事务;任务有三个状态,任务的三个状态 1:待处理, 2:处理中,3:处理完成外部启动一个任务,
2021-07-28 10:17:27 133
原创 全局唯一key生成策略-发号器实现原理
背景我们系统是分布式的,需要一个全局唯一量标识某一个字段由于系统的复杂性,需要对这些key进行运维发号器业务流程调用接口 - nextIdserver去redis-cluster获取一个自增值,并返回微服务获取到server返回的值,并写入到数据库基本模型实现原理redis的单线程模型源码javacom.youzan.paas.march.sdk.BasicClient#nextcom.youzan.paas.march.sdk.JedisBackend#incr
2021-07-28 01:36:00 421
原创 MySQL字段截断原理和源码分析
背景在某项目中碰到一个很诡异的问题,刚刚插入的数据,紧接着查的时候查不到。后来经过排查是数据库将我们需要插入的数据进行截断了。排查过程拉着前端一行一行debug,对比了入参和数据库的里面的数据,发现还可以插入数据库成功。于是在网上搜到了一些资料定位和解决问题最后联系了下dba,是sql_mode搞得鬼后续为了彻底弄懂是咋回事,于是还是拿起了mysql的源码,决定debug并复现下源码安装源码环境参考https://www.jianshu.com/p/a88ea5558f87Mysq
2021-07-04 01:36:54 271
原创 分布式token
分布式token背景在涉及到统一网关入口的时候,难免会涉及到多系统的鉴权机制,如果在在集群方案中,会有一个问题,当用户第一次登录在tomcat1上了,接口回去请求其他的接口,由于负载均衡的原因,下一个请求可能会打在了tomcat2上,此时是校验不通过的,为了解决这一问题,于是分布式token来了。实现原理解释第一步:用户登录,验证账号密码成功将token写入到cookie中,并同时将用户信息写入redis第二步:用户请求其他的接口,携带着登录成功返回的cookie第三步:服务器从req
2021-01-25 11:40:33 2735 1
原创 Arthas源码学习-1
先前准备1:源码下载:https://github.com/alibaba/arthas.git2:导入到idea,我这里选择直接使用idea下载并打开3:整体目录结构attach前准备工作找到启动类并debug模式运行 com.taobao.arthas.boot.Bootstrap#main //获取一些配置 CLI cli = CLIConfigurator.define(Bootstrap.class);拿到启动类上面的一系列注解以及里面的内容,最后返回一个客户端
2021-01-01 17:10:04 1369 2
原创 jenkins-git-docker-arthas
jenkins-git-docker-arthas1:下载Jenkins.war网站:https://get.jenkins.io/war-stable/2:运行war确保已经安装了jdk8 +在war所在的目录运行java -jar jenkins.war &查看程序是否起来 **jps -l**查看端口是否起来,默认80803:切换源将源更换成清华大学的源,为后续的插件下载提供便利(墙了)vim .jenkins/hudson.model.UpdateCente
2020-12-28 22:03:39 283
原创 WebSocket(ws)集群解决方案
WebSocket(ws)集群解决方案1:前言在某种特定的场景中,需要实现服务器主动向客户端推送数据的目的,这时候ws就出来了。如下模型但是这种的存在这单点问题,那么如何解决这种单点问题,很简单,我们直接通过nginx来配置集群就可以了,如下(nginx 是支持ws集群的)配置如下 map $http_upgrade $connection_upgrade { default upgrade; '' close; }2:问题现在项目已经部署好了,会不会有什么问题呢?
2020-12-23 17:59:56 1999
原创 CPU过高诊断,排查
1:代码准备死循环打印随机数public class TestCPUHigh { public static void main(String[] args) { while (true){ System.out.println(new java.util.Random().nextInt(66669999)); } }}2:现象pid = 5783的进程占用很高3:诊断3.1:top3.2:定位到进程 jp
2020-12-22 22:07:24 201
原创 Dubbo-RPC基本原理
Dubbo-RPC基本原理1:RPC介绍RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务–进程级别通过网络调用,发生了网络事件2:dubbo接口调用的基础1:进程级别 我们的微服务都是部署在不同虚拟机/容器中,是进程隔离的2:通过socket调用 对于部署在不同虚拟机或者不同容器中的服务,要是想发生数据通信的话,肯定是要走网络的,那么socker是跑不掉了3:对socket进行封装 对socket进行封装的上层框架有很
2020-12-06 02:05:34 1355
原创 Lambda8新特性入门
Lambda8新特性入门在我们日常的开发过程中,避免不了会写一点简单的函数,比如说,将每个人的年龄乘以二返回,判断年龄是否大于18等等,若是每次碰到这种的问题,我们都去写一个函数的话,好像是有点麻烦的,但是在java8中,将这些函数全部封装了,大概分为如下四种名称描述对应的方法入参(类型)出参(类型)Function<S,T>功能型applyYY(T)Consumer消费者型acceptYNSupplier申请型getNYP
2020-07-26 00:40:43 416
原创 Redis集群mget优化
写在前面哈哈哈哈哈,这次又来到了redis,redis对于大家来说,想必都已经熟悉了吧,笔者最近在做高并发的时候碰到一个问题,就是一个http接口,里面携带一个list<string> ~ a,然后通过a从redis中获取数据,考虑到数据量比较大,后来增加了redis集群,但是在访问的时候,使用的是 redisTemplate的mget,无论怎么优化,性能都是在秒级,对于缓存的读取,这...
2020-03-29 22:50:29 130
原创 Spring-Security学习笔记分享
前言 最近在做项目优化的工作,用到缓存情况比较多,redis,ehcache 等,为了可以更好的对后期架构进行调整,优化,以及服务器的扩容,这就需要我们对线上的一些参数进行曲线化的分析,当时做的方式就是直接做一个简单的接口,通过API的方式暴露出来,但是这些数据都是些关键的数据呀,对外直接暴漏,怕是有点不安全哟,于是想到了强大的spring家族提供的Spring-Security 组件...
2020-02-10 00:51:38 51
原创 序列化
序想必大家都听过序列化或者是反序列化,为什么要序列化呢?如果不序列化会出现什么问题,序列化了有什么好处呢,有哪些序列化的方式呢,在本次分享中都会一一解答。1:什么是序列化/反序列化序列化:将 Java 对象转换成字节流的过程。反序列化:将字节流转换成Java 对象的过程。2:序列化解决了什么问题?试想在多个系统中的数据交互,A系统部署在a机器上,B系统部署在b机器上,A系统调用B系统的某一个RP...
2020-02-06 22:28:48 69
原创 深入Redis之RESP协议
写在前头 对于redis这个中间件,想必对于java开发的同学都已经很是熟悉了,缓存?对了,你非常的棒!!!今天我们不扯这个东西,扯一点别的,假设有着这么一种场景,我们的redis部署在192.168.1.111上面,我们的web程序部署在192.168.1.112上面,然后来了客户端来了一个请求,而刚刚好,我们redis的应用场景也是做缓存,很假单嘛,不就是去redis里头拿下数据?恭喜你...
2020-01-18 01:48:07 84
原创 JAVA-SPI(dubbo的基石)实现原理
1:SPI---Service Provider Interface : 服务提供接口,结构图如下:2:本质:JavaSPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制.3:实现原理3.1:首先解决第一个疑问,为什么这个spi的配置文件要放在classpath:META-INF/services下面这个ClassLoader决定了从哪里加载文件...
2020-01-04 00:52:21 35
原创 高性能服务器之架构演化之路---建议食用
目录写在前头架构演化之路总结写在前头对于后端的开发而言,高并发是一个老生常谈的话题,近期笔者遇到一个很是棘手的问题,就是关于高并发的,目前是支持30W个终端,但是由于后期还会持续增长,当我听到的要支持500W的时候,感觉很快就会拥有秃秃的脑袋咯,不过不要慌,办法总是有的,查看各种资料和请教了几位大佬,将问题一步一步给化解了,接下来将分享怎么去打造一个高性能,高并发的服务器。...
2020-01-01 00:30:52 197
原创 并发编程异步利器之CompletableFuture
目录1:写在前头2:实战环节1:测试代码地址:2:测试环节3:对比数据分析4:其他参数分析3:总结1:写在前头我们在java的开发中是否会遇到处理大批量数据的问题,假如有这么一个场景,你去查询ES或者是DB,会给你返回大批量的数据,可能有十几万量级,甚至是百万量级,然后你拿着这些数据去做处理,操作可能包括cpu的复杂运算,文件存储,但不限于以上,那怎么办...
2019-12-15 03:34:36 314
原创 打造高性能服务器的通牒Nginx(负载均衡+缓存)web层拦截
目录1:写在前头2:食用指南2.1:负载均衡2.2:缓存3:拓展3.1:架构技术选型3.2:代码优化3.3:参数调优4:总结5:附件地址1:写在前头众所周知,Ngxin是一款高性能的服务器,可用于负载均衡,反向代理等功能,在日常的开发过程我们用到最多的应该是它的负载均衡,这个功能在多机部署的时候很是管用啊,毕竟现在很多公司基本上都是通过集群来做弹性伸...
2019-12-14 11:57:42 292
原创 线上诊断利器之Arthas-几个重要的命令
目录1:写在前头2:安装3:常用命令详解3.1:jvm3.2:trace (耗时)3.3:watch(查看参数)3.4:stack3.5:tt4:总结1:写在前头还在为线上出现的问题而头大吗?还在为线上没有打印日志回头加日志重新发布而苦恼吗?还在为因为某些原因而工作效率低下而脑壳疼吗?接下来介绍一款阿里开源的线上诊断利器--Arth...
2019-11-26 16:12:11 1966
原创 偏互联网公司中分布式锁问题的几种解决方案
序在偏互联网公司的项目中,项目部署和传统的公司项目部署方式有点不一样,考量到传统的行业的业务量没有那么大,完全可以将项目打成一个war包在tomcat中去运行,这个是没有没有问题的,如果涉及到流量比较大的业务呢,那怎么办?市面上通用的解决的方案是做集群化部署,通过负载均衡的方式去分发流量,从而达到每个服务器上面的流量没有那么大,以减轻服务器宕机的概率。大家都知道,我们的java项目是跑在JVM...
2019-11-17 23:32:57 292
原创 RocketMQ的事务消息原理及源码解读
目录1:实现思想2:事务消息发送流程3:消息提交,回滚4:回查事务状态5:总结1:实现思想RocketMQ事务消息的实现原理是基于两阶段提交(可以去了解一下XA)和定时事务状态回查来决定消息最终是提交还是回滚。一般地,应用程序在事务内完成相应的DB后,需要同步来调用mq相关的接口来发送消息,发送状态为prepare的消息(笔者称之为预消息),消息发送成功后,Roc...
2019-11-04 23:51:06 711
原创 记一次读取文件的(系统找不到指定的路径)
目录1:写在前面2:过程2.1:环境准备2.2:结果演示2.3:改进3:总结1:写在前面我们平常在做项目的时候,必然会涉及到文件的读取,但是偶尔会碰到这么一种情况,就是项目在本地测试的时候是好好的,一旦打包成jar包(目前主流的一般都是使用的是微服务的架构,方便快捷)运行,就会出现文件路径找不到java.lang.RuntimeException: file\tes...
2019-10-18 00:02:32 509
原创 Tomcat学习之路(一)
目录写在前面体系架构1:tomcat:web的servlet容器2:connector3:container,在tomcat中共有四个,每一个都有标准的实现。启动流程双亲委派tomcat优化1:在连接器方面2:如果项目是一个非页面项目,可以考虑不适用jasper功能3:jvm层面4:避免开启不需要的日志5:热加载写在前面Tomcat...
2019-10-14 00:53:59 388
原创 RocketMQ源码解析之消息发送(二)
目录1:写在前面2:RocketMQ消息数据结构3:生产者启动流程3.1:DefaultMQProducer3.2:启动生产者具体的实现类 DefaultMQProducerImpl3.3:同步消息发送基本流程4:总结目录1:写在前面RockerMQ发送一般的消息(还有一种是事务消息,后续的博客会展开)有三种实现方式:可靠的同步传输,可靠的异步传输,单向传...
2019-10-14 00:07:03 538
原创 RocketMQ源码解析之MQ服务器架构设计(00000)
目录1:架构图1.1:NameServer1.2:Broker1.3:Producer2:源码解析2.1:NameServer定时扫描,剔除2.2:Broker发送心跳包2.3:使用netty发送数据2.3:路由发现1:架构图1.1:NameServer在RocketMQ中,提供路由注册,发现,剔除等功能,并没有使用zk,redis等作为注册中心,而...
2019-09-28 00:55:28 194
原创 RocketMQ源码解析之NameServer启动流程(一)
目录1:入口2:创建nameserverController3:运行NamesrvController4:注册钩子函数1:入口org.apache.rocketmq.namesrv.NamesrvStartup#mainorg.apache.rocketmq.namesrv.NamesrvStartup#main02:创建nameserverControlle...
2019-09-25 23:11:59 182
原创 并发工具类之CyclicBarrier(二)
目录1:写在前面2:架构设计3:执行流程源码分析3.1:构造函数java.util.concurrent.CyclicBarrier#CyclicBarrier(int,java.lang.Runnable)3.2:线程执行阻塞方法3.3:唤醒线程4:总结1:写在前面1:CyclicBarrier旨在当n个线程全部阻塞的时候,然后一起运行,或者是执行某一个tas...
2019-09-22 23:05:01 147
原创 详解mvc执行流程
目录写在前面执行流程总结写在前面对于javaer而言,使用的基本上是基于springmvc,使用的是springboot也好,也是基于springmvc的,而springmvc是基于servlet的,对于从事与web开发的同学(有一定追求的),仅仅对于会用是远远不够,我们还是要知道其中的处理逻辑,以便于更好的开发出好的项目。执行流程1:首先调用的就是处理业务逻辑方法 s...
2019-09-21 00:48:12 2222 1
原创 并发工具类之CountDownLatch(一)
1:写在前面CountDownLatch是并发工具类,旨在当n个线程完成某一个任务,或达到某一种状态的时候,其他的线程才会开始工作,否则的话会一直处于阻塞状态2:架构设计CountDownLatch内部使用的是一个继承于AbstractQueuedSynchronizer(AQS)的Sync同步器,并初始化一个state计数器实现类一套共享方法3:执行流程源码解析3.1:构...
2019-09-03 22:39:42 174
原创 Redis之备份机制(一)
目录1:写在前面2:两种备份机制2.1:RDB(redis-database)2.2:AOF(append-only-file)3:总结1:写在前面Redis是一种NOSQL数据库,和 memecache最大的区别是Redis是可以持久化的,那么是怎么持久化的呢,以及持久化的策略。2:两种备份机制2.1:RDB(redis-database)1:当服务...
2019-08-31 21:12:44 1453
原创 Redis之事务(二)
目录写在前面开工1:是什么2:能做什么3:怎么做3.1:MULTI:开启一个事务3.2:EXEC:执行(commit)3.3:DISCARD:放弃当前事务,放弃队列中所有命令3.4:UNWATCH:取消所有监控的key3.5:WATCH:监控一个或多个key,如果在事务执行之前key被其他命令动过,那么当前事务被打断4:几种常见的事务总结写在前面...
2019-08-31 21:12:37 107
原创 java线程池详细讲解代码篇(二)
目录线程池实现原理1:使用工具类Executors来生成各种不同线程池2:底层都是通过new ThreadPoolExecutor来实现的3:核心方法几种线程池的测试1:newFixedThreadPool2:newSingleThreadExecutor3:newCachedThreadPool线程池实现原理1:使用工具类Executors来生成各种...
2019-08-30 18:53:03 297
原创 java线程池拒绝策略代码篇(三)
目录写在前面四种拒绝策略1:AbortPolicy(抛出异常)1.1代码1.2运行结果2:CallerRunsPolicy(谁调用谁运行)2.1代码2.2结果3:DiscardPolicy(直接丢弃)3.1代码3.2结果4:DiscardOldestPolicy(丢弃老的)4.1代码4.2结果写在前面当任务个数达到线程池的初始值,后来...
2019-08-30 18:52:45 563
原创 java线程池详细讲解理论篇(一)
目录1:写在前面1.1:什么是线程池1.2:为什么需要线程池2:常见的线程池2.1:newFixedThreadPool2.2:newSingleThreadExecutor2.3:newCachedThreadPool2.4:newSingleThreadScheduledExecutor3:线程池重要的7个参数3.1:初始化线程池的大小3.2:线程池...
2019-08-30 11:35:41 241
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人