Netty 强大的 ByteBuf

news2024/11/5 2:25:57

Netty 强大的 ByteBuf

Netty ByteBuf功能可以类比NIO 中 ByteBuffer,那为什么不直接使用NIO 中ByteBuffer?

主要是易用性和扩展性一些方面,有点可以肯定,Netty 基于NIO实现的,底层肯定用了ByteBuffer 。

  • jdk Buffer API 复杂性,读写时需要重要设置position、limit等,很容易出错

  • NIO Buffer 扩展性差,功能有限

ByteBuf 工作原理

回顾之前的文章NIO ByteBuffer读写时需要修改position

独立的读写指针

维护了两个指针 readerIndex ,writerIndex ,读写操作互不影响,读时不会影响写指针,写时也不会影响读指针,操作比NIO更简单

0 <= readerIndex <= writerIndex <= capacity

ByteBuf 类型

ByteBuf实际上是一个抽象类,它有多种实现

  • Heap ByteBuf:这种类型的 ByteBuf 将数据存储在 JVM 堆内存中,受JVM垃圾回收管理。

  • Direct ByteBuf:这种类型的 ByteBuf 使用了直接内存,不受JVM垃圾回收管理,通常可以提供更快的 IO 操作性能,由于不受JVM垃圾回收管理,一般需要手动释放内存。

  • Composite ByteBuf:允许将多个 ByteBuf 组合为一个逻辑上的 ByteBuf,这样可以简化复杂的协议编码解码过程,比如在网络协议编码解码过程中协议数据分为请求头和请求体。

顺序访问索引

  • readInt() / readLong() / readDouble() / …

从readerIndex开始读取,并且会修改readerIndex

  • writeInt(int value)/ writeLong(Long value)/ 等

从writerIndex 开始写入,也会修改从writerIndex

随机访问索引

getInt(int index)
getLong(int index)
getXXX(int index)

随机读不会修改 readerIndex,也不会涉及内存复制操作,当然ByteBuf会检验索引的合法性,设置无效的索引会导致 IndexOutOfBoundsException。

虽然随机读不会修改指针,但我们也可以手动调整指针 readerIndex(int readerIndex)/writerIndex(int writerIndex)

discardable bytes

discardable bytes 指的0 到 readerIndex之间的字节,这些内容已经读过,按道理可以丢弃以节省内存。

discardReadBytes()方法:这个方法会将 readerIndex 到 writerIndex 之间的数据移动到缓冲区的开始位置,并更新 readerIndex 和 writerIndex 的值。 适当使用可以优化内存,可以优化内存,但不建议频繁使用,因为涉及内存复制,对性能有影响。

查找操作

ByteBuf 提供了多种方法来查找缓冲区中的特定字节或序列。
这些查找操作对于协议解析、数据验证以及其他需要在数据流中定位特定模式的场景非常有用

indexOf(int fromIndex, int toIndex, byte value)
bytesBefore(byte value)
indexOf(int fromIndex, int toIndex, byte[] bytes)
bytesBefore(byte[] bytes)
indexOf(int fromIndex, int toIndex, ByteBuf bytes)
bytesBefore(ByteBuf bytes)

//还支持指定处理器操作
forEachByte(ByteProcessor processor)
forEachByte(int index, int length, ByteProcessor processor)
forEachByteDesc(ByteProcessor processor)
forEachByteDesc(int index, int length, ByteProcessor processor)

查找操作的性能考虑

查找操作的性能会受到ByteBuf大小影响,一些极端情况可能需要多次比较和字节读取操作,这也会增加 CPU 的开销

派生缓冲区

派生缓冲区可以共享底层的字节数据,但具有独立的读写指针
派生缓冲区很方便地在不复制大量数据的情况下,从不同的角度或范围对原始数据进行操作。

数据共享

派生缓冲区与原始缓存区是数据共享(底层是同一内容的指针引用),数据修改会互相影响。

当然派生缓冲区也可以用于多线程,由于数据共享的,所以不存在数据同步问题,当然可能并发修改,可能需要加锁保证线程安全。

派生缓冲区对于不同的角度查看数据场景非常有用。如协议解析中的数据分段处理(请求体,请求头等)。

派生缓冲区相关API

  • duplicate()
  • slice()
  • slice(int index,int length)

复制操作

复制后的ByteBuf 内容和索引都是互相独立的,复制操作会进行内存复制。

copy()
copy(int index,int length)

总结

ByteBuf 确实比 NIO 中 ByteBuffer 功能强大,相信读者也感受到了,灵活掌握ByteBuf使用,可以轻松应对很多场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2232260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从安装到实战:Spring Boot与kafka终极整合指南

docker环境下部署kafka 前置条件 Apache Kafka 自 2.8.0 版本开始引入了不依赖 Zookeeper 的“Kafka Raft Metadata Mode”&#xff0c;本文章依然使用Zookeeper 作为集群管理的插件。 #拉去zookeeper镜像docker pull wurstmeister/zookeeper#运行zookeeper容器docker run -…

【Kettle的安装与使用】使用Kettle实现mysql和hive的数据传输(使用Kettle将mysql数据导入hive、将hive数据导入mysql)

文章目录 一、安装1、解压2、修改字符集3、启动 二、实战1、将hive数据导入mysql2、将mysql数据导入到hive 一、安装 Kettle的安装包在文章结尾 1、解压 在windows中解压到一个非中文路径下 2、修改字符集 修改 spoon.bat 文件 "-Dfile.encodingUTF-8"3、启动…

如何看待AI技术的应用前景?

文章目录 如何看待AI技术的应用前景引言AI技术的现状1. AI的定义与分类2. 当前AI技术的应用领域 AI技术的应用前景1. 经济效益2. 社会影响3. 技术进步 AI技术应用面临的挑战1. 数据隐私与安全2. 可解释性与信任3. 技能短缺与就业影响 AI技术的未来发展方向1. 人工智能的伦理与法…

PyQt5实战——UTF-8编码器UI页面设计以及按钮连接(五)

个人博客&#xff1a;苏三有春的博客 系类往期文章&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; PyQt5实战——多脚本集合包&#xff0c;UI以及工程布局&#xff08;二&#xff09; PyQt5实战——多脚本集合包&#xff0c;程序…

快速入门CSS

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗 如有错误&#xff0c;欢迎指出~ 目录 CSS css的三种引入方式 css书写规范 选择器分类 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 color颜色设置 border边框设置 width/heigth 内/外边距 C…

【基础】os模块

前言 1、os是operation system&#xff08;操作系统&#xff09;的缩写&#xff1b;os模块就是python对操作系统操作接口的封装。os模块提供了多数操作系统的功能接口函数。&#xff08;OS模块提供了与操作系统进行交互的函数&#xff09; 2、操作系统属于Python的标准实用程…

Linux---cp命令

Linux cp 命令 | 菜鸟教程 (runoob.com) 命令作用&#xff1a; cp命令主要用于复制文件或目录 语法: cp [options] source dest cp [选项] 源文件 目标文件 source:要复制的文件或目录的名称 dest:复制后的文件或目录的名称 注意&#xff1a;用户使用该指令复制目录时&…

MyBatis-Plus快速入门:从安装到第一个Demo

一、前言 在现代 Java 应用程序中&#xff0c;数据访问层的效率与简洁性至关重要。MyBatis-Plus 作为 MyBatis 的增强工具&#xff0c;旨在简化常见的数据操作&#xff0c;提升开发效率。它提供了丰富的功能&#xff0c;如自动生成 SQL、条件构造器和简单易用的 CRUD 操作&…

【android12】【AHandler】【3.AHandler原理篇AHandler类方法全解】

AHandler系列 【android12】【AHandler】【1.AHandler异步无回复消息原理篇】-CSDN博客 【android12】【AHandler】【2.AHandler异步回复消息原理篇】-CSDN博客 其他系列 本人系列文章-CSDN博客 1.简介 前面两篇我们主要介绍了有回复和无回复的消息的使用方法和源码解析&a…

美发系统——职员绩效和提成——调试过程

一、学会通过现象看本质 首先&#xff0c;通过现象看本质能够让技术研究者更深入地理解问题。在面对技术故障或挑战时&#xff0c;表面的现象往往只是冰山一角&#xff0c;如果只关注表象&#xff0c;可能会采取治标不治本的解决方法。而洞察本质则可以找到问题的根源&#xf…

记一次:Clickhouse同步mysql数据库

ClickHouse可以通过使用MaterializeMySQL引擎来实现与MySQL的数据同步。 前言&#xff1a;因为数据量比较大&#xff0c;既然要分库&#xff0c;为何不让clickhouse同步一下mysql数据库呢&#xff1f; 零、前期准备--mysql的查询和配置 1 查询mysql的配置状态 查询以下语句…

教程:使用 InterBase Express 访问数据库(二)

1. 添加数据模块(IBX 通用教程) 本节将创建一个数据模块(TDataModule),这是一种包含应用程序使用的非可视组件的表单。 以下是完全配置好的 TDataModule 的视图: 创建 TDataModule 后,您可以在其他表单中使用这个数据模块。 2. 添加 TDataModule 要将数据模块添加到…

Matlab实现海马优化算法(SHO)求解路径规划问题

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 海马优化算法&#xff08;SHO&#xff09;是一种受自然界海马行为启发的优化算法&#xff0c;它通过模拟海马在寻找食物和配偶时的探索、跟踪和聚集行为来搜索最优解。SHO因其高效的全局搜索能力和局部搜索能力而…

002-Kotlin界面开发之Kotlin旋风之旅

Kotlin旋风之旅 Compose Desktop中哪些Kotlin知识是必须的&#xff1f; 在学习Compose Desktop中&#xff0c;以下Kotlin知识是必须的&#xff1a; 基础语法&#xff1a;包括变量声明、数据类型、条件语句、循环等。面向对象编程&#xff1a;类与对象、继承、接口、抽象类等。…

Unity XR Interaction Toolkit 开发教程(2):导入 SDK【3.0 以上版本】

文章目录 &#x1f4d5;课程总结&#x1f4d5;安装 Unity 编辑器与打包模块&#x1f4d5;导入 OpenXR&#x1f4d5;导入 XR Interaction Toolkit&#x1f4d5;打包发布 获取完整课程以及答疑&#xff0c;工程文件下载&#xff1a; https://www.spatialxr.tech/ 视频试看链接&a…

clickhouse运维篇(二):多机器手动部署ck集群

熟悉流程并且有真正部署需求可以看一下我的另一篇简化部署的文章&#xff0c;因为多节点配置还是比较麻烦的先要jdk、zookeeper&#xff0c;再ck&#xff0c;还有各种配置文件登录不同机器上手动改配置文件还挺容易出错的。 clickhouse运维篇&#xff08;三&#xff09;&#x…

RabbitMQ交换机类型

RabbitMQ交换机类型 1、RabbitMQ工作模型2、RabbitMQ交换机类型2.1、Fanout Exchange&#xff08;扇形&#xff09;2.1.1、介绍2.1.2、示例2.1.2.1、生产者2.1.2.2、消费者2.1.2.3、测试 2.2、Direct Exchange&#xff08;直连&#xff09;2.2.1、介绍2.2.2、示例2.2.2.1、生产…

MoonNet基准测试更新

基准测试 引言&#xff1a;为了展示MoonNet网络库支持的动态负载均衡功能&#xff0c;我进行了吞吐量测试&#xff0c;以突出其性能表现。由于该库的动态负载均衡策略包括动态线程调度&#xff0c;测试中的线程数变化是不稳定的。这种动态调整使得直接与其他库采用固定线程数的…

RHCE——笔记

nfs服务器 一、简介 NFS&#xff08;网络文件系统&#xff09; 允许网络中的计算机&#xff08;不同的计算机、不同的操作系统&#xff09;之间通过TCP/IP网络共享资源&#xff0c;主要在unix系列操作系统上使用。在NFS的应用中&#xff0c;本地NFS的客户端应用可以透明地读…

2023年SCRM系统排名分析及市场趋势解读

内容概要 当前&#xff0c;SCRM&#xff08;社交客户关系管理&#xff09;系统在企业运营中的重要性日益凸显&#xff0c;尤其是在快速发展的数字经济环境中。2023年的SCRM市场展现出多元化与专业化的趋势&#xff0c;不同企业在客户关系管理方面的需求各有不同&#xff0c;这…