自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Netty-实现群聊系统

编写基础服务端Netty代码。

2024-02-23 04:38:17 616

原创 Netty-编解码

Netty编解码相关的组件有以下⼏个:Channel、ChannelHandler、ChannelPipe等。

2024-02-23 04:36:21 452

原创 Netty-核心组件

注意,⼀个Channel只对应⼀个线程,NioEventLoop和Channel它们是⼀对多的关系。Selector可以监听多个连接的Channel事件,同时可以不断的查询已注册Channel是否处于就绪状态,实现⼀个线程可以⾼效的管理多个Channel。ChannelPipeline实现了⼀种⾼级形式的过滤器模式,在IO操作时发⽣的⼊站和出站事件,会导致ChannelPipeline中的多个ChannelHandler被依次调⽤。Channel是Netty⽹络通信的重要组件,⽤于执⾏⽹络IO操作。

2024-02-22 03:51:39 1011

原创 Netty-初体验

Netty具备设计优雅、使⽤⽅便、性能强劲等优点,

2024-02-22 03:49:52 404

原创 Node.js开发-会话控制

所谓会话控制就是对会话进行控制HTTP 是一种无状态的协议,它没有办法区分多次的请求是否来自于同一个客户端,无法区分用户而产品中又大量存在的这样的需求,所以我们需要通过会话控制来解决该问题常见的会话控制技术有三种:cookiesessiontoken。

2024-02-16 16:51:18 1514

原创 Node.js开发-MongoDB

Mongoose 是一个对象文档模型库,官网。

2024-02-16 16:50:36 713

原创 Node.js开发-express框架

简单来说,express 是一个封装好的工具包,封装了很多功能,便于我们开发 WEB 应用(HTTP 服务)// 2.创建应用对象// 3.创建路由});// 4.监听端口,启动服务console.log("服务已经启动,端口3000正在监听中");});

2024-02-15 03:47:59 1799

原创 Node.js开发-包管理工具

管理『包』的应用软件,可以对「包」进行 下载安装 , 更新 , 删除 , 上传 等操作。命令的作用是将文件夹初始化为一个『包』, 交互式创建。不过 start 别名比较特别,使用时可以省略 run。借助包管理工具,可以快速开发项目,提升开发效率。创建一个空目录,然后以此目录作为工作目录。是包的配置文件,每个包都必须要有。通过配置命令别名可以更简单的执行命令。配置完成之后,可以使用别名执行命令。包的锁文件 ,用来锁定包的版本。下面列举了前端常用的包管理工具。文件夹 存放下载的包。

2024-02-15 03:45:52 730

原创 Node.js开发-HTTP协议

对于未知的资源类型,可以选择 application/octet-stream 类型,浏览器在遇到该类型的响应时,会对响应体内容进行独立存储,也就是常见的 下载 效果。HTTP 服务可以设置响应头 Content-Type 来表明响应体的 MIME 类型,浏览器会根据该类型决定如何处理资源。http.createServer 里的回调函数的执行时机: 当接收到 HTTP 请求的时候,就会执行。响应体内容的类型是非常灵活的,常见的类型有 HTML、CSS、JS、图片、JSON。请求体内容的格式是非常灵活的,

2024-02-14 16:30:17 1749 1

原创 Node.js开发-path模块

path 模块提供了。

2024-02-14 16:23:09 1457

原创 Node.js开发-fs模块

fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动等,还有文件内容的写入、读取,以及文件夹的相关操作。使用 fs 模块的时候,尽量使用 __dirname 将路径转化为绝对路径,这样可以避免相对路径产生的Bug。程序打开一个文件是需要消耗资源的 ,流式写入可以减少打开关闭文件的次数。在计算机中是一个非常常见的操作,下面的场景都用到了文件写入。在 Node.js 中,我们可以使用。在 Node.js 中,我们可以使用。在 Node.js 中,我们可以使用。在 Node.js 中,我们可以使用。

2024-02-13 17:38:15 2162

原创 设计模式-模板方法模式 Template Method

在 Java AbstractList 类中,addAll() 函数可以看作模板方法,add() 是子类需要重写的方法,尽管没有声明为 abstract 的,但函数实现直接抛出了 UnsupportedOperationException 异常。前提是,如果子类不重写是不能使用的。

2024-02-13 16:44:12 1257

原创 设计模式-策略模式 Strategy

策略类的定义比较简单,包含一个策略接口和一组实现这个接口的策略类。因为所有的策略类都实现相同的接口,所以,客户端代码基于接口而非实现编程,可以灵活地替换不同的策略。@Override//具体的算法...@Override//具体的算法...

2024-02-12 17:13:35 1837

原创 设计模式-状态模式 State

状态模式并不是很常用,但是在能够用到的场景里,它可以发挥很大的作用。状态设计模式是一种行为型设计模式,它允许对象在其内部状态发生变化时改变其行为。这种模式可以消除大量的条件语句,并将每个状态的行为封装到单独的类中。上下文(Context):上下文通常包含一个具体状态的引用,用于维护当前状态。上下文委托给当前状态对象处理状态相关行为。抽象状态(State):定义一个接口,用于封装与上下文的特定状态相关的行为。具体状态(Concrete State):实现抽象状态接口,为具体状态定义行为。

2024-02-12 17:12:02 1774

原创 设计模式-观察者模式 Observer

观察者模式是一种行为设计模式,允许对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。在这种模式中,发生状态改变的对象被称为“主题”(Subject),依赖它的对象被称为“观察者”(Observer)。观察者模式(Observer Design Pattern)也被称为发布订阅模式在 GoF 的《设计模式》一书中,它的定义是这样的:翻译成中文就是:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。

2024-02-11 17:02:28 1845

原创 设计模式-职责链模式Chain of Responsibility

在实际的项目开发中比较常用。在框架开发中,我们也可以利用它们来提供框架的扩展点,能够让框架的使用者在不修改框架源码的情况下,基于扩展点定制化框架的功能。

2024-02-11 16:59:31 1718

原创 设计模式-装饰模式 Decorator

这还只是附加了两个增强功能,如果我们需要附加更多的增强功能,那就会导致组合爆炸,类继承结构变得无比复杂,代码既不好扩展,也不好维护。如果 InputStream 只有一个子类 FileInputStream 的话,那我们在 FileInputStream 基础之上,再设计一个孙子类 BufferedFileInputStream,也算是可以接受的,毕竟继承结构还算简单。**第二个比较特殊的地方是:装饰器类是对功能的增强,这也是装饰器模式应用场景的一个重要特点。的抽象方法,用于定义被装饰对象的基本行为。

2024-02-10 18:13:47 1708

原创 设计模式-适配器模式 Adapter

适配器模式的主要目的是在不修改现有代码的情况下,使不兼容的接口能够协同工作。通过引入适配器角色,客户端可以使用目标接口与需要适配的类进行通信,从而实现解耦和扩展性。适配器设计模式(Adapter Design Pattern)是一种结构型设计模式,用于。,使得它们可以协同工作。在实际开发中,应根据具体需求选择使用类适配器还是对象适配器。适配器模式有两种实现方式:类适配器和对象适配器。

2024-02-10 18:11:45 1209

原创 设计模式-建造者模式Builder

我们考虑一个文档编辑器的例子。假设我们需要创建一个复杂的HTML文档,它包含了标题、段落和图像等元素。我们可以使用创建者设计模式来构建HTML文档。2.实现不可变对象。即一旦创建完成,对象的状态就不能改变。这有助于保证对象的线程安全和数据完整性。2.在ssm源码中很多类都使用创建者设计模式,如Spring中的。1.根据复杂的配置项进行定制化构建。类,mybatis中的。

2024-02-09 16:46:48 1409

原创 Java高级-多线程

Lock锁是JDK5开始提供的一个新的锁定操作,通过它可以创建出锁对象进行加锁和解锁,更灵活/方便/强大。不断创建新线程的开销是很大的,并且请求过多时,肯定会产生大量的线程出来。**线程:**线程是属于进程的,一个进程中可以同时运行很多个线程。**作用:**把访问共享资源的核心代码给上锁,一次保证线程安全。IO密集型的任务:核心线程数量 = CPU的核数 * 2。**进程:**正常运行的程序/软件就是一个独立的进程。在案例中添加同步代码块 (实例方法使用。**方式一:**使用。**方式二:**使用。

2024-02-09 16:28:36 847

原创 RabbitMQ-6.延迟消息

RabbitMQ的消息过期是基于追溯方式来实现的,也就是说当一个消息的TTL到期以后不一定会被移除或投递到死信交换机,而是在消息恰好处于队首时才会被处理。当队列中消息堆积很多的时候,过期消息可能不会被按时处理,因此你设置的TTL时间不一定准确。

2024-02-07 16:39:42 1107

原创 RabbitMQ-5.消费者的可靠性

例如我们当前案例中,处理消息的业务逻辑是把订单状态从未支付修改为已支付。我们在用户支付成功后会发送MQ消息到交易服务,修改订单状态为已支付,就可能出现消息重复投递的情况。不过需要注意的是,交易服务并不知道用户会在什么时候支付,如果查询的时机不正确(比如查询的时候用户正在支付中),可能查询到的支付状态也不正确。因此,RabbitMQ必须知道消费者的处理状态,一旦消息处理失败才能重新投递消息。业务判断就是基于业务本身的逻辑或状态来判断是否是重复的请求或消息,不同的业务场景判断的思路也不一样。

2024-02-07 16:36:31 2552

原创 RabbitMQ-4.MQ的可靠性

不过出于性能考虑,为了减少IO次数,发送到MQ的消息并不是逐条持久化到数据库的,而是每隔一段时间批量持久化。为了解决这个问题,从RabbitMQ的3.6.0版本开始,就增加了Lazy Queues的模式,也就是惰性队列。:在开启持久化机制以后,如果同时还开启了生产者确认,那么MQ会在消息持久化以后才发送ACK回执,进一步确保消息的可靠性。消息到达MQ以后,如果MQ不能及时保存,也会导致消息丢失,所以MQ的可靠性也非常重要。在控制台发送消息的时候,可以添加很多参数,而消息的持久化是要配置一个。

2024-02-06 15:16:08 1853 2

原创 RabbitMQ-3.发送者的可靠性

每个只能配置一个,因此我们可以在配置类中统一设置。我们在publisher模块定义一个配置类:@Slf4j@Overridelog.error("触发return callback,");});由于每个消息发送时的处理逻辑不一定相同,因此ConfirmCallback需要在每次发消息时定义。具体来说,是在调用RabbitTemplate中的convertAndSend方法时,多传递一个参数:id:消息的唯一标示,MQ对不同的消息的回执以此做判断,避免混淆。

2024-02-06 15:09:57 1984 1

原创 RabbitMQ-2.SpringAMQP

多个消费者绑定到一个队列,同一条消息只会被一个消费者处理通过设置prefetch来控制消费者预取的消息数量交换机的作用是什么?接收publisher发送的消息将消息按照规则路由到与之绑定的队列不能缓存消息,路由失败,消息丢失FanoutExchange的会将消息路由到每个绑定的队列描述下Direct交换机与Fanout交换机的差异?Fanout交换机将消息路由给每一个与之绑定的队列Direct交换机根据RoutingKey判断路由给哪个队列。

2024-02-05 17:58:18 1771 1

原创 RabbitMQ-1.介绍与安装

消息Broker,目前常见的实现方案就是消息队列(MessageQueue),简称为MQ.追求可用性:Kafka、 RocketMQ 、RabbitMQ追求可靠性:RabbitMQ、RocketMQ追求吞吐能力:RocketMQ、Kafka追求消息低延迟:RabbitMQ、Kafka。

2024-02-05 17:55:54 1539

原创 原理Redis-SkipList

ZipList和QuickList的共同特点是节省内存。在遍历元素时,只能从头到尾或从尾到头,所以在查找头尾元素性能还是不错的,但是中间元素查询的性能就会差。

2023-11-23 03:40:06 530

原创 原理Redis-QuickList

*问题1:**ZipList虽然节省内存,但申请内存必须是连续空间,如果内存占用较多,申请内存效率很低。**问题3:**数据拆分后比较分散,不方便管理和查找,这多个ZipList如何建立联系?除了控制ZipList的大小,QuickList还可以对节点的ZipList做压缩。**问题2:**但是我们要存储大量数据,超出了ZipList最佳的上限该怎么办?如果值为正,则代表ZipList的允许的entry个数的最大值。,所以首尾是不压缩的。

2023-11-23 03:39:03 1059

原创 原理Redis-ZipList

1.压缩列表的可以看做一种连续内存空间的"双向链表"2.列表的节点之间不是通过指针连接,而是记录上一节点和本节点长度来寻址,内存占用较低3.如果列表数据过多,导致链表过长,可能影响查询性能4.增或删较大数据时有可能发生连续更新问题。

2023-11-21 04:08:13 565

原创 原理Redis-Dict字典

类似java的HashTable,底层是数组加链表来解决哈希冲突Dict包含两个哈希表,ht[0]平常用,ht[1]用来rehash当LoadFactor大于5或者LoadFactor大于1并且没有子进程任务时,Dict扩容当LoadFactor小于0.1时,Dict收缩扩容大小为第一个大于等于used + 1的2^n收缩大小为第一个大于等于used 的2^nDict采用渐进式rehash,每次访问Dict时执行一次rehash。

2023-11-21 04:06:36 716

原创 原理Redis-IntSet

4.最后,将inset的encoding属性改为INTSET_ENC_INT32,将length属性改为4。IntSet是Redis中set集合的一种实现方式,基于整数数组来实现,并且具备长度可变、有序等特征。的范围,intset会自动升级编码方式到合适的大小。2.倒序依次将数组中的元素拷贝到扩容后的正确位置。,并按照新的编码方式及元素个数扩容数组。3.将待添加的元素放入数组末尾。

2023-11-20 05:04:31 690

原创 原理Redis-动态字符串SDS

Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。那么Redis将在底层创建两个SDS,其中一个是包含“name”的SDS,另一个是包含“dcy”的SDS。Redis构建了一种新的字符串结构,称为。

2023-11-20 05:03:28 796

原创 基础Redis-Java客户端操作介绍

Jedis以Redis命令作为方法名称,学习成本低,简单实用。但是Jedis实例是线程不安全的,多线程环境下需要基于连接池来使用lettureLettuce是基于Netty实现的,支持同步、异步和响应式编程方式,并且是线程安全的。支持Redis的哨兵模式、集群模式和管道模式。RedissonRedisson是一个基于Redis实现的分布式、可伸缩的Java数据结构集合。包含了诸如Map、Queue、Lock、 Semaphore、AtomicLong等强大功能。

2023-11-05 18:46:09 193

原创 基础Redis-结构与命令

Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样:通用指令是部分数据类型的,都可以使用的指令,常见的有:通过help [command] 可以查看一个命令的具体用法,例如:Redis的key允许有多个单词形成层级结构,多个单词之间用’:'隔开,格式如下:例如我们的项目名称叫 dcyredis,有user和product两种不同类型的数据,可以这样定义key:如果Value是一个Java对象,例如一个User对象,则可以将对象序列化为JSON字符串后存储

2023-11-05 18:41:44 285

原创 MyBatis源码基础-常用类-别名注册器

mybatis提供了。

2023-10-24 18:54:33 186

原创 MyBatis源码基础-常用类-OGNL表达式

有时候也需要对这些上下文环境中的参数进行访问,访问这些参数时,需要通过#符号加上链式表达式来进行,从而表示与访问Root对象(Root Object)的区别。不过,事实上,在OGNL的内部,所有的操作都会在一个特定的数据环境中运行,这个数据环境就是OGNL的上下文环境(Context)。针对OGNL的Root对象的对象树的访问是通过使用“点号”将对象的引用串联起来实现的。表达式是整个OGNL的核心,所有的OGNL操作都是针对表达式的解析结果进行处理的。OGNL的Root对象可以理解为OGNL的操作对象。

2023-10-24 18:53:15 267

原创 MyBatis源码基础-常用类-Configuration

可以将xml的配置文件解析成为一个配置类。一个包装了XPathParser的工具类。

2023-10-23 20:59:13 195

原创 MyBatis源码基础-常用类-XPathParser

根目录下的html下的body元素下的第二个div下的第二个div下的第三个div下的第一个div下的第一个div。谓语是用来查找某个【特定的节点或者包含某个指定的值】的节点。通常,谓语被嵌在方括号中。我们使用mybatis提供的XPathParser对mybatis.xml进行解析。通过在路径表达式中使用“|”运算符,您可以选取若干个路径。XPath 通配符可用来选取未知的 XML 元素。XPath解析器可以很简单的使用。该工具的核心作用就是。

2023-10-23 20:50:54 82

原创 MongoDB-索引Index

索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。如果查询存在适当的索引,MongoDB可以使用该索引限制必须检查的文档数。索引是特殊的数据结构,它以易于遍历的形式存储集合数据集的一小部分。索引存储特定字段或一组字段的值,按字段值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。

2023-10-09 19:00:22 384

原创 MongoDB-基本常用命令

选择切换数据库:use articledb插入数据:db.comment.insert({bson数据})查询所有数据:db.comment.find();条件查询数据:db.comment.find({条件})查询符合条件的第一条记录:db.comment.findOne({条件})查询符合条件的前几条记录:db.comment.find({条件}).limit(条数)查询符合条件的跳过的记录:db.comment.find({条件}).skip(条数)

2023-10-09 18:23:08 500

空空如也

空空如也

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

TA关注的人

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