自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

你的BoyZ的博客

走春夏秋冬天南地北母亲已经白头,我也不在年幼。

  • 博客(44)
  • 收藏
  • 关注

原创 多线程无锁红包实现方案

多线程无锁红包实现方案背景朋友面试遇到过写好红包的场景,遂自己尝试了下。刚开始在如何分配的时候还是有点疑惑,后来慢慢解决,并写了一个无锁的版本,希望大家一起讨论下。如果大家用得到,帮忙点个赞哈。代码@Datapublic class RedPacket { //红包总额 private Double total; //红包份数 private Integer counts; //红包分隔之后的载体 private List<Double&g

2022-01-06 14:51:08 623

原创 HTTP协议学习(一)

HTTP协议学习(一)背景up二刷《Http/2 in Action》时,记录一些自认为重要的知识点;内容HTTP1.1根本的问题一个域名下的多个请求需要排队执行,不能并发的获取资源。这样就造成了时间的浪费。这种现象会随着资源数量的增多更加严重。也可以说是客户端和服务端处理资源的时间远小于http消息传输时间;HTTP/1.1管道化技术可以解决该问题,但由于多种原因,它很难实现,易于出错,并且没有获得Web浏览器和Web服务器的良好支持。因此,它很少被使用。没有一个主流的Web浏览器支持管道

2021-12-07 13:40:39 589

原创 MySQL学习四之锁

MySQL学习四之锁一、为什么需要锁锁机制用于对共享资源的并发访问。当多个用户并发地存取数据时,在数据库中就可能会产生多个事务同时操作同一行数据的情况,若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据的一致性。一种典型的并发问题——丢失更新(其他锁问题及解决方法会在后面说到):执行顺序事务A事务B1开启事务A2开始事务B3查询当前商品S库存为1004查询当前库存为1005业务逻辑处理,增加库存106业务处理增加

2021-10-14 10:56:16 177 1

原创 mySql学习(三)之Innodb事务学习

Innodb事务学习1 事务的实现事务的隔离性是由锁来实现的。原子性、一致性、持久性是通过数据库的redo log和undo log来实现的。redo log称为重做日志,用来保证事务的持久性。undo log用来保证事务的一致性。这里不要认为undo log 是redo log的逆过程,这种理解是不对的。 redo 中记录的是恢复提交事务修改的页的操作,也就说page no ,offset 修改成了啥,而undo回滚行记录到某个特定版本。因此两者记录的内容不同, redo通常是物理日志, 记录的是

2021-10-08 17:23:39 196

原创 海量数据处理学习

海量数据处理学习前言本篇博客学习一下常见的海量数据处理的问题。还记得博主去年面试度娘的时候就考了一道。题目大概的意思就是有一个很大的文件,文件中是一串数字,在有限内存的机器下,怎么将这个很大内存的文件排序。当时说了归并排序,感觉没说到重点。遂来学习学习。如何从大量的 URL 中找出相同的 URL?题目描述给定 a、b 两个文件,各存放 50 亿个 URL,每个 URL 各占 64B,内存限制是 4G。请找出 a、b 两个文件共同的 URL。解答思路1. 分治策略每个 URL 占 64B,那么

2021-07-05 16:26:03 448 3

原创 Kafka学习之消费者

Kafka学习之消费者前言本博客主要介绍up在学习kafka中间件时候觉得需要记录的知识点。内容1、消费者与消费组消费者(Consumer)负责订阅Kafka中的主题(Topic),并且从订阅的主题上拉取消息。与其他一些消息中间件不同的是:在Kafka的消费理念中还有一层消费组(Consumer Group)的概念,每个消费者都有一个对应的消费组。当消息发布到主题后,只会被投递给订阅它的每个消费组中的一个消费者(也就是说订阅了同一个主题的消费组会收到同样的消息,但是同一消费组里面的消费者获取的是不

2021-07-01 16:56:55 454

原创 Kafka学习之生产者

Kafka学习之生产者前言本篇博客记录一下up学习kafka时候对生产者学习的一些知识点。原理分析整体架构分析首先我们来看一下生产者客户端的整体架构,如下图所示:可以看出,整个生产者是通过两种线程协调运行的,分别是主线程和Sender线程。 主线程的作用是创建消息,然后经过拦截器、序列号器和分区器发送到消息累加器。(可以理解为把消息缓存到内存里面了,对于客户端使用者来说,感受的流程就结束了,其余的流程都是kafka自己完成的) Sender线程的作用可以理解为拉取,从消息累加器(RecordA

2021-06-24 14:17:40 240 1

原创 kafka之事务

kafka学习之事务前言为了实现EOS(exactly once semantics,精确一次处理语义)karka从0.11.0.0版本开始引入了幂等性和事务两个特性来支撑。场景最简单的需求是producer发的多条消息组成一个事务这些消息需要对consumer同时可见或者同时不可见 。producer可能会给多个topic,多个partition发消息,这些消息也需要能放在一个事务里面,这就形成了一个典型的分布式事务。kafka的应用场景经常是应用先消费一个topic,然后做处理再发到另一个

2021-06-21 16:30:52 7008 2

原创 TCP三次握手和四次挥手学习

TCP三次握手和四次挥手学习前言近期对TCP协议进行复习,发现很多地方在上学的时候理解不是很深刻,所以再次学习和总结一下。1、三次握手三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP(发送/接受/拥塞/滑动)窗口大小信息。刚开

2021-05-19 17:09:37 110

原创 TCP拥塞机制学习

TCP拥塞机制学习写在前面很早就想总结一下tcp方面的知识了,心动不如行动,这一块面试重点,而其也是coder的必修课。一、TCP头部报文格式了解任何一个协议都要从它的协议报文开始,我们先看一下他的格式和一些基本概念。TCP头部标准长度是20字节。包含源端口,目的端口、序列号、确认号、数据偏移、保留位、控制位、窗口大小、校验和、紧急指针、选项等。1.1 数据偏移(Data Offset)该字段长4位,单位是4字节。表示tcp头部的长度,默认一般是20字节,最大就是1111(二进制)*4字节

2021-05-18 20:35:52 1499

原创 系统设计学习(二)系统怎样做到高可用

系统设计学习(二)系统怎样做到高可用写在前面​ 这篇文章主要分享再系统设计中怎样设计高可用系统,整体偏理论,up也会根据自己的项目来写一些自己如何改造成高可用的列子。​ 高可用性(High Availability, HA)是我们经常听到的名字,无论是再平时的工作还是面试中,都是一个热点词汇,up再面试各种大厂中都会问就是了解系统的高可用嘛? 怎么保证高可用?你做过那些高可用? 这些问题真的是很常见。所以才有了这一系列文章的诞生。言归正传,我们在很多开源组件的文档中都会看到HA的方案,它可以有限性的避

2021-04-21 14:30:02 543

原创 mysql学习之InnoDB(二)

mysql学习之InnoDB(二)写在前面本篇博客主要记录一下innoDB存储引擎中比较常见和重要得文件学习。这些文件主要是分为以下几类:参数文件:告诉MySQL实例启动时在哪里可以找到数据库文件,并 且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置, 还会介绍各种参数的类型。日志文件:用来记录MySQL实例对某种条件做出响应时写入的文 件,如错误日志文件、二进制日志文件、慢查询日志文件、查询日志文 件等。socket文件:当用UNIX域套接字方式进行连接时需要的文件。

2021-04-20 17:13:57 640

原创 mysql学习之InnoDB

mysql学习之InnoDB(一)写在前面InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,并且实现 了SQL标准的4种隔离级别,默认为REPEATABLE级别。同时,使用一 种被称为next-key locking的策略来避免幻读(phantom)现象的产生。 除此之外,InnoDB储存引擎还提供了插入缓冲(insert buffer)、二次写 (double write)、自适应哈希索引(adaptive hash index)、**预读(read ahead)**等高性能和高可用的功能

2021-04-12 11:04:34 303

原创 系统设计学习(一) 如何提升系统性能?

系统设计学习(一) 如何提升系统性能?一、前言性能反应了系统的使用体验,两个系统QPS都是1w,如果第一个响应是毫秒级别,第二个响应是秒级别,它们带给用户的体验肯定是不同的。二、性能优化原则想实现一个功能,就要了解这个功能的原则。**首先,性能优化一定不能盲目,一定是问题导向的。**脱离了问题,盲目地提早优化会增加系统的复杂度,浪费开发人员的时间,并且也因为某些优化可能对业务上有些折中的考虑,所以也会损伤业务。**其次,性能优化也遵循“八二原则”,**即你可以用20%的精力解决80%的性能问题。

2021-03-20 16:06:13 1607

原创 线程数确定

线程数确定前言这篇文章主要介绍系统中线程数量怎么确定解决方案根据线程计算时间和等待时间Ncpu : 服务器cpu核心数量Ucpu: 服务器cpu的利用率W: 线程的等待时间(IO操作)C: 线程的计算时间Nthread : 系统理想化线程数量Nthread = Ncpu * Ucpu * (1+W/C);常规方案2*Ncpu 我觉得这里是认为线程等待时间等于线程计算时间TPS方案tps(transcationsPerSecond):也就是事务数/秒。它是软件测试结果的测量单位。一

2021-02-20 22:37:46 402

原创 IO学习

IO学习之IO模型前言五种IO模型包括:阻塞IO、非阻塞IO、信号驱动IO、IO多路转接、异步IO。其中,前四个被称为同步IO。一 、阻塞IO由名字可以得知,该io操作是阻塞的。阻塞这个概念我们在锁的时候接触过,当一个线程获取不到锁的时候就会阻塞。IO一样,当前线程去申请一个阻塞IO,这个是会阻塞该线程,直达请求数据拿到。下面详细说一下流程,一个线程调用高级语言 file获取文件接口(fd:文件描述符)–》系统IO接口–》驱动—》中断–》CPU–》磁盘。 在调用系统接口时,由于我们是用户空间调用

2021-02-20 22:36:52 282

原创 微服务学习之Consul与Feign

微服务学习之Consul&&Feign1、ConsulCAP原理:​ Consistency(一致性) :​ Availability(可用性):​ Partition Tolerance(分区容错):Eureka : 保证 AP Consul:则是 CP1、各个注册中心的比较FeatureeuerkaConsulzookeeperetcd服务健康检查可配支持服务状态,内存,硬盘等(弱)长连接,keepalive连接心跳多数据中

2021-02-08 11:17:12 1887

原创 Springboot学习(五)WEB

Spring Boot学习(五)Web1、SpringBoot对静态资源的映射规则;@ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false)public class ResourceProperties {//可以设置和静态资源有关的参数, 缓存时间@Override public void addResourceHandlers(ResourceHandlerRegistry reg

2021-02-08 11:09:11 158

原创 spring学习之aop

spring学习之Aop一:AOP@EanbleAspectJAutoProxy被代理类@Service("calculate")public class CalculateImpl implements Calculate { @Override public int add(int numA, int numB) { System.out.println("执行目标方法:add"); return numA + numB; }

2021-02-08 11:04:14 128

原创 Spring学习之ContextRefreshr

Spring学习之ContextRefresher前言工作中,遇到了可以监听通知不需要重启容器就可以自动更改Spring 中配置的方法,看了源码发现是利用了ContextRefresher。之前研究微服务的时候了解过全局配置,当时是主动触发/refresh接口实现的,其实原理都是一样,都是通过ContextRefresher,只是触发的方式不同罢了,这篇文章主要研究一下其源码和流程。@RefreshScope首先了解这个注解,只有这个注解标注的类才具有刷新功能。spring 的是scopeSco

2021-02-08 11:00:21 3212

原创 spring之bean的生命周期相关

Spring 之bean的生命周期1、什么是循环依赖? 所谓循环依赖就是对象A依赖对象B,对象B又依赖对象A。通过<property>注入的方式可以解决。但是如果是通过构造器方式注入循环依赖的bean就不可以,因为是在实例化A之前去解析循环依赖的B2、容器getBean()流程@Autowired ApplicationContext act; @Test void contextLoads() { Object helloService = act.getBean("he

2021-02-08 10:59:15 102

原创 spring之beanFactory

Spring学习之BeanFactory学习契机:在学习工厂模式的时候想到了它,本人觉得设计模式的学习结合Spring 一起是一种很棒方式,可以快速的理解该模式的意义和使用场景,也可以加深对Spring的理解。1、工厂模式是一种创造型的模式,也就是我们业务需要创建一个对象时候可以考虑用到的模式。应用场景:以往的创造对象我们直接new()一个对象,这种模式简单,但是对客户端暴露了对象的结构,另外对象与客户端的耦合性很高(也就是说我们如果new()对象的结构发生了改变,我们需要修改客户端的代码)。再想想

2021-02-08 10:55:10 357

原创 spring之ApplicationContext

Spring学习之ApplicationContext学习spring-context包spring boot 中,默认使用GenericWebApplicationContext实现类。我们先看一下ApplicationContext的体系结构我们已GenericApplicationContext为最外层的实现类形成了上图,可以看到ApplicationContext接口位于中间位置,它也是我们容器的最顶层接口。先从它入手。1 ApplicationContext接口public inte

2021-02-08 10:52:10 555 1

原创 LockSupport学习

LockSupport写在前面up在最近研究AQS源码时候发现,其最终使线程阻塞和唤醒的方法是利用了LockSupport.park/unpark方法,up之前还未接触过,所以些这篇文章来研究一下这两个api。源码分析我们先看一下LockSupport的park()方法:/*LockSupport.park*/ public static void park() { UNSAFE.park(false, 0L); }这个方法的作用阻碍当前线程获取cpu时钟(

2021-02-08 10:47:13 153

原创 多线程衍生过程

多线程衍生过程一、多线程基础1、进程与线程的概念1.1 进程产生的背景最初的计算机只能接受一些特定的指令,用户每输入一个指令,计算机就做出一个操作。当用户在思考或者输入时,计算机就在等待。这样效率非常低下,在很多时候,计算机都处在等待状态。批处理操作系统后来有了批处理操作系统,把一系列需要操作的指令写下来,形成一个清单,一次性交给计算机。用户将多个需要执行的程序写在磁带上,然后交由计算机去读取并逐个执行这些程序,并将输出结果写在另一个磁带上。批处理操作系统在一定程度上提高了计算机的效率,但是由

2021-02-08 10:05:17 224

原创 ReentrantLock到AQS

ReentrantLock到AQS写在前面上一篇讲了Synchronized的原理,这篇讲一下另一个锁ReentrantLock和它的基石AQS。Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过ReentrantLock的基本特性和ReentrantLock与AQS

2021-02-07 18:59:30 183

原创 Synchronized原理

Synchronized原理前言本文针对java互斥锁synchronized关键字的底层原理进行描述。为什么需要锁?锁存在于并发的场景,并发场景存在什么问题? 前提是并发场景存在一个多线程争夺的资源,该资源可以同时被多个线程获取到,但是这样会产生问题。比如 这个资源是一个数字1,现在多个线程的任务都是将这个数字累加。A线程先拿到数字1,这时候累加未结束,B线程又去拿到了A,那么B运行之后数字不是3而是2。这就产生了问题。那么怎么解决? 一 让这个数字的变化再所以线程中共享,也就是可见性,二、保证

2021-02-03 20:44:58 191

原创 G1 垃圾回收器学习

G1 垃圾回收器学习写在前面在近期的项目中,遇到过oom的问题。就去服务器查看原因,发现linux环境下的大多数jDK都是openJDK11的版本,而其默认的垃圾回收器是G1,和之前熟悉的CMS等早期版本垃圾回收器还是有很多不同,所以才有了这篇博客。常见术语并行(parallelism) ,指两个或者多个事件在同一时刻发生,也可以理解为必须是拥有多核处理器的计算机上才会发生并行。并发(concurrency), 指两个或者多个事件在同一时间间隔内发生,也可以理解为一个处理器的计算机分配时间

2021-02-01 13:54:13 1114

原创 高级数据结构-字典树、并查集和字段树

高级数据结构Trie树(字典树)定义trie树,又称字典树或者前缀树,是一种有序的、用于统计、排序和存储字符串的数据结构,它与二叉查找树不同,关键字不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。tried树的最大有点就是利用字符串的公共前缀来减少存储空间与查询时间,从而最大限度地减少无所谓的字符串比较,是非常高效的字符串查

2021-01-11 19:59:56 371 2

原创 轻松搞定动态规划算法题

动态规划写在前面本人对动态规划的理解是我们知道初始值的一些状态,去求未来的值。而初始值到未来值的变化是有统一的公式的,类似于数学归纳法。这里说一下,说懒了的dp要点;原问题到自问题的拆分,怎么把原问题拆分成自问题。初始状态,边界状态,我们要根据它来递推到我们最终状态状态转移方程,关键退出状态,结果状态。也就是你状态转移方程的退出条件。LeetCode 70 爬楼梯记得这道题是up校招的时候猫眼电影的二面面试问我的,那时候up没刷过题,给出了一个n方的方式。记忆满深刻的。但是代码没写出来

2021-01-04 14:53:33 156

原创 搜索算法

搜索算法写在前面搜索算法总的来讲就是宽搜和广搜,这篇文章主要来和大家一起做一下leedcode中涉及到深搜和宽搜的题目。这里以二叉树为列讲一下基础架构的伪代码逻辑,对我们做其它延伸类题目很有帮助。基础深搜伪代码public void dfs(Tree node){ //递归退出条件 if(node == null){ return; } //递归遍历分支节点 dfs(node.left); dfs(node.right);}基础宽搜伪代码pulic bfs(Tr

2020-12-17 16:59:39 222

原创 哈希表和字符串

哈希表和字符串经典算法算法准备数据结构复习HashTable线程安全,操作函数使用synchronized关键字修饰,保证线程安全;初始默认容量 11,拓展因子 0.75;最大值,为Integer.MAX_VALUE - 8;扩容为oldsize<<1 +1;根据key获取index的方式是:(hash&0x7FFFFFFF)%tab.length;put(key,value),value不允许为空,key也不允许(key.hashcode会抛出异常);为什么key

2020-12-07 16:17:42 309

原创 最全面解析的线程池的实现原理

线程池的实现原理以及业务中的实践一个体面人的技术之旅。一 、写在前面1.1 线程池是什么?线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。线程过多会带来额外的开销,其中包括创建销毁线程的开销(java线程对应操作系统的线程,创建线程需要切换用户状态,和占用内存等资源,而其大部分操作系统都会限制系统中的最大线程数量)、调度线程的开销(涉及到线程挂起和恢复,挂起需要记录线程状态)等等,同时也降低了计算机的整体性能。*用户态和内核态切换的代价*

2020-11-30 13:56:10 1503

原创 二分查找和二叉排序树

二分查找和二叉排序树预备知识1 二分查找算法前提: 要有顺序逻辑(默认升序):将中间位置的关键字与查询关键字比较:如果两者相等,则查找成功。否则利用中间位置将表分成前、后两个子表:如果中间位置的的关键字大于查找关键字,则进一步查找前一子表否则进一步查找后一字表重复以上过程,直到找到满足条件的记录,则查询成功,或这直到子表不存在为止,此时查找不成功。//递归public static boolean binary_search(int[] val,int begin,int

2020-11-27 15:57:31 2001

原创

图1 定义图是由n个顶点和x条边组成的图像。List<List<Integer>> nodeAndEdges = new ArrayList<List<Integer>>();java 可以用嵌套list来表述,外层list的序号表示顶点,它关联的内存list表示到其它顶点的边;eg: <0,<1,2,3>>顶点0,和顶点1、2、3相链接。ps:这里图的表示方法采用的邻接表,还存在邻接矩阵、星型图。2 遍历方式2.1

2020-11-16 17:15:18 94

原创 二叉树

二叉树算法总结二叉树的遍历方式 ##基础数据结构 class TreeNode{ int val; TreeNode left; TreeNode right; public TreeNode(int val){ this.val = val; this.left = null; this.right = null; } publ

2020-11-16 15:47:34 118

原创 Jstat -gc 参数说明

Jstat -gc 参数说明Jstat -gc 参数说明Jstat -gc 参数说明S0C:第一个幸存区的大小S1C:第二个幸存区的大小S0U:第一个幸存区的使用大小S1U:第二个幸存区的使用大小EC:伊甸园区的大小EU:伊甸园区的使用大小OC:老年代大小OU:老年代使用大小MC:方法区大小MU:方法区使用大小CCSC:压缩类空间大小CCSU:压缩类空间使用大小YGC:年轻代垃圾回收次数YGCT:年轻代垃圾回收消耗时间FGC:老年代垃圾回收次数FGCT:老年代垃圾回收消耗时

2020-10-14 13:54:46 10123

原创 Redis学习(一)Redis的诞生和其IO多路复用的概念

Redis学习(一)Redis的诞生和其IO多路复用的概念一个体面人的学习之旅Redis的诞生一项技术或者产品的诞生是为了解决一系列问题,本体面人学习任何技术之前都会问自己:它为什么会出现,它解决了什么问题?创造者:antirez诞生契机:话说antirez他创建了一个网站LLOOGG.com,该网站是记录访客浏览网站记录的。它会记录访客最新的5条,IP地址、所属的国家、阅览信息、访问网...

2020-04-17 15:53:17 245

原创 LeetCode(25)K个一组反转链表

LeetCode(25)K个一组反转链表一个体面人的刷题之旅题目描述给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。题目分析首先,这是一道链表反转题目,我们要对操作动作和数据结构的关联敏感,一看到翻转,就想到先进后出啊,这样就顺序反转了不嘛!一提到先进后出...

2020-04-16 21:07:10 169

原创 简单易懂的Spring Bean生命周期

总结:四个阶段,实例化,属性赋值,初始化,摧毁。为了更好的描述,写出下面伪代码;class Person{@Autowriteprivate Eye eye}实例化:like Person p = new PerSon(); 相当于在内存的一块空间创建了对象,就是堆里面创建一个对象。spring 源码里面是一个BeanWrapper.属性赋值:就是将上面的Ey...

2020-04-10 10:55:59 200

空空如也

空空如也

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

TA关注的人

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