- 博客(37)
- 收藏
- 关注
原创 并发服务器框架——zinx
Zinx 是一个用 Go 语言编写的高性能、轻量级的 TCP 服务器框架,它被设计为简单、快速且易于使用。Zinx 提供了一系列的功能,包括但不限于连接管理、数据编解码、业务处理、负载均衡等,适用于构建各种 TCP 网络服务,如游戏服务器、即时通讯服务器等。下面实现zinx的多个功能包括:路由、全局配置、消息封装、读写分离、消息队列、链接管理等。utils包下GlobalObj.go。
2025-01-05 16:53:54
1259
原创 golang实现生产者消费者模式
在Go语言中,生产者消费者模式可以通过使用Goroutines和Channels来实现。Goroutines允许并发执行,而Channels则用于在生产者和消费者之间安全地传递数据。同步:使用Channel来同步生产者和消费者之间的操作,确保数据的安全传递。生产者:负责生成数据并将其放入一个共享的缓冲区(Channel)。消费者:从共享的缓冲区中取出数据并进行处理。生产者消费者模式的基本思路。建立一个channel。
2024-12-27 10:20:04
663
原创 JVM和数据库面试知识点
栈中的数据时线程私有的,不会被其他线程访问的,所以时线程安全的。本地方法栈与虚拟机栈的区别是,虚拟机栈执行的是 Java 方法,本地方法栈执行的是本地方法(Native Method),其他基本上一致,在 HotSpot 中直接把本地方法栈和虚拟机栈合二为一,这里暂时不做过多叙述。堆被所有的线程共享,但是它的访问时线程不安全的,通常通过锁的机制来保证线程安全。有时候,数据库优化器选择的索引并不是最优的,通过强制使用某个索引(即使它失效了),可能会因为减少了优化器的计算开销而提升效率。
2024-12-21 19:42:38
917
原创 学识杂货店
首先对于ThreadLocal而言,本质上其实也是用来解决线程安全问题的,只不过和传统给共享变量加锁的方式不同,他采用的是让这个变量在每个线程中有独有一份,线程内私有就不存在线程安全问题了,从底层源码角度来看,ThreadLocal底层真正存储数据的是ThreadLocalMap对象,是一个Map结构,Map是懒加载的过程,只有一次set的时候才会创建,并且真正持有这个Map的对象是当前线程Thread对象,所以对于Threadlocal的生命周期是随线程的终止而终止的。调用对象的clone()方法。
2024-12-12 10:54:43
1059
原创 知识杂货铺
用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。hashCode方法的主要目的是提供一种快速比较对象的方法,但它不保证相等的对象一定有相同的hashCode值,也不保证不相等的对象一定有不同的hashCode值。定义状态:确定问题的状态,通常是问题的子问题的解。
2024-12-11 14:36:12
1098
原创 Easy背包问题——动态规划
最后一块石头的重量:从一堆石头中,每次拿两块重量分别为x,y的石头,若x=y,则两块石头均粉碎;我们假设两堆分别为A,B,A<sum/2,B>sum/2,若A更接近sum/2,B也相应更接近sum/2。进一步转化:将一堆stone放进最大容量为sum/2的背包,求放进去的石头的最大重量MaxWeight,最终答案即为sum-2*MaxWeight;4、分组背包:这个比较特殊,需要三重循环:外循环背包bags,内部两层循环根据题目的要求转化为1,2,3三种背包类型的模板。
2024-12-05 14:18:43
961
原创 Websocket——化神篇
众所周知,Web 应用的交互过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端,客户端浏览器将信息呈现,这种机制对于信息变化不是特别频繁的应用尚可,但对于实时要求高、海量并发的应用来说显得捉襟见肘,尤其在当前业界移动互联网蓬勃发展的趋势下,高并发与用户实时响应是 Web 应用经常面临的问题,比如金融证券的实时信息,Web 导航应用中的地理位置获取,社交网络的实时消息推送等。当两台主机通信时,必须通过Socket连接,Socket则利用TCP/IP协议建立TCP连接。
2024-11-29 15:25:42
1348
原创 Netty和Protobuf协议结合应用
同时,Protobuf的强类型定义要求在编译时就确定数据结构,这限制了其在需要动态字段处理的应用中的使用。此外,Protobuf的学习曲线相对较陡,需要开发者熟悉.proto文件的语法和protoc编译器的使用,这可能会增加开发和维护的复杂性。Protobuf作为一种高效的结构化数据交换格式,以其跨语言支持、快速的序列化与反序列化能力、以及自动生成代码的特性,在许多高性能分布式系统和微服务架构中发挥着重要作用。此外,Protobuf的向后兼容性和丰富的数据类型支持,使其成为数据存储和通信协议的理想选择。
2024-11-29 10:00:27
1262
原创 java框架Netty网络编程——化神篇
SO_RCVBUF 既可用于 SocketChannal 参数,也可以用于 ServerSocketChannal 参数(建议设置到 ServerSocketChannal 上)负责入站数据的分配,决定入站缓冲区的大小(并可动态调整),统一采用 direct 直接内存,具体池化还是非池化由 allocator 决定。RpcResponseMessageHandler 中 PROMISES集合中的泛型问题:Promise,不能为 Promise<?> 只能用来接收值,不能设置值。ByteBuf 分配器。
2024-11-24 17:33:33
1099
原创 java框架Netty网络编程——问鼎篇
Netty进阶粘包现象案例服务端代码public static void main(String[] args) { NioEventLoopGroup bossGroup=new NioEventLoopGroup(1); NioEventLoopGroup workerGroup=new NioEventLoopGroup(2); try { ServerBootstrap serverBootstrap = new ServerBootstrap();
2024-11-24 14:33:37
699
原创 java框架Netty网络编程——筑基篇
Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。Netty的地位Netty的优势服务器端// 服务端初始化,是一个启动器,将下面的netty组件组合在一起进行初始化启动// 添加eventLoop(循环处理事件)的组集合的组件,eventLoop就是nio中的boss以及worker( selector + thread)// 选择一个ServerSocketChannel的实现,netty支持多种channel,如NIO,BIO,epoll。
2024-11-23 21:00:02
1169
原创 NIO三大组件
现在互联网环境下,分布式系统大相径庭,而分布式系统的根基在于网络编程,而netty恰恰是java领域的网络编程的王者,如果要致力于并发高性能的服务器程序、高性能的客户端程序,必须掌握netty网络编程。NIO是从java1.4开始引入的一种新的I/O编程方式,相对于传统的IO来说,NIO更加灵活、高效、可靠,能够更好的处理海量的数据和高并发场景。简单来说,并发能力强。Channel是数据传输的****
2024-11-22 21:36:36
843
原创 review-消息中间件MQ
在 Spring AMQP 在内部进行消息转化的时候会使用 JDK 自带的序列化方式,这种方法存在着问题,首先 JDK 的序列化存在安全风险,反序列化时容易被代码注入,其次,序列化后的消息占用空间太多,可读性差。在默认情况下是非持久的,可以选择 2 发送持久化的消息,而 Spring AMQP 发送的消息默认是持久化的,我们也可以通过自定义构建消息来发送非持久化的消息。但是,在某些场景下,我们希望不同的消息被不同的队列消费。当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度。
2024-11-18 11:02:05
1592
原创 SpringBoot3全面复习
Springboot3Spring Boot 3是Spring Boot框架的一个主要版本,它基于Spring Framework 6构建,引入了对最新Java版本(如Java 17及以上)的支持,并提供了许多新特性和改进。Spring Boot 3旨在简化Spring应用的初始搭建以及开发过程,通过提供自动配置、起步依赖管理和微服务支持,使得开发者能够快速构建生产级别的基于Spring的应用程序。这个版本强化了对响应式编程和现代云原生应用的支持,同时继续提升性能和可维护性,为构建下一代企业级应用提供了
2024-11-15 19:34:35
1463
原创 SpringMVC全面复习
它通过清晰的分离关注点,简化了Web应用各部分的开发。当我们在Spring容器中配置了HandlerMapping,则就不会在加载默认的HandlerMapping策略了,原理比较简单, DispatcherServlet 在进行HandlerMapping初始化时,先从SpringMVC容器中找是否存在HandlerMapping,如果 存在直接取出容器中的HandlerMapping,在存储到 DispatcherServlet 中的handlerMappings集合中去。
2024-11-13 21:26:04
999
原创 分布式数据库中间件mycat
MyCat允许最终用户使用标准的SQL语句对数据进行操作,无论数据存储在哪种存储方式中,在MyCat中都被视为传统的数据库表,这大大减少了前端业务系统的开发难度并提升了开发速度。此外,MyCat还提供了读写分离、数据分片、数据路由、事务处理等高级功能,支持分布式事务处理,可以保证跨节点事务中数据的一致性和完整性。MyCat的架构包括通信协议、路由解析、结果集处理、数据库连接、监控等模块,能够有效地管理线程,解决高并发问题。,即将一个大表水平分割为多个小表,存储在后端的MySQL服务器或其他数据库中。
2024-11-09 15:32:48
770
原创 快速入门Zookeeper
结果2号服务器启动后依然是跟随者(从服务器),3号服务器依然是领导者(主服务器),没有撼动3号服务器的领导地位。通过其高性能和可靠的特性,ZooKeeper能够确保在复杂的分布式环境中,各个节点和服务之间的协调和通信得以顺利进行。由此得出结论,3个节点的集群,2个从服务器都挂掉,主服务器也无法运行。(2)我们再把1号服务器(从服务器)也停掉,查看2号(主服务器)的状态,发现已经停止运行了。(4)我们把3号服务器也启动起来,把2号服务器停掉,停掉后观察1号和3号的状态。,扮演着分布式系统中至关重要的角色。
2024-11-08 19:26:26
1695
原创 并发编程volatile精解
在多线程并发执行的情况下,多个线程修改共享的成员变量,会出现一个线程修改了共享变量的值后,另一个线程不能直接看到该线程修改后的变量最新值。(多线程下修改共享变量会出现变量修改值后的不可见性)可见性问题的原因所有共享变量存在于主内存中,每个线程由自己的本地内存,而且线程读写共享数据也是通过本地内存交换的,所以才导致了可见性问题。解决方法1、加锁 2、使用volatile关键字(底层实现原理是内存屏障)【并发编程】volatilevolatile修改的变量可以在多线程并发修改下,实现线程间变
2024-11-07 19:18:44
949
原创 Dubbo详解及其应用
Dubbo通过其灵活的配置、强大的容错机制和高效的通信协议,支持开发者构建快速、稳定且易于维护的分布式系统。随着微服务架构的流行,Dubbo成为了企业级应用中实现服务化的关键技术之一,帮助企业实现业务的敏捷响应和系统的弹性伸缩。微服务架构是在SOA做的升华,微服务架构强调的一个重点是“业务需要彻底的组件化和服务化”,原有的单个业务系统会拆分为多个可以独立开发、设计、运行的小应用。(一个大的业务系统,拆分为一个小的业务模块,分别部署在不同的机器上)分布式系统开发的技术成本高,对团队的挑战大。
2024-11-06 21:04:12
1119
原创 JavaWeb复习
是运行在Web服务器端的java应用程序,可以生成动态的Web页面,属于客户与服务器响应的中间层。二者可以实现同样的页面效果,不过编写JSP和servlet相比,前者的成本低的多。我们可以为一个资源配置多个Filter,当配置多个Filter后会有一个执行顺序的问题,实际执行顺序是按照在web.xml文件中servlet-mapping的顺序决定的,如果顺序越靠前越先被调用。JSP声明中可以定义网页中的全局变量。那么每个JSP页面的内容有中文并且想获取这些内容,则都要写上上面的代码,这是一件很繁琐的事情。
2024-11-05 15:28:42
1499
原创 java设计模式之行为型模式(11种)
可以看见,只用了 compare 方法,所以在调用 Arrays.sort 方法只传具体 compare 重写方法的类对象就行,这也是 Comparator 接口中必须要子类实现的一个方法。分为:模板方法模式、策略模式、命令模式、职责链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式。将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分隔开,这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储,传递、调用、增加与管理。
2024-11-03 17:24:11
1753
原创 java设计模式之结构型模式(7种)
Java 中提供了一个动态代理类 Proxy,Proxy 并不是我们上述所说的代理对象的类,而是提供了一个创建代理对象的静态方法(newProxyInstance 方法)来获取代理对象。提供一个工厂类 BoxFactory,用来管理享元对象(也就是 AbstractBox 子类对象),该工厂类对象只需要一个,所以可以使用单例模式,并给工厂类提供一个获取形状的方法。CGLIB 是一个功能强大,高性能的代码生成包,它可以为没有实现接口的类提供代理,为 JDK 的动态代理提供了很好的补充。
2024-11-02 16:51:30
1069
原创 java设计模式之创建者模式(5种)
软件设计模式,又称为设计模式,是一套被反复利用,代码设计经验的总结,他是在软件设计过程中的一些不断发生的问题,以及该问题的解决方案。**创建者模式又分为以下五个模式:**用来描述怎么“将对象的创建和使用分离”
2024-10-31 21:21:22
1496
原创 算法之树状数组详解
对于一个整数 x,x & (-x) 操作的结果就是 x 的二进制表示中最低位的1。这是因为 -x 的二进制表示中,x 的所有位都被取反,然后加1,这样 x 的最低位的1就变成了0,而其他位都是1。因此,x & (-x) 操作实际上就是将 x 与一个只有 x 最低位的1为1,其他位都是0的数进行与操作。(Binary Indexed Tree,简称BIT),也被称为Fenwick树,是一种用于处理数组问题的高效数据结构。对于数组中的第 i 个元素,更新树状数组中所有包含该元素的区间。
2024-10-22 12:00:31
871
原创 算法之并查集
(Union-Find)是一种用于处理不相交集合(Disjoint Sets)的数据结构,操作,特别是在动态场景下,即集合的变化是未知的,并且需要。下面写的是java版的。基于c的并查集的操作。下面写几道力扣题方便大家进行练习。
2024-10-20 10:51:30
679
原创 字典树(前缀树)和后缀树微总结
前缀树(Trie),又称字典树或单词查找树,是一种用于存储字符串集合的数据结构,它能够高效地处理与字符串相关的各种操作,如搜索、插入和删除。前缀树的核心思想是将字符串的公共前缀存储在树的节点路径上,从而实现快速检索。插入操作从根节点开始,对于要插入的字符串的每个字符,如果字符对应的子节点不存在,则创建新节点。节点通常包含一个字符集合,指向子节点的链接,以及一个标志位表示是否有单词在此节点结束。前缀树是正向插入字符的,如果说将字符串倒的插入当然就是后缀树了。从根节点到某个节点的路径表示一个字符串的前缀。
2024-10-19 15:43:40
1162
原创 堆——java中优先队列(下)
在懒删除堆中,当一个元素被删除时,它不会被立即从堆中移除,而是被标记为已删除。对顶堆是一种二叉堆,它在堆的顶部同时维护两个指针,分别指向最大元素和最小元素。这种设计允许对顶堆在对数时间内高效地执行最大元素的查找、最小元素的查找、最大元素的删除和最小元素的删除。"后悔堆"是一种数据结构,它在处理贪心算法问题时,允许我们在做出贪心选择后,如果发现结果不是最优的,可以"反悔"并重新做出选择。这种数据结构的核心思想是,通过维护一个候选解的集合,当当前的选择不是最优解时,可以从这个集合中重新选择一个更好的解。
2024-10-17 20:12:50
518
原创 堆——java中优先队列(上)
堆在数据结构中,堆(Heap)是一种特殊的完全二叉树,它满足特定的性质,主要分为两大类:大顶堆(Max Heap):在大顶堆中,每个节点的值都大于或等于其子节点的值。这意味着堆中的最大元素位于根节点。大顶堆常用于实现优先队列,其中最大元素需要被优先处理或检索。小顶堆(Min Heap):在小顶堆中,每个节点的值都小于或等于其子节点的值。这意味着堆中的最小元素位于根节点。小顶堆同样用于实现优先队列,但在这里,最小元素会被优先处理或检索。优先队列(Priority Queue)Java中
2024-10-17 14:07:33
1059
原创 从入门到精通——差分数组
n],其中 D[i] = A[i] - A[i-1],对于 i = 2, 3, …, n,且 D[1] = A[1](或者可以选择 D[1] = 0,如果 A[1] 是相对于某个已知的起始值)。n],方法是从 A[1] = D[1] 开始,然后对于每个 i(2 ≤ i ≤ n),计算 A[i] = A[i-1] + D[i]。从 A[1] 开始,使用差分数组中的每个差值逐步累加,最终得到的 A[n] 应该与原始数组的最后一个元素相同。差分数组的一个核心定理是,给定一个差分数组,可以唯一地重建原始数组。
2024-10-16 20:26:20
2915
原创 算法思想——单调栈及其运用实例
单调栈是一种数据结构,它维护了一个元素序列,这个序列在栈内要么单调递增,要么单调递减。在单调栈中,新元素的插入操作会遵循特定的规则:对于单调递增栈,只有当新元素大于或等于栈顶元素时,才能将其压入栈中;对于单调递减栈,则相反,只有当新元素小于或等于栈顶元素时,才能将其压入栈中。这种结构保证了栈内的元素顺序在某种意义上是有序的,从而支持高效的元素插入和查询操作。
2024-10-15 11:04:10
1012
原创 详解二叉树的非递归遍历
二叉树的非递归遍历使用栈或队列自身功能(先进后出或先进先出)来实现。对于非常深的树,递归可能导致栈溢出错误,因为每次递归调用都会占用栈空间。非递归遍历使用显式的栈或队列,可以更好地控制内存使用,避免这种问题。
2024-10-10 15:26:55
693
原创 深度理解二分查找思想~
二分思想是将有序数组分成两半,通过比较数组中间元素与目标值大小,来决定下一步搜索的区间是左半部分还是右半部分,然后递归再选定的区间内继续查找。(部分有序的数组也可使用这一思想)
2024-10-08 21:31:15
1235
原创 链表题型微总结
链表是一种动态的数据结构,它是由节点组成,每个节点包含一个数据部分和指向下一个节点的指针。可以动态的增加和删除节点,而不像数组那样预先分配固定大小的存储空间。链表的主要类型有单向链表、双向链表和循环链表。单向链表的每个节点只有一个指向后续节点的指针,双向链表的节点则有两个指针,一个指向前一个节点,一个指向后一个节点,循环链表的尾节点指向头节点或某个中间节点,形成一个闭环。下方鄙人写些习题和做题总结,方便大家进行巩固知识~
2024-10-07 17:46:25
1328
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人