刘亚洲_社区达人页

个人头像照片
刘亚洲
已加入开发者社区1399
勋章 更多
个人头像照片
专家博主
专家博主
个人头像照片
星级博主
星级博主
个人头像照片
技术博主
技术博主
个人头像照片
江湖新秀
江湖新秀
成就
已发布75篇文章
1条评论
已回答0个问题
0条评论
已发布0个视频
github地址
技术能力
兴趣领域
擅长领域
技术认证

暂时未有相关云产品技术能力~

java工程师
暂无精选文章

2023年03月

  • 03.24 10:52:25
    发表了文章 2023-03-24 10:52:25

    Mysql文件

    Mysql文件包括:参数文件、日志文件、socket文件、pid文件、mysql表结构文件、存储引擎文件、参数文件、日志文件,通过了解mysql的文件相关组成,我们可以知道mysql的组成。
  • 03.24 10:46:07
    发表了文章 2023-03-24 10:46:07

    神奇的魔数i

    接触复数是在高中的时候,那个时候不知道为啥要学习复数,而在大学依然在工程数学中依然能看到需要学习复变函数,那个时候是因为物探、测井的专业课需要用到数学物理方程,迷迷糊糊的看了,学习了一下。但是现在想想,确实挺有用的,因为数字信号分析与处理、地震波动力学、地震资料处理、测井都需要它。现在想想物探测井方向挺有趣的,但需要有深厚的数学功底。地球科学是一门很大的学问。言归正传,我们来了解欧拉公式和魔数i。
  • 03.24 10:44:34
    发表了文章 2023-03-24 10:44:34

    Innodb体系架构学习整理

    InnoDB存储引擎最早由Innobase Oy公司开发,被包括在mysql数据库所有的二进制发行版本中,从mysql5.5版本开始默认的表存储引擎。其中Heikki Tuuri是InnoDB存储引擎的创始人。 InnoDB架构体系包含后台线程、内存、checkpoint技术,其中后台线程包含主线程、io处理线程、回收分配undo线程、页清理线程;内存包括缓冲池、重做日志缓冲、额外缓冲池;checkpoint技术包含 Sharp Checkpoint、FuzzyCheckpoint,数据库运行时,通常会和FuzzyCheckpoint打交道,通常会根据检查点age来处理

2023年02月

  • 02.20 10:57:55
    发表了文章 2023-02-20 10:57:55

    CompletableFuture学习整理

    整理的原因是在Sentinel源码中,我们可以看到很多关于CompletableFuture的thenCompose的源码。同时在业务系统里面也看到别人写过类似的代码。因此整理了一下关于CompletableFuture使用的相关类型和特性,在处理复杂耗时业务时可以选择组合使用。
  • 02.20 10:55:40
    发表了文章 2023-02-20 10:55:40

    Sentinel学习二

    如果我们不对Sentinel的异常提示做自定义,那么此时的提示是非常不详细的。如果做了自定义,就可以看到下面自定义的提示。sentinel提供了@SentinelResource注解帮助我们来实现自定义的熔断限流后的自定义方法处理,可以根据sentinel的aop可以看到处理的example,从而更为清晰的认识sentinel强大的功能。
  • 02.09 13:53:05
    发表了文章 2023-02-09 13:53:05

    RocketMQ-Spring学习

    们可以它的一系列动作操作,会首先将相关配置MessageConverterConfiguration、ListenerContainerConfiguration、ExtProducerResetConfiguration、ExtConsumerResetConfiguration、RocketMQTransactionConfiguration、RocketMQListenerConfiguration进行导入。在自动注入前处理事务配置RocketMQTransactionConfiguration,在自动注入后处理消息转换器配置MessageConverterConfiguration。
  • 02.02 21:31:03
    发表了文章 2023-02-02 21:31:03

    Sentinel的SPI和责任链模式学习

    通常spi可以配合责任链模式、策略模式使用。此时spi,类似于一个上下文的过程,拿到所有的实现class。 与之类似的还有:SpringUtil.getBeans或者ApplicationContext.getBeansOfType。在一些固定的场景下,处理业务的流程过程通常比较明确,第一步做什么,第二步做什么,第三步做什么的时候,这个时候就可以使用责任链模式在处理。也即存在固定的模式的时候,就可以使用。同时在Netty、Sentinel中有重要使用场景,其过程是一个pipeline流水线的过程。

2023年01月

  • 01.31 17:32:45
    发表了文章 2023-01-31 17:32:45

    xxl-sso单点登录

    ### 一、如何实现一个简单的认证中心? ​ 我们知道单点登录系统:出名的有[apereo](https://github.com/apereo)的cas和OAuth2、JWT等。通常认证有两个方案: ​ 一个方案是基于token,另一个方案是基于cookie的。基于xxl-sso,我们可以学习到实现的基本是基于过滤器的增强,从而实现重定向。我之前的公司使用的是基于[apereo](https://github.com/apereo)的cas进行的二次开发配合统一授权系统使用。cas的单点登录的登录涉及到三个概念:
  • 01.31 17:27:41
    发表了文章 2023-01-31 17:27:41

    xxl-conf配置中心

    ### 一、实现一个轻量级简单的配置中心,同时不考虑使用zk? 1.由于我们使用的配置中心需要兼容多套环境,因此需要多环境 2.需要有权限控制 3.需要对配置的信息,能够实时响应 4.如果配置信息存储在数据库,为了减轻数据库的压力,可以进行持久化到磁盘文件中 当时这里会有一个问题需要考虑,如果持久化到磁盘,需要考虑如果配置发生了改变,需要能够实时同步到磁盘文件中,因此此时需要考虑一个线程进行实时同步。 5.对应配置信息发生增、删、改,能够实时更新和修改

2022年12月

  • 12.14 03:38:30
    发表了文章 2022-12-14 03:38:30

    Mysql事务实现原理

    1)BinLog是Mysql本身就有的,不管使用哪种引擎,都会存在BinLog,而Redo Log是InnoDB引擎特有的。 2)BinLog是一种逻辑日志,记录的是对数据库的所有修改操作,而RedoLog是一种物理日志,记录的是每个数据页的修改。 3)BinLog具有幂等性,而Redo Log不具有幂等性。 4)BinLog开启事务时,会将每次提交的事务一次性写入内存缓冲区,如果未开启事务,则每次成功执行插入、更新和删除语句时,就会将对应的事务信息写入内存缓冲区修改数据,而Redo Log是在数据准备之前将数据写入缓冲区的Redo Log中,然后在缓冲区中修改数据。而且在提交事务时,先将Re
  • 12.14 03:37:26
    发表了文章 2022-12-14 03:37:26

    pmq再学习三

    前面我们已经了解了在做好基础数据的准备工作后,启动测试的时候,会做一个注册消费组的工作,完成后,我们就可以执行生产者发消息操作了。发消息的操作是:发送消息完成后,由于其采用的拉模式,我们可以看到消息在经过发送,存储到数据库之后,会做一个通知拉取数据操作,然后执行拉取。拉取完成后,进行响应。此时会进行消费操作,而这个过程的处理关键是handleData操作,从代码中,我们可以看到其是执行的线程操作是一个batchExcute批量执行操作,可以看到其里面有一个重要方法:threadExcute方法,从而进一步看到我们想看到的方法doMessageReceived
  • 12.14 03:36:26
    发表了文章 2022-12-14 03:36:26

    pmq再学习二

    首先启动的过程中,会去获取消费组中的配置信息,拿到消费组中的配置信息后,执行注册消费组操作,而执行注册消费组操作中,会首先注册消费者,然后执行消费组操作,然后执行启动消费者轮询服务,执行mq检查服务启动,mq提交服务启动。完成后,执行监控服务配置操作。 这里面最为重要的是启动长轮询服务操作。因为长轮询服务涉及到执行重平衡操作和执行更新元数据操作。更新元数据操作涉及到更新队列元数据操作,此时不可避免的涉及到对偏移量的更新操作。
  • 12.14 03:34:38
    发表了文章 2022-12-14 03:34:38

    pmq再学习一

    这个过程首先是创建主题,有了主题,创建消费组,然后基于消费组这个大前提,执行订阅操作,订阅需要进行消费的主题信息,然后在订阅的基础上,进行队列的分配。在这个过程中会执行元数据的变更和重平衡操作。而这些可以从审计日志中获取打印日志中可以看到很清楚。 下一篇,我们来看生产者和消费者的细节。生产者和消费者在执行操作前会执行一个操作init初始化操作,而这个初始化操作会将信息注册到将信息注册到MqClient中,因为只有将其进行统一管理的时候,在创建客户端对象的时候才会方便管理,同时方便调用,此时会启动心跳服务,此时少不了还有一个重要的操作就是注册消费组,同时需要关注一个点就是长轮询操作。
  • 12.14 03:32:10
    发表了文章 2022-12-14 03:32:10

    递归算法使用

    通常递归算法可以将一个问题的重复调用进行分解,将其分解成一个多次调用,最终完成筛选或者需要的数据。比如我们常见的斐波那契数列就是这样的: 0、1、1、2、3、5、8、13、21、34这样的递归数据,可以通过此来总结出它的数学公式规律:F(n) = F(n-1) + F(n-2)的这个过程就是是借助上面的F(0)和F(1)的结果来进行递推的,这个过程在数学上是一个数列的递推公式,在高中我们学过的数列上。我还记得当时求解递推公式可以使用函数方程,而函数方程的思想想想其实是借助了微分方程逆推得到积分方程的过程,或者说是采用不动点法可以实现这一求解的过程。这个过程,在我看到高等数学的时候才明白,现在想
  • 12.14 03:30:24
    发表了文章 2022-12-14 03:30:24

    Netty的使用

    一个好的通信框架是怎样的?同时如何使用netty? 一个好的通信框架,必然是支持双工通信的,同时它能够对半包黏包进行处理,方便高效的编解码、序列化,拥有心跳超时机制,同时支持大量连接并发,方便调用。而这个通信的过程,我始终是觉得它的起源是三次握手和四次挥手。它们影响着消息中间件和通信框架以及SOA框架的发展。netty最简单的是它的EchoServer和EchoClient,两者有同时有自己对应的处理器EchoServerHandler、EchoClientHandler。
  • 12.14 03:28:21
    发表了文章 2022-12-14 03:28:21

    基于Saas主键表生成主键id

    首先需要对当前的id进行拦截操作,也即使用aop的切面Aspect对切点进行拦截,在进行新增的时候进行拦截: 也就是说在进行主键的生成时,我们拦截好需要生成的主键,此时就可以对其进行新增操作了,而首要的就是拿到它的primaryKey。由于进行新增操作,通常分为两种情况: 通过字节码拿到声明的方法getId,如果此时存在id,则说明此时的操作是更新操作,因此直接返回。如果当前通过字节码拿到的声明方法getTenant,通过租户方法拿到租户id。拿到租户id后,就可以进行主键id获取了。
  • 12.14 03:25:54
    发表了文章 2022-12-14 03:25:54

    互联互通数据推送

    需求是基于治疗数据,推送给平台,使用xml对数据进行组装,同时进行加密,里面包含所有的治疗数据与pdf,而生成是在完成治疗后进行数据的推送。这个过程是实时的,因此就需要考虑性能的问题,同时不能影响主流程。因此使用异步进行数据的推送,同时对生成的pdf需要进行加密,放入xml中。而提前的数据信息使用并行流的方式对数据进行组装。这里主要解决推送过程的方式。下面是最近的需求和解决的思路和方式。
  • 12.14 03:23:20
    发表了文章 2022-12-14 03:23:20

    如何实现一个自定义的starter

    SpringFactoriesLoader加载器加载指定ClassLoader下面的所有的META-INF/spring.factories文件,并将文件解析内容存在Map<string,list>中。然后通过loadFactoryNames传递过来的class的名称从map中获取该类的配置列表。通过Set集合进行去重操作。执行过滤组件操作,而这些操作都是在AutoConfigurationImportFilter接口下的组件实现的,也即FilterSpringBootCondition实现抽象类的。下面有OnBeanCondition、OnClassCondition、OnWebApplic
  • 12.14 03:21:08
    发表了文章 2022-12-14 03:21:08

    基于数组和链表实现队列

    创建大数组实现对象:里面包含的信息公共初始化: 初始化页工厂:索引页工厂、数据页工厂、元数据页工厂,初始化数组索引、初始化数据页索引,通过队列前置索引页工厂获取索引页,获取队列front索引buffer,获取front,也即索引。这个实现和kafka是类似的,也即需要有相关页信息 入队列:进行入队操作是一个追加的操作,首先判断容量是否够,不够,则进行扩容操作。通过缓存拿到映射页实现,然后通过映射页。再通过锁,仅锁定创建页,索引用完后进行移除操作,映射页面实现,使用双向校验,如果为空,则创建页索引对象,通过索引拿到文件名称,然后通过读写通道进行读写操作。使用fileChannal调用映射方法获取
  • 12.14 03:17:19
    发表了文章 2022-12-14 03:17:19

    LRU实现基于map和双向链表实现

    如果我们遇到的缓存比较大时,此时又需要考虑怎样的缓存设计呢? 此时由于缓存的消息或者信息比较大时,同时呈现成批量时,可以基于消息,考虑使用文件存储的方式进行,此时可以考虑NIO的处理方式,使用FileChannel和MappedByteBuffer或者堆外内存的方式,此时基于块状消息处理,使用缓冲区或者使用通道。此时的处理不经过用户态,因此性能上也是比较高的。 当然基于LinkedHashMap也可以实现LRU缓存设计。LinkedHashMap本身就是基于HashMap+双向链表实现的。
  • 12.14 03:14:27
    发表了文章 2022-12-14 03:14:27

    单向链表

    在做缓存设计的时候,可以用到链表的数据结构来做缓存设计。主体结构采用map,而存储的节点、数据采用双向链表。这里介绍单向链表,因为如果搞懂了单向链表,其实双向链表更好理解。 数据结构中的链表分为单向链表、双向链表、循环链表。单向链表的数据结构中通常会存在数据域和节点域: 如图1:单向链表的数据结构
  • 12.14 03:11:36
    发表了文章 2022-12-14 03:11:36

    Mybatis中sql拦截增强-AOP+interceptor实现分页和排序

    基于interceptor可以实现sql的完整打印,除了实现打印之外。其实还可以实现分页和排序,下面的分页和排序基于aop+mybatis的interceptor实现。其本质还是对mappedStament的boundSql进行增强。 下面的项目来源于github,通过这个我们可以很好的学习mybatis中插件interceptor的使用。
  • 12.14 03:10:12
    发表了文章 2022-12-14 03:10:12

    pmq学习一-一些典型的使用和套路

    pmq是信也科技开源的一款消息中间件,虽然没有RocketMQ和Kafka出名,但是里面的代码还是有值得我们学习的地方的。 pmq的源码里面很多套路还是值得学习的,说实话,这些都是可以用到项目里面的。下面的代码来源于pmq。 首先安装好maven、mysql,对下载下拉的包进行打包: 如果遇到时区问题,则可以调整时区问题。 1.MqBootstrapListener 观察者模式的使用
  • 12.14 03:09:07
    发表了文章 2022-12-14 03:09:07

    Netty流程学习

    连接完成之后,不能无所事事,此时应该会执行业务处理。也即此时可以看到上面的NettyServerHandler。因此可以看到dubbo的线程模型: 配置 Dubbo 中的线程模型 如果事件处理的逻辑能迅速完成,并且不会发起新的 IO 请求,比如只是在内存中记个标识,则直接在 IO 线程上处理更快,因为减少了线程池调度。 但如果事件处理逻辑较慢,或者需要发起新的 IO 请求,比如需要查询数据库,则必须派发到线程池,否则 IO 线程阻塞,将导致不能接收其它请求。 如果用 IO 线程处理事件,又在事件处理过程中发起新的 IO 请求,比如在连接事件中发起登录请求,会报“可能引发死锁”异常,但不会真死锁
  • 12.14 03:07:09
    发表了文章 2022-12-14 03:07:09

    Netty流程学习一-netty启动服务

    问题:我们的线程:openSelector在什么时候创建的。 在创建NioEventLoop的时候,创建openSelector。 什么时候创建severSocketChannel、初始化serverSocketChannel,同时给serverSocketChannel从bossGroup中选择一个NioEventLoop 创建serverSocketChannel是在initAndRegister的时候,通过泛型+放射+工厂的方式创建serverSocketChannel。 而初始化则是设置channelOptions的相关参数信息、设置属性信息,同时通过channel的pipeline方
  • 12.14 03:06:00
    发表了文章 2022-12-14 03:06:00

    dubbo生产者暴露服务流程

    在这个过程中,url是我们需要进行关注的,此时我们可以看到基本上都是以url为主题进行组装操作。将所有需要放入的输入进行放入,同时最终会以观察者模式,实现配置的实时更新。低版本的dubbo则是以实现InitializingBean,重写AfterPropertiesSet方法。之所以改成基于ApplicationEvent,是因为可以进行更新,这是ApplicationEvent的优势。 同时通过对bubbo的学习,可以看到Netty的使用。
  • 12.14 03:03:28
    发表了文章 2022-12-14 03:03:28

    设计模式之设计原则

    1.单一职责原则 单一职责原则:类的职责单一,不能将太多的职责放在一个类中,该原则是实现高内聚、低耦合的指导方针 比如:进行登录操作需要经过用户请求、参数校验、查找用户、连接数据库、操作数据库等这些操作 开闭原则:一个软件应当对扩展开发、对修改关闭。即在不修改源代码的情况下改变对象的行为 比如:我们现在需要查看报表,但是由于之前没有预留接口,导致没法进行扩展,出现需要修改原来的代码的情况: 里氏代换原则:在软件系统中,一个可以接收基类(父类)对象的地方必然可以接收一个子类对象。其属于开闭原则的实现
  • 12.14 03:01:15
    发表了文章 2022-12-14 03:01:15

    Kafka流程流转-服务端

    kafka分为客户端和服务端,通常我们知道broker是服务端,而生产者和消费者作为客户端。因此在服务端就必定需要解决并发和网络IO的问题。因此不可避免需要用到SocketChannel和ServerSocketChannel,可以看到kafka就使用了ServerSocketChannel,采用Netty来解决这个问题,这里socketServer采用了1个Acceptor,多个Processor。同时将请求发送到请求通道RequestChannel中。而我们知道RequestChannel中有一个请求队列和多个响应队列,通常响应队列是3个,这个参数是在kafka的配置中配置的。通过kafk
  • 12.14 02:59:33
    发表了文章 2022-12-14 02:59:33

    kafka学习六-生产延迟操作

    这里思考问题,什么时候会用到延迟组件,同时哪些时候会用到延迟组件,同时为什么要用延迟组件? 从kafkaApi中,我们可以知道具体的逻辑实现都是在这里实现的: DelayedOperation调用过程 同时基于时间轮进行时间过期的检测操作。 也即从这里我们可以看到DelayedProduce是协助副本管理器完成相应的延迟操作的,而副本管理器则主要是完成将生产者发送的消息写入到leader副本、管理follwer副本与leader副本之间的同步以及副本角色之间的转换。在上面的生产延迟中,我们可以看到在消息写入leader副本时需要DelayedProdue的协助。同时我们也可以看到:当生产请求的
  • 12.14 02:57:29
    发表了文章 2022-12-14 02:57:29

    Kafka学习四

    在kafka启动时,首先执行的broker的操作,然后接着会执行生产者操作,接着将生产者的消息放入到存储中,此时生产者和broker会进行交互,而消费者发送消息,接着消费者会和broker交互。前面我们知道kafka在kafkaApi中会处理具体的请求。首先,我们再次来看kafkaApi的handle,可以看到其入参的参数是RequestChannel.request,也即我们需要找到ReuqestChannel,回忆在RocketMQ中,我们也可以看到请求的参数:ChannelHandlerContext和request在Processor中。也即request.header.apiKey匹
  • 12.14 02:56:17
    发表了文章 2022-12-14 02:56:17

    Scala学习三-面向对象

    前面我们已经学习了特质类似接口,其可以被继承,同时如果需要继承多个特质的话,则需要使用extends…with…进行继承。其类似java中的接口和抽象方法的结合体,但又比java中的其要强大,因为其可以定义抽象字段和普通字段、抽象方法和普通方法。而在java中接口中可以定义常量,不能定义变量。同时特质还可以继承class类,而在java中接口通常是用来实现的。 Object继承trait
  • 12.14 02:53:39
    发表了文章 2022-12-14 02:53:39

    Scala学习一

    Scala中的方法与函数: 方法是属于类或者对象的,在运行时,它是加载到JVM的方法区中,而函数则是加载到JVM的堆内存中,同时可以将函数对象赋值给一个变量。函数是一个对象,继承自FunctionN,函数对象有apply、curried、toSting、tupled这些方法,而方法则没有。这是scala与java不同的地方。
  • 12.14 02:50:53
    发表了文章 2022-12-14 02:50:53

    RocketMQ学习Broker流程、生产者和存储流程联系

    放入消息之后,进行操作体现在asyncSendMessage中。将消息以异步方式存储到存储器中,处理器可以处理下一个请求,而不是在结果完成后等待结果,以异步方式通知客户端。此时可以看到asyncPutMessage的操作中会进入到CommitLog中,此时进行提交日志操作,此时会执行写入到ByteBuffer中,然后刷盘到硬盘中。同时执行统计操作,进行HA同步。
  • 12.14 02:48:57
    发表了文章 2022-12-14 02:48:57

    RocketMQ的NameServer执行流程学习梳理

    首先NamesrvStartUp启动,首先经过main()方法,也是我们常见的main方法进入到main0()执行创建controller操作与启动controller操作这两个操作。而创建controller的操作则首先需要拿到namesrvConfig的配置信息和NettyServerConfig的配置信息,此时会 创建这两个对象,并填充配置信息然后放入到创建的controller对象中的构造函数中,并进行controller的启动操作,而启动操作首先会初始化一些信息和添加jvm钩子,也即会进行如下操作:加载键值对配置管理器、创建远程服务器remotingServer,创建远程线程池rem
  • 12.14 02:46:51
    发表了文章 2022-12-14 02:46:51

    rocketmq学习2

    前面我们已经通过quickstrat可以看到nameServer的启动:从启动类中,我们看到:首先创建NamesrvConfig、nettyServerConfig,设置监听端口,将8888改成9876。填充NamesrvConfig、NettyServerConfig、BrokerConfig,获取namesrvAddr,创建Controller,注册钩子函数,启动start。 NamesrvController的属性信息、构造函数:
  • 12.14 02:44:32
    发表了文章 2022-12-14 02:44:32

    Rocketmq学习一

    首先从github中拉取Rocketmq的代码,进行运行。 1.由于rocketmq需要依赖nameServer,类似于zookeeper。首先启动时,配置好NamesrvStartup的环境变量信息,也即rocketmq的ROCKEMQ_HOME与你的项目对应。接着就可以启动了。
  • 12.14 02:39:32
    发表了文章 2022-12-14 02:39:32

    Netty学习三

    前面我们已经知道Netty服务端启动的时候最重要的是进行bind操作,这个操作不仅进行了run()操作进行死循环,而且将线程任务添加到队列中,进行runAllTasks操作。 首先,我们可以看Netty的架构图,图片来自即时通讯网:
  • 12.14 02:36:03
    发表了文章 2022-12-14 02:36:03

    Netty学习二

    前面我们已经了解了官方的Netty的example,知道要编写一个一个聊天demo或者一个简单的rpc,或者应答模式的demo,在Netty中通常需要写服务端和客户端的引导,而引导是启动服务用的,而服务端和客户端的Handler则是用于处理具体的业务逻辑。这个通常在RPC框架中比如Dubbo,通常会在服务进行暴露或者进行引用的时候,需要调用Netty服务进行启动,然后进行暴露或者调用的,此时采用协议适配的时候,采用适配器模式,而我们知道生产者端最重要的方法就是doBind方法,而在消费者端最重要的方法是doConnect方法。而在RocketMQ中,我们也可以看到服务端和消费端中produce
  • 12.14 02:33:18
    发表了文章 2022-12-14 02:33:18

    Netty学习一

    三大组件:ByteBuffer、Channel、Selector。知道ByteBufffer是数据,而Channel是数据的载体通道,selector为多路复用。如果说线程池为线程提供了重复利用的途径,而Selector则为起到了调度线程的目的,也即高效率的使用线程。下面我们开始Netty的学习。 首先,我们来了解一下mmap、sendFile、零拷贝。在java中,由于传统的IO读写需要进行四次拷贝、四次切换(如图),因此效率上,通常在传输大文件的时候比较低。因此引入了mmap和sendFile进行优化。同时这里,我们就需要了解DMA,在计算机原理中,我们可以看到它的身影,全称Direct
  • 12.14 02:27:53
    发表了文章 2022-12-14 02:27:53

    NIO学习四-Selector

    前面我们已经简单的学习了channel,知道channel作为通道,可以在通道中进行读写操作,同时知道ByteChannel是双向的。对于NIO的优势在于多路复用选择器上,在Nginx、Redis、Netty中都有多路复用的体现。因此学习Selector是有必要的。
  • 12.14 02:25:09
    发表了文章 2022-12-14 02:25:09

    NIO学习三-Channel

    在学习NIO时,ByteBuffer、Channel、Selector三个组件是必须了解的。前面我们说到ByteBuffer是作为缓冲区进行数据的存放或者获取。通常我们需要进行flip翻转操作,但是这个在Netty中,有一个更为强大的类可以替代ByteBuf,其不需要进行翻转,也可以进行读写的双向操作。要将数据打包到缓冲区中,通常需要使用通道,而通道作为传输数据的载体,也即它可以使数据从一端到另一端,因此就必须进行了解。 Channel中,我们也看到其子类有很多,通常都是用于读写操作的。其中ByteChannel可以进行读写操作,也即可以进行双向操作。 操作过程:首先创建流对象,有了流对象获取
  • 12.14 02:23:28
    发表了文章 2022-12-14 02:23:28

    NIO学习二-ByteBuffer

    前面我们已经了解到Buffer中,0<=mark<=postion<=limit<=capacity。其中mark是标记,如果为-1时丢弃。postion是当前位置,limit是限制,也即上界。capacity是容量。同时了解了直接缓冲区与缓冲区的底层实现是不同的,缓冲区是基于数组的,而直接缓冲区是基于内存的。同时可以基于反射,拿到cleaner,进而拿到clean进行清理。同时clear是还原缓冲区的状态,flip是反转缓冲区的,rewind重绕缓冲区,标记清除。remianing对剩余元素的个数记录。offset获取偏移量。 ByteBuffer是Buffer的子类,可以在缓冲区以字节为单
  • 12.14 02:20:30
    发表了文章 2022-12-14 02:20:30

    NIO学习一

    NIO相比普通IO提供了功能更为强大、处理数据更快的解决方案。 常用于高性能服务器上。NIO实现高性能处理的原理是使用较少的线程来处理更多的任务 常规io使用的byte[]、char[]进行封装,而NIO采用ByteBuffer类来操作数据,再结合 针对File或socket技术的channel,采用同步非阻塞技术来实现高性能处理,而Netty 正是采用ByteBuffer(缓冲区)、Channel(通道)、Selector(选择器)进行封装的。 因此我们需要先了解NIO相关的知识。
  • 12.14 02:16:25
    发表了文章 2022-12-14 02:16:25

    CompletableFuture学习

    前面我们已经知道CompletionService是可以解决Future带来的阻塞问题的,同时我们除了前面我们看到的take方法之外,还可以使用poll方法,这样可以使你的程序免受阻塞之苦。因为poll方法也是无阻塞性的。同时在kafka的源码中,我们如果使用消费者的话,可以看到会使用一个基于future的poll方法。同时我们可以在dubbo的新版本2.7中,可以看到其异步编程采用的就是我们要介绍的CompletableFuture。因此,我们有必要了解CompletableFuture,同时其也是真正意义上的异步编程的实现。
  • 12.14 02:15:08
    发表了文章 2022-12-14 02:15:08

    CompletionService学习

    前面已经说到Future的默认实现是FutureTask,因此你可以看到其在jdk1.5的时候采用的是AQS去实现的,因此具有阻塞性,但jdk1.6之后,可以看到其基于CAS实现的。之所以学习Future,除了其具备异步功能,同时其采用的思想也是在设计模式中有体现的,也即Future模式,而且可以在kafka源码中看到基于Future构建的异步编程。前面说到其基于AQS具有阻塞性,但从源码中,可以看到在jdk1.6之后采用的是CAS
  • 12.14 02:13:35
    发表了文章 2022-12-14 02:13:35

    Future和Callable学习

    通常使用线程池+Runnable的时候,会发现Runnable不能返回值,也就执行的结果情况,同时对于出现异常,我们获取异常信息,进行相应的处理。如果需要返回结果,同时需要进一步加工的时候,就可以考虑使用Future+Callable了。同时接口Future的默认实现是FutureTask,因此对于其实现get()方法,会有一个问题,就是如果前面的任务一旦执行的时间耗时较长的时候,就会出现一直阻塞的状态,此时就会出现排队等待的状态,大大影响其性能。适用场景:当一个线程需要等待另一个线程把某个任务执行完成后它才能继续执行,此时可以使用FutureTask。因为FutureTask基于AQS实现,
  • 12.14 02:11:05
    发表了文章 2022-12-14 02:11:05

    java8学习整理二

    java8不但可以提高代码的运行的性能,而且实现起来很优雅,因此学习它是不错的选择。 今天写这篇文章,是因为看到我们部门大佬写的代码,因此将其还原成匿名内部类的时候发现这个retrun是不能省掉的,省去会报错。同时还可以学习到map如果在筛选条件中只有一行的时候,是可以不需要return的,这个是与中间有处理过程是不同的。因此就有了
  • 12.14 02:08:15
    发表了文章 2022-12-14 02:08:15

    对前端传入的json对象解析成多个对象

    如果是多个对象呢?那怎么解决这个问题? 此时就可以用到: multiRequestBodyDemo(@MultiRequestBody("dog") Dog dog, @MultiRequestBody("user") User user) 这种方式进行接收了。但spring boot是不支持这种方式的。因此,就需要自己写一个解析器来解析这样的传入方式和接收的方式。通常,比如我们有分页和对象时,就可以采用这种方式进行接收。
  • 12.14 02:04:34
    发表了文章 2022-12-14 02:04:34

    java8学习整理

    Lambda表达式只能简化函数式表达式接口(通常我们可以看到器有@functionalInterface注解)的匿名内部类写法,也即首先必须是接口,接着接口只能有一个抽象方法,此时可以考虑简化。 Lambda表达式简化Comparator接口匿名内部类写法:进行数据排序,采用Comparator
  • 发表了文章 2023-03-24

    Mysql文件

  • 发表了文章 2023-03-24

    神奇的魔数i

  • 发表了文章 2023-03-24

    Innodb体系架构学习整理

  • 发表了文章 2023-02-20

    CompletableFuture学习整理

  • 发表了文章 2023-02-20

    Sentinel学习二

  • 发表了文章 2023-02-09

    RocketMQ-Spring学习

  • 发表了文章 2023-02-02

    Sentinel的SPI和责任链模式学习

  • 发表了文章 2023-01-31

    xxl-sso单点登录

  • 发表了文章 2023-01-31

    xxl-conf配置中心

  • 发表了文章 2022-12-14

    Mysql事务实现原理

  • 发表了文章 2022-12-14

    pmq再学习三

  • 发表了文章 2022-12-14

    pmq再学习二

  • 发表了文章 2022-12-14

    pmq再学习一

  • 发表了文章 2022-12-14

    递归算法使用

  • 发表了文章 2022-12-14

    Netty的使用

  • 发表了文章 2022-12-14

    基于Saas主键表生成主键id

  • 发表了文章 2022-12-14

    互联互通数据推送

  • 发表了文章 2022-12-14

    如何实现一个自定义的starter

  • 发表了文章 2022-12-14

    基于数组和链表实现队列

  • 发表了文章 2022-12-14

    LRU实现基于map和双向链表实现

正在加载, 请稍后...
滑动查看更多
正在加载, 请稍后...
暂无更多信息
正在加载, 请稍后...
暂无更多信息