自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(273)
  • 收藏
  • 关注

原创 Charles抓包原理与配置

1.Charles简介1.1Charles简介Charles中文名叫青花瓷,它是一款基于HTTP协议的代理服务器,通过成为电脑或者浏览器的代理,然后截取请求和请求结果达到分析抓包的目的。特点: 跨平台、半免费。1.2charles的原理:代理前置步骤:需要运行Charles并配置代理客户端需要配置Charles代理步骤:客户端发送请求Charles...

2023-12-16 17:50:39 1483

原创 15.Redis之三种集群方案

加餐:Redis的三种集群方案主从复制模式Sentinel(哨兵)模式Cluster Node模式主从复制模式1. 基本原理:1主多从主从复制模式中包含一个主数据库实例(master)与一个或多个从数据库实例(slave),如下图客户端可对主数据库进行读写操作,对从数据库进行读操作,主数据库写入的数据会实时自动同步给从数据库。2.具体工作机制1.slave...

2023-12-15 14:36:57 937

原创 14.Redis之RDB内存快照

5.RDB内存快照上节课,我们学习了 Redis 避免数据丢失的 AOF 方法。这个方法的好处,是每次执行只需要记录操作命令,需要持久化的数据量不大。一般而言,只要你采用的不是 always 的持久化策略,就不会对性能造成太大影响。但是,也正因为记录的是操作命令,而不是实际的数据,所以,用 AOF 方法进行故障恢复的时候,需要逐一把操作日志都执行一遍。如果操作日志非常多,Redis 就...

2023-12-15 14:28:18 1102

原创 13.AOF日志

★4.AOF日志如果有人问你:“你会把 Redis 用在什么业务场景下?”我想你大概率会说:“我会把它当作缓存使用,因为它把后端数据库中的数据存储在内存中,然后直接从内存中读取数据,响应速度会非常快。”没错,这确实是 Redis 的一个普遍使用场景,但是,这里也有一个绝对不能忽略的问题:一旦服务器宕机,内存中的数据将全部丢失。我们很容易想到的一个解决方案是,从后端数据库恢复这些数据...

2023-12-14 16:50:59 879

原创 12.单线程Redis为什么快

Redis 3.0-单线程Redis的单线程架构首先要明白,Redis的单线程指的是执行命令时的单线程。Redis客户端与服务端的模型可以简化成下图。每次客户端调用都经历了发送命令、执行命令、返回结果三个过程,具体来说是发送命令、接收命令、命令排队、执行命令、返回结果5个过程。我们说的单线程就是在第二步执行命令。一条命令从从客户端达到服务端不会立刻被执行,而是会进入一个...

2023-12-14 16:50:14 922

原创 11.Redis的慢操作之rehash

Redis为什么快它接收到一个键值对操作后,能以微秒级别的速度找到数据,并快速完成操作。数据库这么多,为啥 Redis 能有这么突出的表现呢?内存+数据结构一方面,这是因为它是内存数据库,所有操作都在内存上完成,内存的访问速度本身就很快。另一方面,这要归功于它的数据结构。键值对是按一定的数据结构来组织的,操作键值对最终就是对数据结构进行增删改查操作。所以高效的数据结构是...

2023-09-02 17:35:34 635

原创 10.Redis数据结构之跳表

sortedSetsortedSet是Redis提供的一个非常特别的数据结构,常用作排行榜等功能,将用户id作为value,关注时间或者分数作为score进行排序。与其他数据结构相似,zset也有两种不同的实现,分别是zipList和(hash+skipList)。编码转换规则规则如下:zipList满足以下两个条件[score,value]键值对数量少于128个;每...

2023-08-25 11:30:33 384

原创 9.Redis数据结构之整数数组

Redis中的Set与Java中的HashSet一样,无序且存储元素不重复。Redis的集合对象Set使用了intset和hashtable两种数据结构存储。intset我们可以理解为数组,hashtable就是普通的哈希表(key为Set集合中元素的值,value为null)。当value是整数值时,且数据量不大时使用inset来存储,其他情况都是用字典dict来存储。比如我有1个Set...

2023-08-25 09:01:29 348

原创 8.Redis数据结构之ZipList

highlight: arduino-lightZipList数组存储的不是对象而是对象的引用先看一段伪代码,伪代码如下javaList<Integer> list = new ArrayList<>();​list.add(1);​Integer element = list.get(0);​list.remove(0);​System...

2023-08-24 09:40:25 210

原创 7.Redis数据结构之SDS简单动态字符串

highlight: arduino-light高效的数据结构redis中的数据结构有2种意思:redis本质上是一个hashmapredis键值对中的值的数据类型,也就是数据的保存形式,常用的有5种:String(字符串)、List(列表)、Hash(哈希)、Set(集合)、Sorted Set(有序集合)。这几种几种对外暴露的数据结构它们的底层编码方式都是做了不同的优化的...

2023-08-24 08:40:08 93

原创 6.redis常用命令汇总

KEYS命令: KEYS PATTERNKeys 命令用于查找所有符合给定模式 pattern 的 key 。redis 127.0.0.1:6379> KEYS PATTERN​//查找以 runoob 为开头的 key:redis 127.0.0.1:6379> SET runoob1 redisOKredis 127.0.0.1:6379> SET ru...

2023-08-23 08:54:11 137

原创 5.redis数据结构之SortedSet

zset-有序集合Sortedset又叫zsetSortedset是有序集合,可排序的,但是唯一。Sortedset和set的不同之处,是会给set中的元素添加一个分数,然后通过这个分数进行排序?增加元素:ZADD KEY SCORE1 VALUE1 SCORE2 VALUE2向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入...

2023-08-23 08:52:03 596

原创 4.redis数据结构之Set

Set-集合类型:S集合类型:无序、不可重复命令增加元素 :SADD key member [member ...]sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。假如集合 key 不存在,则创建一个只包含添加的元素作成员的集合。当集合 key 不是集合类型时,返回一个错误。​语法:SADD key member [member ...]...

2023-08-22 08:17:33 80

原创 3.redis数据结构之List

List-列表类型:L&R列表类型:有序、可重复Arraylist和linkedlist的区别Arraylist是使用数组来存储数据,特点:查询快、增删慢Linkedlist是使用双向链表存储数据,特点:增删快、查询慢,但是查询链表两端的数据也很快。Redis的list是采用来链表来存储的,所以对于redis的list数据类型的操作,是操作list的两端数据来操作的。...

2023-08-22 07:41:40 1411

原创 2.redis数据结构之Hash

Hash-散列类型:H为什么选择Hash?假设有User对象以JSON序列化的形式存储到Redis中,User对象有id,username、password、age、name等属性,存储的过程如下:保存、更新:User对象 -> json(string) -> redis如果在业务上只是更新age属性,其他的属性并不做更新我应该怎么做呢? 如果仍然采用上边的方法在传...

2023-08-21 20:30:23 99

原创 1.redis数据结构之String

String命令1. 赋值:SET key value语法:SET key valueredis127.0.0.1:6379> set test 123OK2. 取值:GET key语法:GET keyredis127.0.0.1:6379> get test"123"3. 取值并赋值:getset key value返回旧值并赋上新值...

2023-08-21 20:12:29 66

原创 34.Netty源码之Netty如何处理网络请求

highlight: arduino-light通过前面两节源码课程的学习,我们知道 Netty 在服务端启动时会为创建 NioServerSocketChannel,当客户端新连接接入时又会创建 NioSocketChannel,不管是服务端还是客户端 Channel,在创建时都会初始化自己的 ChannelPipeline。如果把 Netty 比作成一个生产车间,那么 Reacto...

2023-08-19 09:22:55 1222

原创 33.Netty源码之读写数据

highlight: arduino-light写数据写数据的三种方式md快递场景(包裹) Netty 写数据(数据)揽收到仓库 write:写到一个 buffer从仓库发货 flush: 把 buffer 里的数据发送出去揽收到仓库并立马发货 (加急件) writeAndFlush:写到 buffer,立马发送揽收与发货之间有个缓冲的仓库 Writ...

2023-08-19 09:18:11 198

原创 32.Netty源码之服务端如何处理客户端新建连接

highlight: arduino-light服务端如何处理客户端新建连接Netty 服务端完全启动后,就可以对外工作了。接下来 Netty 服务端是如何处理客户端新建连接的呢?主要分为四步:mdBoss NioEventLoop 线程轮询客户端新连接 OP_ACCEPT 事件;​构造 初始化Netty 客户端 NioSocketChannel;​注册 Netty 客...

2023-08-17 09:17:01 1131

原创 31.Netty源码之客户端启动流程

highlight: arduino-light客户端启动主要流程如果看了服务器端的启动流程,这里简单看下就可以了。javapackage io.netty.server;​import io.netty.bootstrap.Bootstrap;import io.netty.channel.*;import io.netty.channel.nio.NioEventLo...

2023-08-17 09:07:14 548

原创 30.Netty源码服务端启动主要流程

highlight: arduino-light服务端启动主要流程•创建 selector •创建 server socket channel •初始化 server socket channel •给 server socket channel 从 boss group 中选择一个 NioEventLoop •将 server socket channel 注册到选择...

2023-08-16 20:23:08 913

原创 29.Netty源码之服务端启动:创建EventLoop&Selector流程

highlight: arduino-light源码篇:从 Linux 出发深入剖析服务端启动流程通过前几章课程的学习,我们已经对 Netty 的技术思想和基本原理有了初步的认识,从今天这节课开始我们将正式进入 Netty 核心源码学习的课程。希望能够通过源码解析的方式让你更加深入理解 Netty 的精髓,如 Netty 的设计思想、工程技巧等,为之后继续深入研究 Netty 打下坚实...

2023-08-16 20:12:28 482

原创 28.Netty源码之缓存一致性协议

Mpsc Queue 基础知识Mpsc 的全称是 Multi Producer Single Consumer,多生产者单消费者。Mpsc Queue 可以保证多个生产者同时访问队列是线程安全的,而且同一时刻只允许一个消费者从队列中读取数据。 Netty Reactor 线程中任务队列 taskQueue 必须满足多个生产者可以同时提交任务,所以 JCTools 提供的 Mpsc Queue ...

2023-08-11 09:29:05 1001

原创 27.Netty源码之FastThreadLocal

highlight: arduino-lightFastThreadLocalFastThreadLocal 的实现与 ThreadLocal 非常类似,Netty 为 FastThreadLocal 量身打造了 FastThreadLocalThread 和 InternalThreadLocalMap 两个重要的类。下面我们看下这两个类是如何实现的。FastThreadLoca...

2023-08-11 09:13:33 1375

原创 26.Netty源码之ThreadLocal

highlight: arduino-lightJDK ThreadLocal如果你需要变量在多线程之间隔离,或者在同线程内的类和方法中共享,那么 ThreadLocal 大显身手的时候就到了。ThreadLocal 可以理解为线程本地变量,它是 Java 并发编程中非常重要的一个类。ThreadLocal 为变量在每个线程中都创建了一个副本,该副本只能被当前线程访问,多线程之间是...

2023-08-09 19:31:43 1027

原创 25.Netty源码之零拷贝

highlight: arduino-lightI/O 加速:与众不同的 Netty 零拷贝技术零拷贝是一个耳熟能详的词语,在 Linux、Kafka、RocketMQ 等知名的产品中都有使用,通常用于提升 I/O 性能。而且零拷贝也是面试过程中的高频问题,那么你知道零拷贝体现在哪些地方吗?Netty 的零拷贝技术又是如何实现的呢? 为什么要有DMA技术?在没有 DMA 技术前...

2023-08-09 19:26:59 90

原创 24.Netty源码之合理管理堆内存

highlight: arduino-light合理管理 Netty 堆外内存内存使用目标•内存占用少(空间) •应用速度快(时间)即多快好省对 Java 而言:减少 Full GC 的 STW(Stop the world)时间内存使用技巧• 减少对象本身大小md例 1:用基本类型就不要用包装类。例 2: 应该定义成类变量(静态变量)的不要定义为实例变量。...

2023-08-08 20:23:24 1385

原创 23.Netty源码之内置解码器

highlight: arduino-lightNetty内置的解码器在前两节课我们介绍了 TCP 拆包/粘包的问题,以及如何使用 Netty 实现自定义协议的编解码。可以看到,网络通信的底层实现,Netty 都已经帮我们封装好了,我们只需要扩展 ChannelHandler 实现自定义的编解码逻辑即可。更加人性化的是,Netty 提供了很多开箱即用的解码器,这些解码器基本覆盖了 ...

2023-08-08 20:04:15 550

原创 4.反转链表

highlight: arduino-lighthttps://leetcode.cn/problems/reverse-linked-list/description/给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例 1:输入: head = [1,2,3,4,5]输出: [5,4,3,2,1]示例 2:输入: head = [1...

2023-08-04 23:14:07 92

原创 3.环形链表

highlight: arduino-light题目链接:https://leetcode.cn/problems/linked-list-cycle/description/环形链表给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数pos来表示...

2023-08-04 23:02:29 81

原创 22.Netty源码之解码器

highlight: arduino-light抽象解码类https://mp.weixin.qq.com/s/526p5f9fgtZu7yYq5j7LiQ解码器Netty 常用解码器类型:ByteToMessageDecoder/ReplayingDecoder 将字节流解码为消息对象;MessageToMessageDecoder 将一种消息类型解码为另外一种消息类...

2023-08-02 17:10:39 1145

原创 21.Netty源码之编码器

highlight: arduino-lightNetty如何实现自定义通信协议在学习完如何设计协议之后,我们又该如何在 Netty 中实现自定义的通信协议呢?其实 Netty 作为一个非常优秀的网络通信框架,已经为我们提供了非常丰富的编解码抽象基类,帮助我们更方便地基于这些抽象基类扩展实现自定义协议。首先我们看下 Netty 中常用的编解码器有哪些。一次编解码器和二次编解码器...

2023-08-02 17:05:35 1168

原创 2.计算2数之和

highlight: arduino-light力扣题目链接: https://leetcode.cn/problems/add-two-numbers/description/给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,...

2023-08-01 23:15:57 98

原创 1.两数相加

力扣题目链接:https://leetcode.cn/problems/two-sum/给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入: nums = [2...

2023-08-01 23:11:17 163

原创 20.Netty源码之通用协议

既然是网络编程,自然离不开通信协议,应用层之间通信需要实现各种各样的网络协议。在项目开发的过程中,我们就需要去构建满足自己业务场景的应用层协议。在上节课中我们介绍了如何使用网络协议解决 TCP 拆包/粘包的底层问题,本节课我们将在此基础上继续讨论如何设计一个高效、可扩展、易维护的自定义通信协议,以及如何使用 Netty 实现自定义通信协议。通信协议设计所谓协议,就是通信双方事先商量好的接口...

2023-07-31 20:12:06 98

原创 19.Netty源码之粘包/拆包

本节课开始我们将学习 Netty 通信过程中的编解码技术。编解码技术这是实现网络通信的基础,让我们可以定义任何满足业务需求的应用层协议。在网络编程中,我们经常会使用各种网络传输协议,其中 TCP 是最常用的协议。我们首先需要了解的是 TCP 最基本的拆包/粘包问题以及常用的解决方案,才能更好地理解 Netty 的编解码框架。为什么会出现拆包/粘包现象呢?UDP没有拆包半包提...

2023-07-31 20:06:23 171

原创 18.Netty源码之ByteBuf 详解

highlight: arduino-lightByteBuf 是 Netty 的数据容器,所有网络通信中字节流的传输都是通过 ByteBuf 完成的。然而 JDK NIO 包中已经提供了类似的 ByteBuffer 类,为什么 Netty 还要去重复造轮子呢?本节课我会详细地讲解 ByteBuf。JDK NIO的ByteBuffer我们首先介绍下 JDK NIO 的 Byte...

2023-07-28 11:05:35 1938

原创 1.7Netty源码之writeAndFlush处理流程剖析

highlight: arduino-light数据传输:writeAndFlush 处理流程剖析Pipeline 事件传播回顾当我们从客户端向服务端发送请求,或者服务端向客户端响应请求结果都属于出站处理器 ChannelOutboundHandler 的行为,所以当我们调用 writeAndFlush 时,数据一定会在 Pipeline 中进行传播。在这里我首先抛出几个问题,...

2023-07-28 06:53:00 786

原创 16.Netty源码之ChannelPipeline

highlight: arduino-light服务编排层:ChannelPipeline协调ChannelHandlerHandlerEventLoop可以说是 Netty 的调度中心,负责监听多种事件类型:I/O 事件、信号事件、定时事件等,然而实际的业务处理逻辑则是由 ChannelPipeline 中所定义的 ChannelHandler 完成的,ChannelPipeline...

2023-07-27 18:22:14 1431

原创 15.Netty源码之EventLoop

highlight: arduino-lightNetty配置主从Reactor模式通过将NioServerSocketChannel绑定到了bossGroup。将NioServerSocketChannel接收到请求创建的SocketChannel放入workerGroup。将2个不同的SocketChannel绑定到2个不同的Group完成了主从 Reactor 模式。...

2023-07-27 18:09:53 1736

空空如也

空空如也

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

TA关注的人

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