自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 Redis吊打面试官系列-数据结构-5大对象对应数据结构

字符串整数值embstr编码的简单动态字符串简单动态字符串列表压缩列表双向链表哈希压缩列表字典集合整数集合字典有序集合压缩列表跳跃表和字典

2020-09-28 20:38:54 119 1

原创 操作系统面试题

select和epoll的区别?epoll两种触发方式?操作系统的进程调度算法?页面调度算法?Linux的零拷贝了解吗?系统中堆和栈的区别什么是僵尸进程?什么是孤儿进程?进程通信方式?用过哪种?...

2020-09-28 19:23:41 687

原创 计算机网络面试题

tcp为什么四次挥手?为什么三次握手?CLOSED_WAIT出现在主动端还是被动端?大量CLOSED_WAIT会是什么原因?由图可知道CLOSE_WAIT出现在服务端,如果大量客户端主动发送FIN信号断开连接,那么服务端就会出现大量的CLOSE_WAIT状态拆包和粘包问题怎么解决?出现拆包和粘包问题是TCP协议本身导致的,因为TCP是面向字节流传输的,TCP对于每一个Socket连接会维护一个发送缓存和接收缓存,应用层通过write系统调用写字节数组到发送缓存,发送缓存其实也是一个字节数组,传.

2020-09-28 19:19:41 93

原创 Redis吊打面试官系列-数据结构-原理-list

前言:本文是Redis吊打面试官系列的数据结构原理专题,介绍列表list的底层实现前提认识:Redis的list底层是双向链表1、链表节点结构2、list结构3、总体结构总结:链表被广泛用于实现Redis的各种功能,比如列表键、发布订阅、慢查询、监视器等。通过为链表设置不太的类型特定函数,Redis的链表可以用于保存各种不太类型的值...

2020-09-28 11:32:16 121

原创 Netty-监听读写事件

前言:监听读写事件是对于NioSocketChannel来说的,而NioSocketChannel和NioServerSocketChannel都对应NioEventLoop1、看NioEventLoop线程的loop方法,NioEventLoop的run()方法2、3、4、5、6、最后:6就是NioSocketChannel每次监听读事件的地方,随后会调用响应的pipeline。...

2020-09-26 21:25:47 710

原创 Netty-监听新连接接入

1、NioServerSocketChannel所在EventLoop线程Loop是NioEventLoop的run()方法2、3、4、5、6、7、8、最后:注册过程和NioServerSocketChannel的相同,区别是NioSocketChannel的第一次注册会开启一个EventLoop线程,之后的不开启。...

2020-09-26 20:23:15 776

原创 Redis持久化-AOF文件重写

1、客户端输入BGREWRITEAOF命令,Redis会创建一个子进程进行AOF文件的重写,并创建AOF重写缓冲区,这样子进程重写AOF文件,父进程可以继续接受客户端的命令请求,当子进程重写AOF文件完毕后,会通知父进程讲AOF重写缓冲区的内容追加到到重写之后的AOF文件中,追加过程是阻塞的,不接受客户端的命令请求。2、子进程重写AOF文件期间,父进程忽略客户端的BGREWRITEAOF命令,所有客户端的写操作会正常进行,写操作会被记录到AOF缓冲区和AOF重写缓冲区。3、每次事件循环后,AOF缓冲区的

2020-09-26 17:04:08 938

原创 Netty-服务端启动流程-文字

newChannel初始化jdk底层的ServerSocketChannel,并封装到Netty的Channel上initChannel初始化1的Channel,主要是设置id,unsafe,channelPipelineregisterChannnel注册channel到jdk底层的Selector,并开启所在的EventLoop线程4、doBind对channel底层的socket完成端口绑定,并添加感兴趣的事件Accept...

2020-09-25 20:40:02 83

原创 Netty-Channel注册到Selector

1、2、3、4、5、6、7、到此真相大白

2020-09-25 19:39:46 315

原创 Netty-吐槽代码-注册channel

这段代码是初始化并注册NioServerSocketChannel,其中红色部分是实现注册的代码,功能是注册channel到parentGroup中,因为此方法属于AbstractBootstrap,而parentGroup就在本类中而parentGroup已经在ServerBootstrap.group(EventLoopGroup parentGroup, EventLoopGroup childGroup)进行了初始化,为什么不直接获取呢?至少现在我看来是一段垃圾代码吧。有知道的小伙伴留言一下.

2020-09-25 16:30:45 428

原创 Netty-parentGroup线程启动时刻

前言:其实掌握Netty的源码不难,关键是掌握几个点,本文介绍其中一个,parentGroup线程在哪启动?流程1:AbstractChannel.register(EventLoop eventLoop, final ChannelPromise promise)方法流程2:SingleThreadEventExecutor.execute(Runnable task)方法流程3:SingleThreadEventExecutor.startThread()方法流程4:SingleThrea

2020-09-25 10:57:40 505 1

原创 Netty-Reactor线程接入原理

原理一个EventLoopGroup是一个Reacctor线程池,负责调度和执行客户端接入、网络读写事件处理、用户自定义任务、定时任务parentGroup负责客户端的接入childGroup负责上面其余的三个parentGroup一般只有一个线程,创建NioServerSocketChannel后创建NioServerSocketChannel的ChannelPipeline,ChannelPipeline包括一系列的ChannelHandler,因为是单线程处理parentGroup的Sel.

2020-09-24 11:05:06 150

原创 TCP参数-backlog

2020-09-23 21:55:44 167

原创 Netty-实现RPC

Netty实现RPC简直不要那么简单,只需要用户实现相应的序列化、反序列化和tcp拆包粘包问题就行步骤:定义服务接口和实现服务接口定义RPC请求实体和响应实体选择序列化框架定义通信协议,解决tcp拆包粘包问题定义RPC服务端和RPC客户端,Netty实现步骤1:服务接口public interface CalculatorService { double add(double op1, double op2); double substract(double o

2020-09-22 20:07:32 248

原创 面向对象设计

面向对象的基本要素:封装、继承、多态。封装的目的是隐藏事务内部的实现细节,以便提高安全性和简化编程。封装提供了合理的边界,避免外部调用者接触到内部的细节。我们在日常开发中,因为无意间暴露了细节导致的难缠 bug 太多了,比如在多线程环境暴露内部状态,导致的并发修改问题。从另外一个角度看,封装这种隐藏,也提供了简化的界面,避免太多无意义的细节浪费调用者的精力。继承是代码复用的基础机制,类似于我们对于马、白马、黑马的归纳总结。但要注意,继承可以看作是非常紧耦合的一种关系,父类代码修改,子类行为也会变动。在实

2020-09-22 11:14:55 1627

原创 谈谈你知道的设计模式?

设计模式是人们为软件开发中相同表征的问题,抽象出的可重复利用的解决方案。在某种程度上,设计模式已经代表了一些特定情况的最佳实践,同时也起到了软件工程师之间沟通的“行话”的作用。理解和掌握典型的设计模式,有利于我们提高沟通、设计的效率和质量。大致按照模式的应用目标分类,设计模式可以分为创建型模式、结构型模式和行为型模式。创建型模式,是对对象创建过程的各种问题和解决方案的总结,包括各种工厂模式(Factory、Abstract Factory)、单例模式(Singleton)、构建器模式(Builder)

2020-09-22 10:32:02 106

原创 计算机字节存储顺序-Big-Endian和Little-Endian

如果数据需要用多个字节来存储就要考虑用大端存储还是小端存储,注意这里指字节的存储顺序而不是位的存储顺序,位的存储顺序是固定的,直接取出来就行,即问题是多个字节的数据的高字节放在地址低位还是高位的问题,放在低位的是大端存储,放在高位的是小端存储...

2020-09-20 20:20:31 350

原创 AOP概念

AOP-面向切面编程切面包括Advice和PointcutSpring Aop属于方法级别的Aop,即在方法执行前、方法执行后、方法抛出异常执行切面代码AOP两个关注点核心关注点横切关注点Advice指通知,前置通知、后置通知、异常通知这些,也称为横切关注点Pointcut指在哪些方法加入横切关注点,侧重是哪些方法,定义核心关注点的范围JoinPoint是符合Pointcut定义的核心关注点范围中的一个,在Spring Aop指某个具体的方法切面包括Advice和Pointcut,即切

2020-09-20 11:46:22 144

原创 分布式-分布式事务

分布式事务数据库层面的分布式事务业务层面的分布式事务数据库层面的分布式事务指一个客户端调用多台不同的数据库,这些数据库是独立部署的下的分布式事务,这里强调是一个客户端,比如一个客户端调用A机器的Oracle数据库,也调用B机器的MYSQL数据库。业务层面的分布式事务指微服务下的分布式事务,比如API网关会调用会调用多个后端的服务,然后聚合数据返回给客户端。比如API网关调用A服务和B服务,A服务调用远程机器A1的Oracle数据库,B服务调用远程机器B1的MYSQL数据库,这时候数据库层面的分布

2020-09-18 20:20:20 118

原创 Class类文件的结构

Class文件是二进制文件,可以用javap -v翻译成字节码。Class文件的每个数据项占用1或多个字节,如果占用多个字节则高位在前。Class文件数据类型包括无符号数和表。无符号数属于基本的数据类型,可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成的字符串值。表是由多个无符号数或者其他表作为数据项构成的符合数据类型,以"_info"结尾。Class文件的结构魔数与Class文件的版本常量池访问标志类索引、父类索引与接口索引集合字段表集合方法表集合属性表集合Code

2020-09-18 15:51:53 82

原创 微服务

配置中心高效获取实时感知分布式访问zookeeper配置中心通过内存访问实现高效获取配置信息,通过zookeeper的节点监听机制实现实时感知。数据分类:API网关API Gateway 是一个服务器,也可以说是进入系统的唯一节点。这跟面向对象设计模式中的Facade 模式很像。 API Gateway 封装内部系统的架构,并且提供 API 给各个客户端。它还可能有其他功能,如授权、监控、负载均衡、缓存、请求分片和管理、静态响应处理等。请求转发响应合并协议转换数据转换安全认证

2020-09-15 11:10:09 144

原创 IO模型

UNIX系统下的I/O模型有5种:同步阻塞I/O、同步非阻塞I/O、I/O多路复用、信号驱动I/O和异步I/O。什么是I/O?为什么需要这些I/O模型?所谓的I/O就是计算机内存与外部设备之间拷贝数据的过程I/O就是计算机内存与外部设备之间拷贝数据的过程。我们知道CPU访问内存的速度远远高于外部设备,因此CPU是先把外部设备的数据读到内存里,然后再进行处理。请考虑一下这个场景,当你的程序通过CPU向外部设备发出一个读指令时,数据从外部设备拷贝到内存往往需要一段时间,这个时候CPU没事干了,你的程序是主

2020-09-15 09:37:58 92

原创 SpringBoot广告

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式, Spring Boot 致力于在蓬勃发展的快速应用开发领域(rapid applicationdevelopment)成为领导者。 其特点如下:创建独立的 Spring 应用程序嵌入的 Tomcat,无需部署 WAR 文件简化 Maven 配置自动配置 Spring提供生

2020-09-14 17:20:01 2289

原创 MYSQL-InnoDB-索引

InnoDB存储引擎支持以下索引:B+树索引全文索引哈希索引InnoDB存储引擎支持的哈希索引是自适应的,即会根据表的使用情况自动为表生成哈希索引,不能认为干预是否在一张表中生成哈希索引B+树类似于二叉树,根据键值快速找到数据,B+树的B不是指二叉(binary),而是代表平衡(balance),因为B+树由平衡二叉树演化来。B+树索引不能根据一个给定的键值找到具体的行,而是先找到数据行所在的页,然后把页读到内存,再再内存中进行二分查找,找到需要的行数据。InnoDB中每页Page Dire

2020-09-13 21:21:31 193

原创 MYSQL-InnoDB-表

索引组织表InnoDB逻辑存储结构索引组织表InnoDB逻辑存储结构关于InnoDB的表的逻辑存储结构是表空间、段、区、页(块),如图:表空间段常见的段有数据段(B+树的叶子节点)、索引段(B+树的非叶子节点)、回滚段区页...

2020-09-12 22:06:05 68

原创 MYSQL-InnoDB-重做日志

每个InnoDB存储引擎至少有一个重做日志文件组,每个文件组下至少有2个重做日志文件,如默认的ib_logfile0和ib_logfile1。可以设置多个重做日志文件组来提高重做日志的高可用性。每个重做日志文件组的重做日志文件大小一致,并以循环写入的方式进行,如图:与二进制日志吧区别重做日志结构重做日志写入过程:先写重做日志缓冲redo log buffer,以512字节(扇区大小)写入磁盘,如图:重做日志缓冲写入磁盘的条件主线程每秒将重做日志缓冲写入到重做日志文件,不论事务是否提交

2020-09-12 14:46:46 159

原创 MYSQL-InnoDB-表空间

InnoDB通过表空间文件存储数据,所有基于InnoDB存储引擎的表的数据都会存储到共享表空间中innodb_data_file_pathinnodb_file_per_table设置每个基于InnoDB存储引擎的表产生一个独立的表空间,后缀是ibd。独立的表空间存储各自表的数据、索引和插入缓冲BITMAP等信息,其余信息还是存储在共享表空间中。...

2020-09-12 14:21:01 105

原创 MYSQL-InnoDB-锁

InnoDB支持表锁和行锁行锁共享锁S排它锁X表锁表意向共享锁IS表意向排它锁IX锁的兼容性意向锁的作用有了行锁为什么还要表锁?因为一个事务可能要同时操作几行数据,意向锁的作用正是表示希望获取表某几行的锁。而且意向锁是粗粒度的锁,获取锁的效率高。...

2020-09-11 17:45:30 57

原创 Tomcat性能优化-1-监控指标

Tomcat的关键指标有吞吐量、响应时间、错误数、线程池、CPU以及JVM内存吞吐量、响应时间、错误数、线程池、CPU以及JVM内存。那如何监控这些指标呢?Tomcat可以通过JMX将上述指标暴露出来的。JMX(Java ManagementExtensions,即Java管理扩展)是一个为应用程序、设备、系统等植入监控管理功能的框架。JMX使用管理MBean来监控业务资源,这些MBean在JMX MBean服务器上注册,代表JVM中运行的应用程序或服务。每个MBean都有一个属性列表。JMX客户端可以连

2020-09-10 20:18:16 948 1

原创 RPC-TCP连接断开

RPC 是建立在 TCP 协议基础上进行消息传递,而 TCP 连接并不总是稳定的,它会受到网络波动的影响而导致连接断开。同时大部分服务器也会限制****空闲连接的生存期,如果一个 TCP 连接闲置过久,也会被服务器主动关闭。如果这个 RPC 是以手机作为客户端发起的请求,那么这种连接断开的情况就更为频繁,用户的网络切换行为随时都会引发连接断开。这里的客户端异常断开情况很多,比如从流量上网成Wifi上网,因为网卡不同,所以需要重连。因此面对客户端异常复杂的环境,服务端一般都要限制空闲连接过长。...

2020-09-09 23:42:10 843

原创 RPC-消息压缩

消息压缩如果消息的内容太大,就要考虑对消息进行压缩处理,这可以减轻网络带宽压力。但是这同时也会加重 CPU 的负担,因为压缩算法是 CPU 计算密集型操作,会导致操作系统的负载加重。所以,最终是否进行消息压缩,一定要根据业务情况加以权衡。如果确定压缩,那么在选择压缩算法包时,务必挑选那些底层用 C 语言实现的算法库,因为 Python 的字节码执行起来太慢了。比较流行的消息压缩算法有 Google 的 snappy 算法,它的运行性能非常好,压缩比例虽然不是最优的,但是离最优的差距已经不是很大。阿里的

2020-09-09 22:51:52 808 1

原创 Java线程状态

通用的线程生命周期初始状态,指的是线程已经被创建,但是还不允许分配 CPU 执行。这个状态属于编程语言特有的,不过这里所谓的被创建,仅仅是在编程语言层面被创建,而在操作系统层面,真正的线程还没有创建。可运行状态,指的是线程可以分配 CPU 执行。在这种状态下,真正的操作系统线程已经被成功创建了,所以可以分配 CPU 执行。当有空闲的 CPU 时,操作系统会将其分配给一个处于可运行状态的线程,被分配到 CPU 的线程的状态就转换成了运行状态。运行状态的线程如果调用一个阻塞的 API(例如以阻塞方式

2020-09-04 16:29:12 99

原创 CompletableFuture非常用方法

public boolean complete(T value)public boolean completeExceptionally(Throwable ex)completedFuture(U value)exceptionally(Function<Throwable,? extends T> fn)getNow(T valueIfAbsent)getNumberOfDependents()obtrudeException(Throwable ex)obtrudeValue

2020-09-01 16:02:35 309

go语言编写的兼容redis协议的kv存储

go语言编写的兼容redis协议的kv存储

2022-12-04

空空如也

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

TA关注的人

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