小马的学习笔记
码龄8年
关注
提问 私信
  • 博客:850,872
    动态:3
    850,875
    总访问量
  • 125
    原创
  • 1,857,884
    排名
  • 248
    粉丝
  • 0
    铁粉
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:北京市
  • 加入CSDN时间: 2017-03-28
博客简介:

小马哥的博客

查看详细资料
个人成就
  • 获得230次点赞
  • 内容获得133次评论
  • 获得1,153次收藏
  • 代码片获得130次分享
创作历程
  • 1篇
    2021年
  • 19篇
    2020年
  • 82篇
    2019年
  • 61篇
    2018年
成就勋章
TA的专栏
  • 2020面试题
    17篇
  • spring-1.0
  • kafka1.0
    9篇
  • mysql1.0
    20篇
  • redis深度解析1.0
    13篇
  • 设计模式1.0
    21篇
  • 设计模式2.0
    12篇
  • IM
    2篇
  • jvm
  • IM架构设计
  • spring
    3篇
  • java基础
    1篇
  • 线程
    6篇
  • 设计模式
    21篇
  • hashmap
    2篇
  • ConcurrentHashMap
    1篇
  • NIO
    1篇
  • 手写框架
    1篇
  • docker
    1篇
  • dubbo
    2篇
  • springboot
    2篇
  • hadoop
  • springcloud
    2篇
  • redis
    13篇
  • 大数据
    7篇
  • 学习大数据遇到的问题(bug)
    29篇
  • mongodb
    7篇
  • 手写spring
  • Flume
    1篇
  • 设计模式2.0
    12篇
  • mysql-1.0
    19篇
  • Kafka-1.0
    8篇
  • 转载
    3篇
  • 转载的面试题
    1篇
创作活动更多

新星杯·14天创作挑战营·第9期

这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!我们一起发掘写作的魅力,书写出属于我们的故事。我们诚挚邀请你们参加为期14天的创作挑战赛! 注: 1、参赛者可以进入活动群进行交流、分享创作心得,互相鼓励与支持(开卷),答疑及活动群请见 https://bbs.csdn.net/topics/619626357 2、文章质量分查询:https://www.csdn.net/qc

475人参与 去参加
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

Pipeline 的事件传播机制

Pipeline 的事件传播机制前面章节中,我们已经知道 AbstractChannelHandlerContext 中有 inbound 和 outbound 两个 boolean 变量,分别用于标识 Context 所对应的 handler 的类型,即:1、inbound 为 true 是,表示其对应的 ChannelHandler 是 ChannelInboundHandler 的子类。2、outbound 为 true 时,表示对应的 ChannelHandler 是 ChannelOutbo
原创
发布博客 2021.02.22 ·
442 阅读 ·
0 点赞 ·
1 评论 ·
0 收藏

netty源码-EventLoopGroup

EventLoopGroup 与 Reactor 关联我们介绍了三种 Reactor 的线程模型, 那么它们和 NioEventLoopGroup 又有什么关系呢?其实,不同的设置NioEventLoopGroup 的方式就对应了不同的 Reactor 的线程模型。1.单线程模型,来看下面的应用代码:EventLoopGroup bossGroup = new NioEventLoopGroup(1); ServerBootstrap server = new ServerBootstr
原创
发布博客 2020.12.27 ·
511 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

netty源码-服务端初始化

NioServerSocketChannel的创建再看服务端代码,我们调用了 ServerBootstarap 的 channel(NioServerSocketChannel.class)方法,传的参数是 NioServerSocketChannel.class 对象。如此,按照客户端代码同样的流程,我们可以确定 NioServerSocketChannel 的 实例化也是通过 ReflectiveChannelFactory 工厂类来完成的,而 ReflectiveChannelFactory 中的
原创
发布博客 2020.12.17 ·
609 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

netty无锁化的串行设计理念

无锁化的串行设计理念在大多数场景下,并行多线程处理可以提升系统的并发性能。但是,如果对于共享资源的并发访问处理不当,会带来 严重的锁竞争,这最终会导致性能的下降。为了尽可能的避免锁竞争带来的性能损耗,可以通过串行化设计,即消息 的处理尽可能在同一个线程内完成,期间不进行线程切换,这样就避免了多线程竞争和同步锁。为了尽可能提升性能,Netty 采用了串行无锁化设计,在 IO 线程内部进行串行操作,避免多线程竞争导致的性能下降表面上看,串行化设计似乎 CPU 利用率不高,并发程度不够。但是,通过调整 N
原创
发布博客 2020.12.01 ·
1985 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

netty源码-客户端初始化

netty的客户端代码例子:public Test connect(int port, String host, final String nickName) { EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group).channel(NioSock...
原创
发布博客 2020.12.01 ·
467 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

netty中的设计模式

设计模式在 Netty 中的应用单例模式源码举例单例模式要点回顾:1、一个类在任何情况下只有一个对象,并提供一个全局访问点。2、可延迟创建。3、避免线程安全问题案例分析@Sharable public final class MqttEncoder extends MessageToMessageEncoder<MqttMessage> { public static final MqttEncoder INSTANCE = new MqttEncode..
原创
发布博客 2020.11.26 ·
638 阅读 ·
1 点赞 ·
0 评论 ·
0 收藏

netty的内存池

内存池随着 JVM 虚拟机和 JIT 即时编译技术的发展,对象的分配和回收是个非常轻量级的工作。但是对于缓冲区 Buffer,情 况却稍有不同,特别是对于堆外直接内存的分配和回收,是一件耗时的操作。为了尽量重用缓冲区,Netty 提供了基于内存池的缓冲区重用机制。下面我们一起看下 Netty ByteBuf 的实现:Netty 提供了多种内存管理策略,通过在启动辅助类中配置相关参数,可以实现差异化的定制。下面通过性能测试,我们看下基于内存池循环利用的 ByteBuf 和普通 ByteBuf
原创
发布博客 2020.11.13 ·
742 阅读 ·
0 点赞 ·
1 评论 ·
0 收藏

netty的零拷贝

Netty 的“零拷贝”主要体现在如下三个方面:1) Netty 的接收和发送 ByteBuffer 采用 DIRECT BUFFERS,使用堆外直接内存进行 Socket 读写,不需要进行字节缓冲 区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行 Socket 读写,JVM 会将堆内存 Buffer 拷贝一份到直接 内存中,然后才写入 Socket 中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。2) Netty 提供了组合 Buffer 对象,可以聚合多个 B
原创
发布博客 2020.11.13 ·
604 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

netty的基本概念-阻塞与非阻塞,同步与异步

阻塞(Block)和非阻塞(Non-Block)阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,当数据没有准备的时候。阻塞:往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里。非阻塞:当我们的进程访问我们的数据缓冲区的时候,如果数据没有准备好则直接返回,不会等待。如果数据已经准备好,也直接返回。同步(Synchronization)和异步(Asynchronous)同步和异步都是基于应用程序和操作系统处理 IO 事件所采用的方式。比如同步:是应用
原创
发布博客 2020.11.13 ·
1286 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

netty的基本概念-编码器和解码器

编、解码技术通常我们也习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输、数据持 久化或者其它用途。反之,解码(Decode)/反序列化(deserialization)把从网络、磁盘等读取的字节数组还原成原 始对象(通常是原始对象的拷贝),以方便后续的业务逻辑操作。进行远程跨进程服务调用时(例如 RPC 调用),需要使用特定的编解码技术,对需要进行网络传输的对象做编码或者解码,以便完成远程调用。Netty 为什么要提供编解码框架?作为一个
原创
发布博客 2020.11.13 ·
966 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

netty的基本概念-TCP粘包和拆包

TCP 粘包/拆包TCP 是一个“流”协议,所谓流,就是没有界限的一长串二进制数据。TCP 作为传输层协议并不不了解上层业务数据的具 体含义,它会根据 TCP 缓冲区的实际情况进行数据包的划分,所以在业务上认为是一个完整的包,可能会被 TCP 拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的 TCP 粘包和拆包问题。 同样, 在 Netty 的编码器中, 也会对半包和粘包问题做相应的处理。什么是半包, 顾名思义, 就是不完整的数据包, 因为 Betty 在轮询读事件的时候
原创
发布博客 2020.11.13 ·
307 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

netty的基本概念-NIO三件套

Java NIO 三件套在 NIO 中有几个核心对象需要掌握:缓冲区(Buffer)、选择器(Selector)、通道(Channel)缓冲区 Buffer1.Buffer 操作基本 AP在 NIO 中,所有的缓冲区类型都继承于抽象类 Buffer,最常用的就是 ByteBuffer,对于 Java 中的基本类型,基本都有一个具体 Buffer 类型与之相对应,它们之间的继承关系如下图所示:下面是一个简单的使用 IntBuffer 的例子:package com.gupaoed
原创
发布博客 2020.11.13 ·
312 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

netty的基本概念-BIO与NIO对比

BIO 与 NIO 对比下表总结了 Java BIO(Block IO)和 NIO(Non-Block IO)之间的主要差别异。面向流与面向缓冲Java NIO 和 BIO 之间第一个最大的区别是,BIO 是面向流的,NIO 是面向缓冲区的。 Java BIO 面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。 如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO 的缓冲导向方法略有不同。数据读取到
原创
发布博客 2020.11.13 ·
656 阅读 ·
0 点赞 ·
1 评论 ·
0 收藏

netty的基本概念-AIO详解

Java AIO 详解jdk1.7 (NIO2)才是实现真正的异步 AIO、把 IO 读写操作完全交给操作系统,学习了 linux epoll 模式,下面我们来做一些演示。AIO(Asynchronous IO)基本原理服务端:AsynchronousServerSocketChannel客服端:AsynchronousSocketChannel用户处理器:CompletionHandler 接口,这个接口实现应用程序向操作系统发起 IO 请求,当完成后处理具体逻辑,否则做自己该做的事情
原创
发布博客 2020.11.13 ·
973 阅读 ·
0 点赞 ·
0 评论 ·
3 收藏

netty的高效的Reactor线程模型

高效的 Reactor 线程模型常用的 Reactor 线程模型有三种,分别如下:1) Reactor 单线程模型;2) Reactor 多线程模型;3) 主从 Reactor 多线程模型Reactor 单线程模型,指的是所有的 IO 操作都在同一个 NIO 线程上面完成,NIO 线程的职责如下:1) 作为 NIO 服务端,接收客户端的 TCP 连接;2) 作为 NIO 客户端,向服务端发起 TCP 连接;3) 读取通信对端的请求或者应答消息;4) 向通信对端发送消息请求
原创
发布博客 2020.11.13 ·
346 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

netty的拆包粘包,在生产中是怎么处理的

概念TCP 是以流的方式来处理数据,所以会导致粘包 / 拆包。 拆包:一个完整的包可能会被 TCP 拆分成多个包进行发送。 粘包:也可能把小的封装成一个大的数据包发送。 原因 应用程序写入的字节大小大于套接字发送缓冲区的大小,会发生拆包现象。而应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包现象。 待发送数据大于 MSS(最大报文长度),TCP 在传输前将进行拆包。 以太网帧的 payload(净荷)大于 MTU(.
原创
发布博客 2020.11.13 ·
259 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

netty的epoll和linux的epoll是如何实现的

1.linux的epollepoll 是Linux内核中的一种可扩展IO事件处理机制,最早在 Linux 2.5.44内核中引入,可被用于代替POSIX select 和 poll 系统调用,并且在具有大量应用程序请求时能够获得较好的性能( 此时被监视的文件描述符数目非常大,与旧的 select 和 poll 系统调用完成操作所需 O(n) 不同, epoll能在O(1)时间内完成操作,所以性能相当高),epoll 与 FreeBSD的kqueue类似,都向用户空间提供了自己的文件描述符来进行操作。
原创
发布博客 2020.11.04 ·
4396 阅读 ·
5 点赞 ·
0 评论 ·
14 收藏

IM面试题

1.消息存储中,内容表和索引表如果需要分库处理,应该按什么字段来哈希? 索引表可以和内容表合并成一个表吗?答: 内容表应该按主键消息ID来哈希做分库分表处理,这样便于定位某一条具体的消息;索引表应该按索引的用户UID来哈希做分库分表处理,这样可以使得当前用户的所有联系人都落在一张表上,减少遍历所有表的麻烦。 索引表可以与内容表合成一张表,好处是显而易见的,能减少拉取历史消息时的数据库IO,不好的地方就是消息内容冗余存储,浪费了空间。2.能从索引表里获取到最近联系人所需要的信息,为什么还需要单独的联系
原创
发布博客 2020.05.09 ·
2962 阅读 ·
1 点赞 ·
0 评论 ·
15 收藏

面试常问缓存三大问题及解决方案

1.缓存来由随着互联网系统发展的逐步完善,提高系统的qps,目前的绝大部分系统都增加了缓存机制从而避免请求过多的直接与数据库操作从而造成系统瓶颈,极大的提升了用户体验和系统稳定性。2.缓存问题虽然使用缓存给系统带来了一定的质的提升,但同时也带来了一些需要注意的问题。2.1 缓存穿透缓存穿透是指查询一个一定不存在的数据,因为缓存中也无该数据的信息,则会直接去数据库层进行查询,从系统层面来看像是穿透了缓存层直接达到db,从而称为缓存穿透,没有了缓存层的保护,这种查询一定不存在的数据对系统来说可能是一
原创
发布博客 2020.05.09 ·
668 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

IM系统四大基本特性

1.实时性:保证消息实时触达是互动场景的必备能力。对于一个实时消息系统,“实时”二字很好地表达了这个系统的基本要求。通过微信和你的好友聊天,结果等半天对方才收到,基本上也没有意愿聊了;直播场景下,如果主播的互动消息房间里的粉丝要等很长时间才能收到,也很难让粉丝们有积极参与的欲望。实时性分为:短轮询,长轮询,WebSocket(长链接)。2.可靠性:“不丢消息”和“消息不重复”是系统值得信赖...
原创
发布博客 2020.05.07 ·
3969 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏
加载更多