ByteBuf Netty的数据容器

摘要:
复合缓冲区CompositeByteBuf例如,让我们考虑一个由两部分组成的消息,即报头和正文,它将通过HTTP协议传输。应用程序可以选择对多条消息重用同一消息体。发生这种情况时,将为每条消息创建一个新的标头。因为我们不想为每条消息重新分配这两个缓冲区,所以CompositeByteBuf是一个完美的选择。HTTP响应就是一个很好的例子。除了以字节表示的内容外,它还包括状态代码、cookie等。ReferenceCounter接口与ChannelHandler和ChannelPipeline相关

两个组件

  • ByteBuf
  • ByteBufHolder

ByteBuf Netty的数据容器第1张

 使用模式

1.堆缓冲区 backing array模式

ByteBuf Netty的数据容器第2张

  1. 直接缓冲区

直接缓冲区的内容将驻留在常规的会被垃圾回收的堆之外。

ByteBuf Netty的数据容器第3张

  1. 复合缓冲区 CompositeByteBuf

为了举例说明,让我们考虑一下一个由两部分——头部和主体——组成的将通过 HTTP 协议
传输的消息。这两部分由应用程序的不同模块产生,将会在消息被发送的时候组装。该应用程序
可以选择为多个消息重用相同的消息主体。当这种情况发生时,对于每个消息都将会创建一个新
的头部。因为我们不想为每个消息都重新分配这两个缓冲区,所以使用 CompositeByteBuf 是一个
完美的选择。

JDK的方式实现

ByteBuf Netty的数据容器第4张

CompositeByteBuf

ByteBuf Netty的数据容器第5张

 CompositeByteBuf 可能不支持访问其支撑数组,因此访问 CompositeByteBuf 中的数
据类似于(访问)直接缓冲区的模式

ByteBuf Netty的数据容器第6张

 ByteBuf字节级操作

关键理解ByteBuf的结构,readIndex和writeIndex分离

  • 随机访问索引
  • 顺序访问索引
  • 可丢弃字节
  • 可读字节
  • 可写字节
  • 索引管理,mark标记
  • 查找操作,查找某个字符在某个位置
  • 派生缓冲区,生成一个原ByteBuf的视图
  • 读写操作

ByteBufHolder 接口

除了实际的数据负载之外,我们还需要存储各种属性值。HTTP 响应便是一 个很好的例子,除了表示为字节的内容,还包括状态码、cookie 等。

ctrl+alt+b查看ByteBufHolder的实现

ByteBuf分配

  • 按需分配:ByteBufAllocator接口
  • Unpooled ByteBuf
  • ByteBufUtil
    • hexdump() 十六进制打印ByteBuf内容

ByteBuf的引用计数

一种通过在某个对象所持有的资源不再被其他对象引用时释放该对象所持有的资源来优化内存使用和性能的技术。

  • ReferenceCounted 接口,和ChannelHandler以及ChannelPipeline相关

免责声明:文章转载自《ByteBuf Netty的数据容器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇NFSv4 mount incorrectly shows all files with ownership as nobody:nobodyif else和switch的效率下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring Cloud Stream

1 前言 在实际的企业开发中,消息中间件是至关重要的组件之一。消息中间件主要解决应用解耦、异步消息、流量削峰等问题,实现高性能、高可用、可伸缩和最终一致性的架构。不同的中间件其实现方式,内部结构是不一样的。如常见的RabbitMQ和Kafka,由于这两个消息中间件的架构上的不同,如RabbitMQ有Exchange,Kafka有Topic、Partitio...

Java高并发,如何解决,什么方式解决

  对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了。而并发问题是绝大部分的程序员头疼的问题,但话又说回来了,既然逃避不掉, 那我们就坦然面对吧~今天就让我们一起来研究一下常见的并发和同步吧。   为了更好的理解并发和同步,我们需要先明白两个重要的概念:同步和异步    1、同步和异步的区别和联系    所谓同步,可以...

Linux命令发送Http的get或post请求(curl和wget两种方法)

    Http请求指的是客户端向服务器的请求消息,Http请求主要分为get或post两种,在Linux系统下可以用curl和wget命令来模拟Http的请求。下面就来介绍一下Linux系统如何模拟Http的get或post请求。 一、get请求:   1、使用curl命令:   curl “http://www.baidu.com” 如果这里的URL指...

MINA、Netty、Twisted一起学(十一):SSL/TLS

什么是SSL/TLS 不使用SSL/TLS的网络通信,一般都是明文传输,网络传输内容在传输过程中很容易被窃听甚至篡改,非常不安全。SSL/TLS协议就是为了解决这些安全问题而设计的。SSL/TLS协议位于TCP/IP协议之上,各个应用层协议之下,使网络传输的内容通过加密算法加密,并且只有服务器和客户端可以加密解密,中间人即使抓到数据包也无法解密获取传输的内...

苹果APNs’ device token特性和过期更新

APNs全名是Apple Push Notification Service。用iPhone的应该都习惯了,每次安装完一个新应用启动后,几乎都会弹出个警告框,“XXX应用”想要给您发送推送通知。这个警告框的权限申请就是为了APNs推送,用户授权后,应用提供商就可以通过APNs给用户推送消息。APNs的工作机制简单来说可以分为两步,第一步是注册推送服务从AP...

Springboot+ActiveMQ(ActiveMQ消息持久化,保证JMS的可靠性,消费者幂等性)

ActiveMQ 持久化设置: 在redis中提供了两种持久化机制:RDB和AOF 两种持久化方式,避免redis宕机以后,能数据恢复,所以持久化的功能 对高可用程序来说 很重要。 同样在ActiveMQ 中 也提供了持久化的功能,在生产者 生产消息 到队列中,可以通过设置 该消息在队列中是否持久化。持久化以后,即使ActiveMQ重启了,队列中的消息也不...