自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 资源 (3)
  • 收藏
  • 关注

原创 链表反转之就地反转

链表反转之就地反转

2022-05-04 17:03:25 838

原创 CountDownLatch和CyclicBarrier原理的理解与实际的区别

看了各种资料和书,大家一致的意见都是CountDownLatch是计数器,只能使用一次,而CyclicBarrier的计数器提供reset功能,可以多次使用;但是我认为这只是一种比较笼统的区别,从javadoc中我们可以获取到这样描述:CyclicBarrier:一种同步辅助工具,允许一组线程都等待彼此到达一个共同的障碍点。cyclicbarrier在涉及固定大小的线程组的程序中很有用,这些线程偶尔必须等待对方。这个屏障被称为(循环的),因为它可以在等待的线程被释放后重新使用。CountDownLa

2021-06-18 18:16:38 958

原创 redis中embstr与raw编码方式之间的界限

在阅读《Redis设计与实现》8.2字符串对象中,当字符串长度小于32字节,字符串对象将使用emstr编码,大于32字节,字符串使用raw。验证:当小于44个字节的时候使用embstr,大于44的时候位rawembstr编码是专门用于保存短字符串的一种优化编码方式,这种编码和raw编码一样,都使用redisObject结构和sdshdr结构来表示字符串对象,但raw编码会调用两次内存分配函数来分别创建redisObject结构和sdshdr结构,而embstr编码则通过调用一次内存分配.

2021-04-02 16:31:38 4887 7

原创 为什么InnoDB表要建议用自增列做主键而MyISAM却不需要

在创建数据库的时候我们总是会创建一个自增的主键ID,可是你想过没有?这个自增的ID为什么要设置?可不可以不设置,不设置的后果是什么?带着这来两个疑问我们来验证一下。CREATE TABLE `student_table` ( `id` int NOT NULL AUTO_INCREMENT, `stuname` varchar(255) DEFAULT NULL, `birthday` date DEFAULT NULL, `create_time` datetime DEFAULT

2021-03-28 22:50:34 678 2

原创 MySQL优化之大字段longtext、text引发的生产问题

背景对接多个外部接口,需要保存请求参数以及返回参数,方便消息的补偿,因为多个外部接口,多个接口字段都不统一,整体使用一个大字段(longtext)进行存储,但是当数据只有40w的时候查询速度就非常慢长达40s左右。CREATE TABLE `risk_request_log_bak` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `risk_buss_no` varchar(32) DEFAULT NULL COM

2021-03-21 11:33:07 15983

原创 synchronized块使用string作为锁遇到的问题以及代码原理

要处理多个订单,并对相同订单号的订单进行数量统计,思路是加锁不同的订单号不进行加锁,相同的订单号串行执行。代码如下:public class LockDemo { private static ConcurrentHashMap<String,Integer> total = new ConcurrentHashMap<>(); public static void main(String[] args) throws InterruptedExcept

2021-03-02 16:45:09 1179 4

原创 JAVA使用并行流(ParallelStream)使用中的坑

public class TestParallelStream { public static void main(String[] args) { printFun(); } public static void printFun() { List<Integer> integersList = new ArrayList<>(); for (int i = 0; i < 100; i++) { .

2021-02-20 17:46:30 4297 2

原创 如何选择开源许可证?

对于软件产品,无论是免费发布还是出售,制定一份许可协议都非常有用。否则,对于前者,你相当于放弃了自己所有的权利,任何人都没有义务表明你的原始作者身份,对于后者,你将不得不花费比开发更多的精力用来逐个处理授权问题。许可,就是提供给使用你产品的人有一定的权限,不过你仍然拥有版权和专利(如果申请了的话)。开源许可证使得我们发布开源软件产品变得简单。现今存在的开源许可证很多,多数人搞不清楚他们之间的区别。很多程序员在开源代码的时候不知如何选择开源许可证,或者使用别人的开源代码时未遵循其原始许可证。如何选择开源许

2021-02-15 13:53:41 1021

原创 dubbo的本地存根(Stub)与本地Mock

stub:远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,那么就在服务消费者这一端提供了一个Stub类,然后当消费者调用provider方提供的dubbo服务时,客户端生成 Proxy 实例,这个Proxy实例就是我们正常调用dubbo远程服务要生成的代理实例,然后消费者这方会把 Proxy 通过构造函数传给 消费者方的Stub,然后把 Stub 暴露给用户,Stub 可以决定要不要去调 Proxy。会通过代理类去完成这个调用,这样在Stub类中,就可以.

2021-02-09 15:36:11 682 1

原创 跑批设计-如何才能让跑批更加高速

跑批的应用场景在开发过程中跑批经常使用的地方:消息类:到期失效以及到期批量通知客户 计算类:在财务中的罚息、计提、计息 文件类:对账信息、还款信息同步以及报表生成跑批数据特点数据量非常大 实时性并不是特别高,有比较宽裕的时间处理问题 性能要求并不是特别高,要求在跑批中的隐患数据量非常大,有时会全部读写到内存开销较大批量循环更新数据库一整个事务贯穿始终多个节点操作时,设计的缺点导致只会命中一个节点操作数据,导致其他节点资源浪费优化思考数据量比较大的思路:1.

2021-02-04 23:41:04 1376 1

原创 NAS SAN DAS都是什么

下面三张图就是NAS SAN DAS的简略介绍Direct Attached Storage 直接连接存储Network Attached Storage 网络附加存储Storage Area Network 存储区域网络DAS(Direct Attached Storage 直接连接存储) DAS是指将存储设备通过各种接口直接连接到目标计算机或服务器上。常见的接口有SCSI SAS eSATA SATA FC USB3.0 Thunderbolt...

2021-01-31 13:41:16 1538 5

原创 线程池执行以及回收原理(二)

在线程池执行以及回收原理(一)主要讲述了线程在执行过程中的创建以及如何获取task任务,下面主要讲述如何将创建出的工作线程进行回收线程回收

2021-01-22 17:56:55 514

原创 线程池执行以及回收原理(一)

线程池状态参数//存放线程的状态以及worker数量,int是32位,高3位是线程的状态位,低29位线程worker数量private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));// 29private static final int COUNT_BITS = Integer.SIZE - 3;//判断worker数量的位移基数,高3位为0,低29位为1private static final int CA

2021-01-17 20:23:16 842

原创 (转载)全局分布式事务GTS原理以及架构(二)

GTS核心流程GTS采用的是基于XA架构优化的技术路线,GTS方案认为XA性能低效主要原因是分布式任务提交设计阻塞(2PC),分布式事务提交的第一阶段等待最慢的一个分支事务完成之后才能完成所有的事务,及时不存在锁的竞争、冲突的情况下,分支数据库连接会被挂起占用的资源不会得到释放来防止全局事务提交前释放资源导致数据不一致。GTS采用的是两个阶段解耦的方式,将提交过程转换成第一阶段本地事务提交+第二阶段异步清理方式。可以有效的释放资源,不必占用数据库的连接资源。同事GTS维护了应用级别的日志与锁的信息,实现

2021-01-10 17:25:04 704 2

原创 全局分布式事务GTS原理以及架构(一)

1.微服务发展随着业务发展单体应用越来越负载,需要将单个应用拆分为若干个功能简单、松耦合的服务,这样可降低开发、维护的成本,增强扩展性以及敏捷开发。微服务框架也非常多Dubbo、Springcloud、thrift、grpc等。微服务存在的问题:1、微服务之间的通信以及故障处理2、原子交易,多个服务之间的调用如何维护数据的最终一致性3、服务编排:发现、部署和扩容问题1,解决策略,rpc框架的使用:dubbo多种协议,springcloud的restful问题2,分布式事务,现在没有通

2021-01-03 13:18:50 1020 2

原创 阿里面试算法题(一)

长度为N的数组arr,一定可以组成N^2个数值对例如:arr = [3, 1, 2],数值对有(3, 3)(3, 1)(3, 2)(1, 3)(1, 1)(1, 2)(2, 3)(2, 1)(2, 2),也就是任意两个数都有数值对,而且自己和自己也算数值对数值对的排序规则,第一维数据从小到大,第一维数据一样的,第二维数据也从小到大上面的数值对排序结果为:(1, 1)(1, 2)(1, 3)(2, 1)(2, 2)(2, 3)(3, 1)(3, 2)(3, 3)给定一个数组arr,和整数k,返回第k

2020-12-26 17:58:57 1455 2

原创 RocketMQ之消费重试机制以及代码分析

生产者消息重试生产者在发送消息(不包含顺序发送消息)的时候,同步、异步不进行重试,oneway不进行重试消息重试原则上可以保证消息发送成功以及不丢失,但是消息重新投递可能造成消费者重复消费,RocketMQ不保证幂等性,所以开发者如果有幂等性的要求,需要自行保证幂等mq的重试的默认值:同步需要开启重试配置:retryAnotherBrokerWhenNotStoreOK = true,默认是不开启重试private int retryTimesWhenSendFailed = 2;pri

2020-12-19 15:28:33 983

原创 网络通信IO的演进过程

BIO、NIO、多路复用器----->nettypublic class Demo { public static void main(String[] args) throws Exception { ServerSocket server = new ServerSocket(8090); System.out.println("step 1 new serverSocket"); while (true){ S

2020-12-13 11:10:40 188

原创 dubbo负载均衡原理解析

AbstractLoadBalance中的有四个实现ConsistentHashLoadBalance:一致性hashLeastActiveLoadBalance:最小活跃数RandomLoadBalance:随机RoundRobinLoadBalance:加权轮询底层父类,其中getWeight当启动时间小于预热的时间会调用calculateWarmupWeight方法会重新计算权重,防止由于刚启动是因为权重太大导致的高负荷运行,dubbo优化的一种方式public abstr.

2020-12-03 16:35:01 1054

原创 dubbo原理-服务调用整体流程

1.服务整体流程图消费者通过代理对象(proxy)对远程服务发起调用,经过一编码发送给服务端,服务端通过解码发送到dispatcher分发到线程池中,最后线程池调用具体的服务2.服务调用源码地址+注释,dubbo版本是2.6.x版本:https://github.com/adward-liu/dubbo/tree/2.6.x-liu...

2020-12-02 17:14:48 643

原创 RocketMQ一个JVM实例对应多个namesrv中的坑

背景:目前业务发展,需要向另外一个mq上发送消息,要保留原来的业务线,需要原来的生产者发送到老的mq中,新的业务线创建新的生产者需要链接到新的namesrv老系统的MQDefaultMQProducer producer = new DefaultMQProducer("producer_group_a");producer.setNamesrvAddr("老系统的namesrv");producer.start();新系统的MQDefaultMQProducer producer

2020-11-30 14:45:02 1931 1

原创 使用JdbcTemplate数据迁移,事务控制以及不生效原因

环境JDK1.8: <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>2.0.2</version> </dependency> &l

2020-11-29 12:23:56 1853

原创 Redis的过期策略以及内存淘汰策略原理

Redis是基于内存进行高性能的读写操作。既然是基于内存的那么就一定会达到内存存储的上线。那redis是怎么清除数据以及保留数据呢?这都是由redis的过期策略以及内存的淘汰机制决定的过期策略Redis由三种不同的删除策略:定时删除、定期删除、惰性删除。前两种是主动删除策略,最后一种是惰性删除策略。redis本身默认的删除策略是:定期+惰性删除定时删除:在设置键的过期时间的同时,创建一个定时器,定时器在过期时间来临时,立即执行删除操作优点:对内存是最友好的,通过定时器能够保证过期的键能够

2020-11-21 13:28:55 275

原创 Sharding-JDBC 初探(一)

这里是以插入为例进行分析类 ShardingPreparedStatement @Override public boolean execute() throws SQLException { try { //(1)获取路由规则 Collection<PreparedStatementUnit> preparedStatementUnits = route(); return new Pr.

2020-07-16 18:17:45 650

原创 同步 异步 阻塞 非阻塞 区别

异步、同步针对进程来说,关注client与sever之间的关系,阻塞与非阻塞更加关注与线程与线程的关联异步:client访问server端,client可以继续自己的操作,然后通过其他机制来获取结果:状态、通知或者回调函数同步:client访问server端,等待结果直到server端结果返回结果阻塞:改线程从头执行到尾,一直等到执行结束非阻塞:改进程在处理过程中,可以继续处理任务,不会因为其中的某个过程阻塞住(新开一个线程去执行其他的任务等等),隔一段时间调用调用一下之前的操作是否完成。

2020-07-08 16:55:14 120 1

原创 线程池线程数目的设置

线程池在使用过程中需要我们设置核心线程数,但是如何设置核心呢?从以下的几个角度去考虑问题1.任务的性质:cpu密集型、IO密集型、混合任务型2.任务的执行时间:长、中、短3.任务的依赖性:是否依赖其他的服务根据以上的集中角度:如果是CPU密集型的话,我们应该尽量减少线程数,尽量减少切换带来的开销,建议是CPU核数 + 1(计算密集型的线程偶尔由于缺失故障或者其他原因而暂停时,这个额外的线程也能确保CPU的时钟周期不会被浪费)如果是IO密集型的话:最佳线程数目 = ((线程等待

2020-06-22 16:17:46 718

原创 Disruptor初探(一)

在java并发编程中我们经常会使用new ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,RejectedExecutionHandler handler)来创建多线程的实例,其中corePoolSize:核心线程数,maximumP

2020-06-12 17:34:46 220

原创 伪共享以及如何解决伪共享

CPU的缓存主内存是数据存放的地方,cpu处理速度与硬盘、内存的访问速度相差太大,因此添加cpu的缓存进行中间过渡,否则主内存的访问速度的严重影响cpu整体的运行速度对一块数据多次运算,那么在执行运算的时候就会加载到离cpu比较近的就有了意义,越靠近cpu的缓存运行速度越快。所以 L1 缓存很小但很快,并且紧靠着在使用它的 CPU 内核。L2 大一些,也慢一些,并且仍然只能被一个单独的 CPU 核使用。L3 在现代多核机器中更普遍,仍然更大,更慢,并且被单个插槽上的所有 CPU

2020-06-08 16:01:11 1612

原创 SkyWalking使用(一)

idea使用一、下载安装包http://skywalking.apache.org/downloads/二、修改端口因为默认的端口是8080,端口冲突,如果端口不冲突可以不修改配置文件为:F:\Develop\apache-skywalking-apm-bin\webapp\webapp.ymlserver: port: 18080collector: path: /graphql ribbon: ReadTimeout: 10000 # Point to

2020-05-26 14:38:59 4961 2

原创 指令重排的意义

现代计算机由三大部分组成(已经转化为以存储器为中心)1.CPU(CentralProcessingUnit) 中央处理器,核心部件为ALU(ArithmeticLogicUnit,算术逻辑单元)和CU(ControlUnit,控制单元)2.I/O设备(受CU控制)3. 主存储器(MainMemory,MM),分为RAM(随机存储器)和ROM(只读存储器)//CPU与MM合...

2020-04-21 18:24:50 1701

原创 mysql事务隔离级别的选择

引言开始我们的内容,相信大家一定遇到过下面的一个面试场景面试官:“讲讲mysql有几个事务隔离级别?”你:“读未提交,读已提交,可重复读,串行化四个!默认是可重复读”面试官:“为什么mysql选可重复读作为默认的隔离级别?”(你面露苦色,不知如何回答!)面试官:"你们项目中选了哪个隔离级别?为什么?"你:“当然是默认的可重复读,至于原因。。呃。。。”(然后你就可以回去等通知了...

2020-03-29 17:37:55 964

原创 架构设计之微服务配置中心选型

用户所需,对于提供相似功能的产品进行选型对比,是引入某个开源项目必须要做的事,如果有一份参考,那么势必能提供一些帮助;(建议:即便有一份可参考的材料,技术选型的工作仍需要亲力亲为,实际的业务场景和资源配置才是技术选型最重要的依据); 微服务配置中心是一个微服务组件,而不是一个大的框架,选型成本较小,客观对比时不易走偏;本文将从产品功能、使用体验、实施过程和性能4个纬度进行对比,所有素材均来源...

2020-03-21 20:20:58 758

原创 RocketMQ使用总结 转载

分布式开放消息系统(RocketMQ)的原理与实践分布式消息系统作为实现分布式系统可扩展、可伸缩性的关键组件,需要具有高吞吐量、高可用等特点。而谈到消息系统的设计,就回避不了两个问题:消息的顺序问题 消息的重复问题RocketMQ作为阿里开源的一款高性能、高吞吐量的消息中间件,它是怎样来解决这两个问题的?RocketMQ 有哪些关键特性?其实现原理是怎样的?关键特性以及...

2020-01-20 11:56:33 267 1

原创 数据库中间件详解(转载)

1数据库拆分过程及挑战 互联网当下的数据库拆分过程基本遵循的顺序是:垂直拆分、读写分离、分库分表(水平拆分)。每个拆分过程都能解决业务上的一些问题,但同时也面临了一些挑战。1.1 垂直拆分对于一个刚上线的互联网项目来说,由于前期活跃用户数量并不多,并发量也相对较小,所以此时企业一般都会选择将所有数据存放在一个数据库 中进行访问操作。举例来说,对于一个电商系统,其用户模...

2020-01-16 16:17:19 643 2

转载 Ribbon的负载均衡策略及原理

Load Balance负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法。像nginx可以使用负载均衡分配流量,ribbon为客户端提供负载均衡,dubbo服务调用里的负载均衡等等,很多地方都使用到了负载均衡。使用负载均衡带来的好处很明显:当集群里的1台或者多台服务器down的时候,剩余的没有down的服务器可以保证服务的继续使用使用了更多的机器保证了机器的良性使用...

2020-01-16 15:42:51 2306 1

原创 数据库中间件的选型的思考(转载)

背景:随着业务的增长,各种业务数据的快速增长,单表数据量的急剧增长,单表的读写性能以及吞吐量呈下降的趋势。因此需要使用分库分表的机制来保证服务的高性能,然而开源的数据库中间件众多,从中挑选一款合适的中间件必须要考虑的问题:什么时候使用中间件,中间件作用 中间件原理,开源的中间件 推荐使用的中间件1.中间件的使用时机业务的发展使数据库中的数据量变大,几千万或者上亿级别的数据表出现,...

2020-01-10 16:21:33 698 1

原创 dubo使用注解,事务不生效

问题:在使用dubbo 2.5.3之前的版本@Service来发布服务时,当该服务中有@Transactional,服务注册不了@Component@Service//这个service注解是dubbo的@Transactionalpublic class UserServiceImpl implements UserService { @Autowired private U...

2019-12-19 11:53:10 557

原创 B+树适合作为索引的结构 以及索引原理

一.索引的本质:索引是帮助数据库高效的获取数据的数据结构,因此可以理解为索引的本质就是数据结构增加查询的速度有许多的算法:最简单的顺序查找,但是当数据量变大的时候会查询效率会非常的低,二分查找,二叉树查找,但是每一种算法都只适用于特定的数据结构上,如二分查找要求数据有序,二叉树应用于二叉树上,因此要适用这个算法的同时要维护好与之匹配的数据结构,这种数据结构就是数据库维护的索引这个例...

2019-12-10 17:12:51 898

原创 class.forName与classLoader区别

题记:记录一下java反射中的一些面试问题区别: @CallerSensitive public static Class<?> forName(String className) throws ClassNotFoundException { Class<?> caller = Reflectio...

2019-10-10 16:56:51 142

原创 redis下的shareJedis使用

redis分区:分区就是将数据分散到多个redis实例中,每个redis实例只保存一部分数据分区/分片的意义:单机的机器存储容量会限制redis的服务能力,为了存储的横向扩展,可以将数据分散到多台机器上ShardedJedis是通过一致性哈希来实现将不同的key分散到不同的redis server中shareJedis使用:@Test public void t...

2019-06-26 10:47:02 1104

PD4ML是一个功能强大的PDF生成工具

PD4ML是一个功能强大的PDF生成工具,它使用HTML和CSS(层叠样式表)作为页面布局和内容定义格式,字体包重新修改,提供了更多字体的支持

2021-02-09

深入理解 Java 内存模型.pdf

java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰java程序员,本文试图揭开java内存模型神秘的面纱。本文大致分三部分:重排序与顺序一致性;三个同步原语(lock,volatile,final)的内存语义,重排序规则及在处理器中的实现;java内存模型的设计目标,及其与处理器内存模型和顺序一致性内存模型的关系

2021-02-09

Logback中文文档.pdf

Logback非常自然地实现了 SLF4J,不需要像 Log4j 和 JUL 那样加一个适配层。Spring Boot 的默认日志框架使用的是 Logback。支持自动重新加载配置文件,不需要另外创建扫描线程来监视

2021-02-08

空空如也

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

TA关注的人

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