自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 资源 (1)
  • 收藏
  • 关注

原创 Redis核心原理与实践--列表实现原理之ziplist

列表类型可以存储一组按插入顺序排序的字符串,它非常灵活,支持在两端插入、弹出数据,可以充当栈和队列的角色。> LPUSH fruit apple(integer) 1> RPUSH fruit banana(integer) 2> RPOP fruit"banana"> LPOP fruit"apple"本文探讨Redis中列表类型的实现。ziplist使用数组和链表结构都可以实现列表类型。Redis中使用的是链表结构。下面是一种常见的链表实现方式adlist

2021-09-19 09:12:51 329 4

原创 Redis核心原理与实践--字符串实现原理

Redis是一个键值对数据库(key-value DB),下面是一个简单的Redis的命令:> SET msg "hello wolrd"该命令将键“msg”、值“hello wolrd”这两个字符串保存到Redis数据库中。本章分析Redis如何在内存中保存这些字符串。redisObjectRedis中的数据对象server.h/redisObject是Redis对内部存储的数据定义的抽象类型,在深入分析Redis数据类型前,我们先了解redisObject,它的定义如下:typede

2021-09-07 22:48:21 159

原创 新书介绍 -- 《Redis核心原理与实践》

大家好,今天给大家介绍一下我的新书 —— 《Redis核心原理与实践》。后端开发的同学应该对Redis都不陌生,Redis由于性能极高、功能强大,已成为业界非常流行的内存数据库。《Redis核心原理与实践》这本书深入地分析了Redis常用特性的内部机制与实现方式,大部分内容源自对Redis源码的分析,并从中总结出实现原理。通过阅读本书,读者可以快速、轻松地了解Redis的内部运行机制。为什么写这本书?我一直希望从源码层面深入分析一个C语言实现的分布式系统程序。原因如下:(1)C语言可以说是最接近低

2021-09-05 09:40:05 469

原创 Reactive Spring实战 -- 响应式MySql交互

本文与大家探讨Spring中如何实现MySql响应式交互。Spring Data R2DBC项目是Spring提供的数据库响应式编程框架。R2DBC是Reactive Relational Database Connectivity的首字母缩写词。 R2DBC是一个API规范倡议,它声明了一个响应式API,由驱动程序供应商实现,并以响应式编程的方式访问他们的关系数据库。实现数据库的响应式编程并不容易,传统的JDBC协议是一个完全阻塞的 API,所以响应式编程对JDBC协议可以说是一种“颠覆”了。这里

2021-08-31 16:19:40 445

原创 Reactive Spring实战 -- 响应式Redis交互

本文分享Spring中如何实现Redis响应式交互模式。本文将模拟一个用户服务,并使用Redis作为数据存储服务器。本文涉及两个java bean,用户与权益public class User { private long id; private String name; // 标签 private String label; // 收货地址经度 private Double deliveryAddressLon; // 收货地址维度 p

2021-03-14 08:50:01 1364 2

原创 Reactive Spring实战 -- WebFlux使用教程

WebFlux是Spring 5提供的响应式Web应用框架。它是完全非阻塞的,可以在Netty,Undertow和Servlet 3.1+等非阻塞服务器上运行。本文主要介绍WebFlux的使用。FluxWeb vs noFluxWebWebFlux是完全非阻塞的。在FluxWeb前,我们可以使用DeferredResult和AsyncRestTemplate等方式实现非阻塞的Web通信。我们先来比较一下这两者。注意:关于同步阻塞与异步非阻塞的性能差异,本文不再阐述。阻塞即浪费。我们通过异步实

2021-03-07 08:40:14 1094

原创 Reactive Spring实战 -- 理解Reactor的设计与实现

Reactor是Spring提供的非阻塞式响应式编程框架,实现了Reactive Streams规范。 它提供了可组合的异步序列API,例如Flux(用于[N]个元素)和Mono(用于[0 | 1]个元素)。Reactor Netty项目还支持非阻塞式网络通信,非常适用于微服务架构,为HTTP(包括Websockets),TCP和UDP提供了响应式编程基础。本文通过例子展示和源码阅读,分析Reactor中核心设计与实现机制。文本Reactor源码基于Reactor 3.3名词解析响应式编程,维基百

2021-02-28 14:22:06 528

原创 Netty源码解析 -- FastThreadLocal与HashedWheelTimer

Netty源码分析系列文章已接近尾声,本文再来分析Netty中两个常见组件:FastThreadLoca与HashedWheelTimer。源码分析基于Netty 4.1.52FastThreadLocalFastThreadLocal比较简单。FastThreadLocal和FastThreadLocalThread是配套使用的。FastThreadLocalThread继承了Thread,FastThreadLocalThread#threadLocalMap 是一个InternalThrea

2021-01-17 10:24:32 142

原创 Netty源码解析 -- 对象池Recycler实现原理

由于在Java中创建一个实例的消耗不小,很多框架为了提高性能都使用对象池,Netty也不例外。本文主要分析Netty对象池Recycler的实现原理。源码分析基于Netty 4.1.52缓存对象管理Recycler的内部类Stack负责管理缓存对象。Stack关键字段// Stack所属主线程,注意这里使用了WeakReferenceWeakReference<Thread> threadRef; // 主线程回收的对象DefaultHandle<?>[] e

2021-01-09 10:57:02 180

原创 Netty源码解析 -- PoolChunk实现原理(jemalloc 3的算法)

前面文章已经分享了Netty如何引用jemalloc 4算法管理内存。本文主要分享Netty 4.1.52之前版本中,PoolChunk如何使用jemalloc 3算法管理内存。感兴趣的同学可以对比两种算法。源码分析基于Netty 4.1.29首先说明PoolChunk内存组织方式。PoolChunk的内存大小默认是16M,它将内存组织成为一颗完美二叉树。二叉树的每一层每个节点所代表的内存大小都是均等的,并且每一层节点所代表的内存大小总和加起来都是16M。每一层节点可分配内存是父节点的1/2。

2020-12-26 09:52:11 166

原创 Netty源码解析 -- PoolSubpage实现原理

前面文章说了PoolChunk如何管理Normal内存块,本文分享PoolSubpage如何管理Small内存块。源码分析基于Netty 4.1.52内存管理算法PoolSubpage负责管理Small内存块。一个PoolSubpage中的内存块size都相同,该size对应SizeClasses#sizeClasses表格的一个索引index。新创建的PoolSubpage都必须加入到PoolArena#smallSubpagePools[index]链表中。PoolArena#smallSub

2020-12-19 16:02:41 118 1

原创 Netty源码解析 -- PoolChunk实现原理

本文主要分享Netty中PoolChunk如何管理内存。源码分析基于Netty 4.1.52内存管理算法首先说明PoolChunk内存组织方式。PoolChunk的内存大小默认是16M,Netty将它划分为2048个page,每个page为8K。PoolChunk上可以分配Normal内存块。Normal内存块大小必须是page的倍数。PoolChunk通过runsAvail字段管理内存块。PoolChunk#runsAvail是PriorityQueue数组,其中PriorityQueue

2020-12-06 14:14:53 181

原创 Netty源码解析 -- 内存池与PoolArena

我们知道,Netty使用直接内存实现Netty零拷贝以提升性能,但直接内存的创建和释放可能需要涉及系统调用,是比较昂贵的操作,如果每个请求都创建和释放一个直接内存,那性能肯定是不能满足要求的。这时就需要使用内存池。即从系统中申请一大块内存,再在上面分配每个请求所需的内存。Netty中的内存池主要涉及PoolArena,PoolChunk与PoolSubpage。本文主要分析PoolArena的作用与实现。源码分析基于Netty 4.1.52接口关系ByteBufAllocator,内存分配器

2020-11-29 20:18:31 206

原创 Netty源码解析 -- 内存对齐类SizeClasses

在学习Netty内存池之前,我们先了解一下Netty的内存对齐类SizeClasses,它为Netty内存池中的内存块提供大小对齐,索引计算等服务方法。源码分析基于Netty 4.1.52Netty内存池中每个内存块size都符合如下计算公式size = 1 << log2Group + nDelta * (1 << log2Delta)log2Group:内存块分组nDelta:增量乘数log2Delta:增量大小的log2值SizeClasses初始化后,将计算ch

2020-11-22 19:50:59 425 1

原创 Netty源码解析 -- 零拷贝机制与ByteBuf

本文来分享Netty中的零拷贝机制以及内存缓冲区ByteBuf的实现。源码分析基于Netty 4.1.52Netty中的零拷贝Netty中零拷贝机制主要有以下几种1.文件传输类DefaultFileRegion#transferTo,调用FileChannel#transferTo,直接将文件缓冲区的数据发送到目标Channel,减少用户缓冲区的拷贝(通过linux的sendfile函数)。使用read 和 write过程如下使用sendfile可以看到,使用sendfile函数可以减少数

2020-11-15 15:49:17 306

原创 Netty源码解析 -- ChannelPipeline机制与读写过程

前面文章说了,ChannelHandlerContext#write只是将数据缓存到ChannelOutboundBuffer,等到ChannelHandlerContext#flush时,再将ChannelOutboundBuffer缓存的数据写到Channel中。本文分享Netty中ChannelOutboundBuffer的实现以及Flush过程。源码分析基于Netty 4.1每个Channel的AbstractUnsafe#outboundBuffer 都维护了一个ChannelOutboun

2020-11-08 23:19:39 241

原创 Netty源码解析 -- ChannelPipeline机制与读写过程

本文继续阅读Netty源码,解析ChannelPipeline事件传播原理,以及Netty读写过程。源码分析基于Netty 4.1ChannelPipelineNetty中的ChannelPipeline可以理解为拦截器链,维护了一个ChannelHandler链表,ChannelHandler即具体拦截器,可以在读写过程中,对数据进行处理。ChannelHandler也可以分为两类。ChannelInboundHandler,监控Channel状态变化,如channelActive,channe

2020-11-07 21:06:23 346 1

原创 Netty源码解析 -- 事件循环机制实现原理

本文主要分享Netty中事件循环机制的实现。源码分析基于Netty 4.1EventLoop前面分享服务端和客户端启动过程的文章中说过,Netty通过事件循环机制(EventLoop)处理IO事件和异步任务,简单来说,就是通过一个死循环,不断处理当前已发生的IO事件和待处理的异步任务。示例如下while(true) { process(selector.select()); process(getTask());}这种事件循环机制也是一种常用的IO事件处理机制,包括Redis,Mysql

2020-11-03 21:08:46 341

原创 Netty源码解析 -- 客户端启动过程

上一篇文章分享了Netty服务端启动过程,本文继续分享Netty客户端启动过程。源码分析基于Netty 4.1Connect客户端启动过程比较简单,主要是Connect操作。Netty客户端启动引导类是Bootstrap,同样继承了AbstractBootstrap,它只有一个EventLoopGroup,下文称为ConnectGroup。Bootstrap#connect -> doResolveAndConnect -> doResolveAndConnect0private C

2020-11-01 16:03:57 140

原创 Netty源码解析 -- 服务端启动过程

本文通过阅读Netty源码,解析Netty服务端启动过程。源码分析基于Netty 4.1Netty是一个高性能的网络通信框架,支持NIO,OIO等多种IO模式。通常,我们都是使用NIO模式,该系列文章也是解析Netty下NIO模式的实现。首先,看一个NIO网络通信示意图Netty中NIO网络通信过程在此基础上实现,下面来看一下具体实现。Channel首先,看一下Netty中的通道Channel,它代表了一个能完成IO操作的通道,提供read, write, connect, bind等方法。

2020-11-01 12:22:23 279

高性能JavaScript(中英文同步翻译)

高性能JavaScript编程 (中英文同步翻译) 高清 WEB前端不得不讲的js书籍

2013-12-20

空空如也

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

TA关注的人

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