自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Netty源码分析之编码器分析

文章目录writeAndFlush刷新buffer队列writeAndFlushwriteAndFlush:实际上进行的是write操作,和flush操作。如果我们自己定义的业务逻辑的handler没有重写write方法,那么在业务逻辑中调用ctx.write会从tailcontext一直传递到headcontext。最后调用AbstractUnsafe的write方法将数据写入到发送缓冲区。AbstractChannel.Abstractunsafe@Override publi

2021-06-25 14:58:57 232

原创 Netty-新连接接入检测(源码分析)

文章目录新连接检测创建NioSocketChannel新连接分配线程和selector注册向selector注册读事件新连接检测NioEventLoop: /** * 以新连接接入分析处理过程为例 * @param k * @param ch */ private void processSelectedKey(SelectionKey k, AbstractNioChannel ch) { final AbstractNioCha

2021-06-24 16:14:00 313

原创 Netty-NioEventLoop 源码分析

文章目录创建NioEventLoopNioEventLoop的启动NioEventLoop执行逻辑select()检查io事件: 重点分析处理io事件:创建NioEventLoop public NioEventLoopGroup(int nThreads, Executor executor) { /** * executor:创建底层线程 * SelectorProvider.provider() * provider负责创

2021-06-24 10:26:19 191

原创 Netty-服务端channl的创建(源码分析)

文章目录服务端启动的流程创建服务端channel初始化服务端channel注册selector端口绑定服务端启动的流程创建服务端channelAbstractBootstrap.java private ChannelFuture doBind(final SocketAddress localAddress) { /** * initAndRegister():创建服务端的channel */ final ChannelF

2021-06-23 16:09:35 326

原创 tcp三次握手与四次挥手,还有一些重点知识

文章目录Tcp的三次握手首先来回答一个经典问题:为什么是三次,而不是四次,两次?tcp四次挥手经典问题 为什么客户端在TIME_WAIT状态必须等待2MSL的时间呢?为什么要四次挥手:CLOSE-WAIT:ps:复习一些网络原理的小知识TCP与UDP报文段中字段的作用:udptcp报文段网络层ip数据报格式Http协议:HTTP与HTTPS区别浏览器输入URL过程这是这个专栏的第一篇文章。首先介绍一下tcp报文头的格式:前面几个字段就不用了介绍了吧,接下来就介绍一些重要的标志字段,SYN是发起一个连

2021-05-14 21:22:32 202

原创 Netty编解码器源码分析(上)(详细分析在注释中说明)

文章目录行解码器:以/r/n 或者/n结尾的字节流基于分隔符解码器分析基于长度域解码器分析总结步骤:解码定义:解码是指将二进制数据流转换成一个个bytebuf.首先分析解码器顶层抽象类@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { // 可以看到是基于ByteBuf进行解码的 if (msg instanceof ByteBuf) {

2021-05-09 20:22:51 217

原创 Redis作为缓存的使用以及使用注意事项

文章目录Redis使用的场景:redis缓存的类型:只读缓存:读写缓存:同步直写:异步写回:只读缓存与读写缓存的选择:缓存写满后的键淘汰策略:LRU:redis如何实现lru算法:volatile-ttl:LFU 缓存策略:工作原理:实现原理:缓存异常:缓存雪崩:缓存击穿缓存穿透Redis使用的场景:redis作为缓存使用时,我们会部署在数据库的前端,业务应用在访问数据时,会先查询 Redis 中是否保存了相应的数据。如果存在则命中缓存,读取redis中的数据,性能就会很快。如果redis中没有相应的数

2021-05-09 10:33:31 2277 1

原创 Nioeventloop源码走读分析

文章目录Nioeventloop的创建创建chooserNioeventloop的启动NioEventloop的执行Nioeventloop的创建创建Nioeventloop的过程中,主要做了三件事情。1:创建一个线程创建器 new ThreadPerTaskExecutor() [线程创建器]2: for(){new Child()} [构造Nioeventloop]3:chooserFactory.new Chooser() 创建线程选择器NioeventloopGroup.java

2021-04-28 16:58:47 148

原创 Netty源码分析之NioSocketChannel源码走读

文章目录开篇词netty新连接接入处理逻辑:源码分析开篇词我希望大家能够带着问题来学习本篇文章,在这里我给大家提出两个问题。第一个Netty是在哪里检测到有新连接接入的。第二个新连接是怎样注册到Nioeventlooop线程当中的。netty新连接接入处理逻辑:检测新连接接入,是通过serverchannnel绑定的selector轮询到accept事件,基于jdk的channel创建出netty的NioSocketChannel。接着netty给客户端channel分配一个Nioeventloop

2021-04-28 10:16:16 370

原创 Netty源码分析之pipeline中事件传播(Netty4)

文章目录添加ChannelHandlerContext删除channelHandlerinbound事件的传播添加ChannelHandlerContext// 实例代码 ,首先通过addLast()方法进行添加 ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class)

2021-04-26 22:43:52 230

翻译 Redis 官方文档阅读之 High Availability

文章目录Distributed nature of Sentinel(sentinel的分布式特性)Quick StartObtaining Sentinel(获取哨兵)Running SentinelFundamental things to know about Sentinel before deploying(再部署之前必须要知道的关于哨兵的基本信息)Configuring SentinelOther Sentinel options(其他sentinel选项)Example Sentinel de

2021-04-25 17:17:56 807

原创 设计模式之建造者模式

文章目录建造者模式定义建造者模式中出现的角色定义产品类bulilder抽象构建者ConcreteBuilder具体建造者Director类代码实现建造者模式使用场景建造者模式定义建造者模式就是将一个复杂对象的构建(同一类的不同实现)在客户端隐藏起来实现细节,可以使得同样的构建过程可以创建不同的表示。建造者模式中出现的角色定义产品类我们想要构建的产品,每种产品都有自己的实现细。bulilder抽象构建者构造我们上面提到的同一产品类不同实现ConcreteBuilder具体建造者实现抽象类定义

2021-03-24 15:02:21 171

原创 设计模式之观察者模式

文章目录观察者模式定义:观察者模式中出现的角色:被观察者代码实现观察者代码实现ConcreteSubject(具体的被观察者)代码实现ConcreteObserver具体的观察者观察者模式的优劣观察者模式应用观察者模式应该考虑的问题观察者模式定义:观察者模式(Observer Pattern) 也叫做发布订阅模式,定义对象间一种一对多的依赖关系, 使得每当一个对象改变状态, 则所有订阅它的对象都会得到通知消息。观察者模式中出现的角色:被观察者一般是抽象类或者是实现类, 仅仅完成作为被观察者必须

2021-03-23 23:06:20 109

原创 redis中有关事务的特性

文章目录事务的四个特性:redis如何实现事务redis的事务机制能否保证ACID原子性:一致性事务的四个特性:ACID:原子性:一个事务中的多个操作要么都完成,要么都不完成。一致性:数据库中的数据在事务执行前后是一致的。隔离性:要求数据库在执行一个事务时,其它操作无法存取到正在执行事务访问的数据持久性:数据库执行事务后,数据的修改要被持久化保存下来redis如何实现事务1:客户端开启事务命令:multi2:客户端把事务中本身要执行的具体操作(例如增删改数据)发送给服务器端。Redis 实

2021-03-22 20:48:49 1335

原创 Redis的分布式锁

文章目录分布式锁为何可以用Redis实现?我们所说的分布式锁到底是什么?如何实现分布式锁基于多个redis节点实现分布式锁:加锁操作:分布式锁为何可以用Redis实现?我们都已经知道redis可以被称为经典的key-value数据库,而在分布式系统中,当有多个客户端需要获取锁时,我们需要分布式锁。此时,锁是保存在一个共享存储系统中的,可以被多个客户端共享访问和获取。同时Redis 本身可以被多个客户端共享访问,正好就是一个共享存储系统,可以用来保存分布式锁。而且 Redis 的读写性能高,可以应对高并发

2021-03-22 19:51:54 205

原创 设计模式之迭代器模式

文章目录迭代器模式的定义迭代器中定义的对象Iterator抽象迭代器ConcreteIterator实现上面的抽象迭代器Aggregate抽象容器Concrete Aggregate具体容器代码实现迭代器模式的定义它提供一种方法访问一个容器对象中各个元素, 而又不需暴露该对象的内部细节。注意这里的设计模式需要关注的重点是如何创建一个迭代器,还有我们使用的集合对象是定义在哪里?。迭代器中定义的对象Iterator抽象迭代器负责定义访问和遍历元素的接口,基本上是有固定的3个方法: first()获得第

2021-03-22 18:02:52 190

原创 设计模式之策略模式

文章目录策略模式定义:代码实现基本策略接口:具体策略:屏蔽具体算法的实现类客户端调用:策略模式缺点策略模式定义:定义一组算法, 将每个算法都封装起来, 并且使它们之间可以互换。代码实现基本策略接口:public interface Strategy {//策略模式的运算法则public void doSomething();}具体策略:public class ConcreteStrategy1 implements Strategy {public void doSomething

2021-03-19 21:12:24 196

原创 设计模式之装饰模式

文章目录装饰模式简介:装饰模式中出现的角色Component抽象构件ComponentConcreteComponentDecorator具体装饰角色具体实现用例执行结果:调用链分析装饰模式使用场景:装饰模式简介:装饰模式就是动态地给一个对象添加一些额外的职责,在一个类的基础上,在不改变原有类的情况下,在外部对类的功能进行扩展。装饰模式中出现的角色Component抽象构件Component是一个接口或者是抽象类, 就是我们定义我们最核心的对象。ConcreteComponentConcre

2021-03-18 22:49:52 260

原创 redis数据结构底层编码,Api使用,使用场景(5000字)

redis常用数据结构以及底层编码

2021-03-18 21:17:41 537

原创 设计模式之责任链模式

文章目录责任链模式简介责任链模式中出现的角色抽象处理者具体的处理者client端源代码实现抽象处理者伪代码具体处理者伪代码客户端伪代码责任链模式简介简单解释说就是将客户端发来的请求,交给一个处理者进行处理,而这个处理者是否具有处理能力客户端是不需要关注的,如果这个处理者没有处理能力,那么它会将客户端请求,发送给它所知道的下沿处理者,而请求的传递过程,对于客户端来说是透明的,知道请求被处理,然后返回,如果没有相应的处理者,则返回错误。总结上面所说的就是,责任链模式使多个对象都有机会处理请求, 从而避免了

2021-03-16 23:31:31 197

原创 利用redis实现的布隆过滤器

文章目录布隆过滤器的使用场景布隆过滤器实现原理布隆过滤器的误差布隆过滤器的使用场景在redis缓存的那篇文章中,讲到了出现缓存穿透的时候,因为redis和数据库都没有数据,所以如果出现大量的空返回,这样无意义的值,大量的查询打到redis和数据库当中,会对两者的性能产生较大的性能影响。所以在这里我们使用布隆过滤器(bloom filter)在进入redis查询前来判断所要查询的数据是否存在。下面介绍一下bloom filter实现原理。布隆过滤器实现原理首先布隆过滤器要有1个二进制数组,然后准备一批

2021-03-12 21:10:43 788

原创 Redis Sentine高可用架构原理分析

1:sentinel中故障转移切换的流程2:sentinel如何与master和slave通信。3:如何发现故障。4:选出领导者的流程。5:主sentinel对新的主节点做了什么,还有从节点。文章目录redis高可用的解决方案:SentinelRedis Sentinel功能:redis各个功能探究以及功能补充通知:sentinel节点会将故障转移的结果通知给应用方。监控:sentinel会定期检测主节点与副节点是否按照我们预期的工作。redis高可用的解决方案:Sentinelredis s

2021-03-06 11:03:39 350 1

原创 初识单例模式

文章目录单例模式简介单例模式通用代码单例模式优点:单例模式缺点单例模式的使用场景单例模式简介Ensure a class has only one instance, and provide a global point of access to it.确保每一个类只有一个实例,并且提供一个全局指针能够访问这个实例。单例模式通用代码// 饿汉式单例public class Singleton{// 自行实例化private static Singleton singleton =new Si

2021-03-05 20:32:48 76

原创 redis的主从复制原理

文章目录引子复制两种使用方式主从复制原理保存主节点信息:主从建立socket连接发送ping命令:权限验证同步数据命令持续复制全量复制与增量复制:全量同步过程:部分复制:心跳检测机制引子在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,复制功能是高可用redis的基础,redis哨兵机制以及集群都是在复制的基础上实现高可用。复制两种使用方式// 在从节点客户端执行如下命令,让其成为某个主节点的从节点:slaveof ip port// 断开复制slaveof no on

2021-03-05 11:05:04 922 2

原创 Redis的持久化选择AOF or RDB,以及选择策略

文章目录持久化的作用:RDB(Snapshot)如何触发RDBRDB三种触发方式RDB隐藏触发方式bgsave验证AOF:AOF运行原理AOF三种策略AOF重写aof动态开启策略:AOF重写实现方式:AOF重写配置推荐策略:持久化的作用:为什么要进行持久化?对于redis来说,因为它是一个内存数据库,数据都放在内存中,如果没有持久化机制,那么当机器重启或者redis宕掉后,数据都会丢失,这样对于我们来说是无法容忍的,所以接下来我们来介绍redis的两种持久化机制AOF 和RDB。RDB(Snapsho

2021-03-04 19:41:23 684 1

原创 redis的慢查询,发布订阅,pipeline以及其他有趣的功能

开篇慢查询日志redis的慢查询日志功能用于记录执行时间超过指定时长的命令。下图描述了一次命令的生命周期,而慢查询工作在第三阶段慢查询日志服务端配置slowlog-log-slower-than(单位是微秒,指定超过执行时间的命令会被记录到慢查询日志上)slowlog-max-len指定服务器最多保存多少慢查询日志(因为慢查询日志保存的队列是有界的)动态配置config set slowlog-log-slower-than 0// =0 则代表我们想要统计所有命

2021-03-03 15:22:46 124

空空如也

空空如也

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

TA关注的人

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