![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 90
记录Java学习笔记以及工作中遇到的问题
王二蛋!
关注公众号:Hi程序员 参加赠书活动、金三银四面试。
展开
-
一致性哈希在分库分表的应用
一致性哈希算法在分库分表的应用中提供了一种高效、均匀且易于扩展的数据分布方式,同时在节点增减时最小化数据迁移成本,是一种还不错的分库分表方案。原创 2023-11-05 17:08:50 · 896 阅读 · 3 评论 -
布隆过滤器的应用和原理
不知道大家在面试时有没有被问过“如何在大量数据中快速检测某个数据是否存在”。如果有过相关的思考和解决方案,看看你的方案是否和本文一样。如果还没有,那希望看了本文后可以给你提供一些启发和帮助,以备之后的使用和面试。布隆过滤器是1970年一个叫布隆的人提出来的,主要用于检测一个元素是否在一个集合里。其空间效率和查询时间都远远超过一般的算法,但是会存在一定的失误率,下面对其进行详细说明。在这个数据大爆炸的时代,布隆过滤器适用于大量的场景,比如redis的缓存穿透怎么处理、垃圾邮件过滤、数据去重等。原创 2023-10-30 10:44:10 · 1005 阅读 · 8 评论 -
为什么红黑树比AVL树效率高?
为什么红黑树比AVL树效率高?1. 红黑树是为了解决AVL树频繁旋转导致效率低下被提出。2. AVL树平衡性取决于左右子树高度差(不能大于1,比较严格),红黑树平衡性取决于红黑节点的分布(模糊,宽松)。3. 红黑树效率高于AVL树具体体现在:红黑树的最长链和最短链之间的长度差不会超过两倍。4. 红黑树和AVL树两者整体的复杂度都为O(log n)。原创 2023-10-23 18:07:17 · 3868 阅读 · 24 评论 -
大白话聊AVL树
上文对常见的数据结构进行了简单介绍,包括它们的定义、性质和特点。本文将对AVL树展开介绍,通过对AVL树的插入、删除、查找以及旋转操作全面掌握AVL树。AVL是一棵自平衡的查找二叉树。AVL的平衡性取决于某个节点的左右子树高度差是否大于1。当插入或删除节点时可能会导致树的不平衡。有4种不平衡的情况:LL、RR、LR、RL。当出现不平衡的情况需要通过旋转节点保持平衡。LL:向右旋转一次。RR:向左旋转一次。LR:左子节点先左旋转一次,自己再向右旋转一次。原创 2023-10-20 15:47:53 · 4672 阅读 · 14 评论 -
常见的数据结构及应用
数据结构是计算机存储、组织数据的方式。在工作中,我们通常会直接使用已经封装好的集合API,这样可以更高效地完成任务。但是作为一名程序员,掌握数据结构是非常重要的,因为它可以帮助我们更好地理解和设计算法,从而提高程序的效率和可靠性。本文将对常见的几种数据结构进行介绍,通过了解这些数据结构的特点和优势,可以更好地在不同场景下选择合适的数据结构。常见的数据结构大体分为两种类型:线性和非线性。线性数据结构见名思义,整体结构的图像是一条直线。包括数组、链表、栈、队列等。非线性数据结构包括,树、堆、图等。原创 2023-10-17 17:14:25 · 1315 阅读 · 5 评论 -
Zookeeper 源码分析流程
Zookeeper 作为分布式协调服务为分布式系统提供了一些基础服务,如:命名服务、配置管理、同步等,使得开发者可以更加轻松地处理分布式问题。在分布式系统中,协调是一项关键任务。例如,如何让一组独立的进程或机器知道它们应该执行哪些任务,如何将它们的状态同步到其他进程或机器上,以及如何处理故障或异常等。这些问题都是 Zookeeper 所解决的问题。本文将带你深入了解 Zookeeper 的内部实现,从其各个组件和接口开始,分析其工作原理和设计思想。原创 2023-09-17 09:46:09 · 585 阅读 · 0 评论 -
基于 Zookeeper 实现分布式锁
在分布式系统中,确保数据的一致性和避免冲突是一个核心问题,通常我们通过分布式锁来解决,分布式锁本质是一种同步机制,用于控制对共享资源或临界区的访问。Zookeeper 作为分布式协调服务,为分布式锁的实现提供了一个有效的平台,本文将通过一个简单的示例介绍如何基于 Zookeeper 提供的接口和机制实现分布式锁。在实现分布式锁上Zookeeper的特性提供了很大的帮助,并且它的高可用性、强一致性使得分布式锁变得更加可靠和高效。原创 2023-09-17 09:38:07 · 173 阅读 · 0 评论 -
使用 Netty 实现群聊功能的步骤和注意事项
通过之前的文章介绍,我们可以深刻认识到Netty在网络编程领域的卓越表现和强大实力。这篇文章将介绍如何利用 Netty 框架开发一个 WebSocket 服务端,从而实现一个简单的在线聊天功能。原创 2023-08-30 15:37:00 · 1389 阅读 · 10 评论 -
基于 Zookeeper 实现服务注册和服务发现
无论是采用SOA还是微服务架构,都需要使用服务注册和服务发现组件。我刚开始接触 Dubbo 时一直对服务注册/发现以及 Zookeeper 的作用感到困惑,现在看来是因为对分布式系统的理解不够深入,对 Dubbo 和 Zookeeper 的工作原理不够清楚。本文将基于 Zookeeper 实现服务注册和服务发现功能,如果跟我一样有同样的困惑,希望可以通过本文了解其他组件如何使用 Zookeeper 作为注册中心的工作原理。原创 2023-09-04 07:00:00 · 2907 阅读 · 13 评论 -
Netty为什么高效,为什么这么受欢迎?
上篇文章通过 Java NIO 的处理流程与 Netty 的总体流程比较,并结合 Netty 的源码,可以更加清晰地理解Netty。本文将结合源码详细解析Netty的高效和强大功能的设计原理,学习 Netty 是如何实现其卓越的性能和功能特性,也希望可以在日后工作中利用到 Netty 的设计思想。原创 2023-08-21 14:42:49 · 614 阅读 · 40 评论 -
以 Java NIO 的角度理解 Netty
由于 Netty 的抽象程度较高,因此理解起来可能会更加复杂和具有挑战性,所以本文将通过 Java NIO 的处理流程与 Netty 的总体流程比较,并结合 Netty 的源码更加清晰地理解Netty。原创 2023-08-17 17:15:08 · 1721 阅读 · 41 评论 -
Netty 入门指南
上文《BIO、NIO、IO多路复用模型详细介绍&Java NIO 网络编程》介绍了几种IO模型以及Java NIO,了解了在网络编程时使用哪种模型可以提高系统性能及效率。即使Java NIO可以帮助开发人员编写和维护网络应用程序,但由于其复杂性以及bug问题,还是诞生很多强大和流行的网络编程框架,比如Netty、Undertow、Grizzly,在平时的开发中大家更倾向于选择这些框架进行开发,而在我们学习和理解网络编程的底层原理时,使用Java NIO可以更加直接和深入地了解底层操作。原创 2023-08-03 18:30:19 · 777 阅读 · 56 评论 -
Spring Boot 最全的面试题
Spring Boot常见的面试题原创 2022-10-24 19:40:31 · 44 阅读 · 0 评论 -
BIO、NIO、IO多路复用模型详细介绍&Java NIO 网络编程
上文介绍了网络编程的基础知识,并基于 Java 编写了 BIO 的网络编程。我们知道 BIO 模型是存在巨大问题的,比如 C10K 问题,其本质就是因其阻塞原因,导致如果想要承受更多的请求就必须有足够多的线程,但是足够多的线程会带来内存占用问题、CPU上下文切换带来的性能问题,从而造成服务端崩溃的现象。怎么解决这一问题呢?优化呗,所以后面就有了NIO、AIO、IO多路复用。本文将对这几个模型详细说明并基于 Java 编写 NIO。原创 2023-08-01 20:35:25 · 3842 阅读 · 67 评论 -
Java 网络编程基础
一个网络请求、服务之间的调用都需要进行网络通讯,在日常开发时我们可能并不会关心我们的服务端是怎么接收到请求的、调用别的服务是怎么调用的,都是直接使用现成的框架或工具,比如,Tomcat、Dubbo、OkHttp等提供网络服务的框架。作为程序员,我们还是要知其然知其所以然。本文将介绍在 Java 中如何进行网络编程以及网络编程的基础知识。原创 2023-07-27 20:27:54 · 2497 阅读 · 42 评论 -
SpringBoot Starter 作用及原理
有没有在入行后直接基于 SpringBoot 开发项目,没有 spring、servlet 开发经历的,举个手😄。有没有用 SpringBoot 开发项目,但是第一次听说 Starter 或者听过却不知道是干嘛的,举个手😄。有没有知道 Starter 是干嘛的,但不知其原理的,举个手😄。有没有想了解 Starter 原理或想自己实现一个 Starter 提供别人使用的,举个手😄。如果有以上情况的,希望通过本文可以帮助你了解 Starter。原创 2023-04-20 17:20:24 · 6877 阅读 · 15 评论 -
限流算法(计数器、滑动时间窗口、漏斗、令牌)原理以及代码实现
什么是限流?限流 限流 就是限制流量。在高并发、高流量的场景中我们需要把限流做好,防止突发的流量、恶意的攻击等大量请求的冲击带来不必要的影响,保证业务系统的正常运行。如何限流?首先我们需要知道限流的基本思路,其次需要知道限流的几种实现方式(这里我们叫限流算法)。限流的基本思路就是在一个单位时间内流量超过某个阈值后被拒绝或限制。目前常见的限流算法有计数器(固定时间窗口)算法、滑动时间窗口算法、漏斗算法、令牌算法。原创 2023-04-14 16:57:50 · 3995 阅读 · 11 评论 -
SpringBoot集成Dubbo启用gRPC协议
Dubbo 在 2.7.5 版本开始支持原生 gRPC 协议,对于计划使用 HTTP/2 通信或者期望 gRPC 协议支持服务治理能力的,都可以考虑接入 Dubbo 体系启用 gRPC 协议。由于官网给的 代码示例 是基于 spring,现在基本上都是基于SpringBoot开发,所以本文提供一下 SpringBoot 的代码示例。此外还会简单说明 Dubbo 支持的原生 gRPC 协议与原生 gRPC 协议在代码开发时的区别。如果对gRPC协议不了解的,后续文章会有更新,请持续关注。原创 2023-04-12 11:21:30 · 2610 阅读 · 2 评论 -
Maven项目中的依赖出现版本冲突,最终发现是对Dependency Scope理解有误
通过这次版本冲突问题,让我意识到我对maven的了解远远不够。平时只是对其使用,出现冲突直接解决,并不会去深究为什么。也是通过这次的问题让我对maven多了点了解,让我对解决问题的方式更加深刻:遇到问题不要上来就百度😂,要学会分析、要学会在官网上寻找问题所在,要对一个知识有全面的了解。原创 2023-04-06 18:12:15 · 2020 阅读 · 8 评论 -
设计一个高流量高并发的系统需要关注哪些点
做好一个高流量高并发的系统,不论前端还是后端,过程中每一个步骤都是至关重要的。设计一个系统除了满足功能性,还要考虑兼容性、易用性、可靠性、安全性、可维护性、可移植性等软件质量。同时要对系统的吞吐量、并发数、平均响应时间等指标要完全掌握,在指标异常时可以快速做出决策避免一系列问题发生。原创 2023-03-28 15:37:57 · 1370 阅读 · 26 评论 -
SpringBoot解析指定Yaml配置文件
我们通常在SpringBoot项目中用配置文件属性时使用@ConfigurationProperties或@Value默认配置文件的属性值,也就是application.yml或者application.properties文件中的属性值。但是不能全都往默认配置文件里堆的,本文利用@PropertySource和@ConfigurationProperties注解引用其它配置文件的属性值。原创 2023-03-21 15:35:37 · 3627 阅读 · 15 评论 -
九种分布式ID解决方案
背景:在复杂的分布式系统中,往往需要对大量的数据进行唯一标识,比如在对一个订单表进行了分库分表操作,这时候数据库的自增ID显然不能作为某个订单的唯一标识1、UUID2、数据库自增ID2.1、主键表2.2、ID自增步长设置3、号段模式4、Redis INCR5、雪花算法6、美团(Leaf)7、百度(Uidgenerator)8、滴滴(TinyID)总结比较原创 2023-02-27 17:12:14 · 3079 阅读 · 22 评论 -
Spring Cloud 集成Seata分布式事务(Seata+Nacos+OpenFeign)
Seata版本1.5.0 快速搭建Seata1.5.0版本直接是一个SpringBoot项目,下载后修改 文件中注册中心、配置中心、存储模式配置。原创 2023-02-10 15:23:37 · 6144 阅读 · 8 评论 -
Lambda&Stream入门到实战
1. java8新特性2. Lambda表达式是一个匿名函数,有以下特性: a. 通过使用Lambda表达式使代码简洁、紧凑 b. 匿名函数可以作为参数、返回值。Stream流的目的是增强容器的操作:List、Set、Queue等。专注于对容器对象的聚合操作提供串行/并行两种模式提高编程效率、可读性。原创 2023-01-10 14:56:05 · 342 阅读 · 0 评论 -
什么是云原生
云原生是一类技术的统称,通过云原生技术可以构建出更易于弹性伸缩的应用程序,这些应用程序可以运行在不同环境当中,比如公有云、私有云和混合云。云原生代表的技术包括容器、服务网格、微服务、不可变基础设施和声明式API等。这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。原创 2022-05-30 20:43:56 · 744 阅读 · 0 评论 -
Java整合RocketMQ实现生产消费
如果由于网络闪断、生产者应用重启等原因,导致某条事务消息的二次确认丢失,Broker 端会通过扫描发现某条消息长期处于“半事务消息”时,需要主动向消息生产者询问该消息的最终状态(Commit或是Rollback)。这样最终保证了本地事务执行成功,下游就能收到消息,本地事务执行失败,下游就收不到消息。Pull是客户端需要主动到服务端取数据,优点是客户端可以依据自己的消费能力进行消费,但拉取的频率也需要用户自己控制,拉取频繁容易造成服务端和客户端的压力,拉取间隔长又容易造成消费不及时。原创 2022-12-29 14:31:14 · 3392 阅读 · 1 评论 -
SpringBoot整合RabbitMQ实现死信队列
消费者使用basic.reject或basic.nack(重新排队参数设置为false)对消息进行否定确认。消息到达生存时间还未被消费。队列超过长度限制,消息被丢弃。这些消息会被发送到死信交换机并路由到死信队列中(在RabbitMQ中死信交换机和死信队列就是普通的交换机和队列)。其流转过程如下图。原创 2022-12-14 17:14:19 · 1729 阅读 · 3 评论 -
深入浅出设计模式,跟着思路快速理解
设计模式目的是为了代码可重用,降低代码的耦合度,提高代码的可扩展性、可维护性,不可为了使用设计模式而过度设计,要平衡复杂度和灵活性。原创 2022-07-06 21:36:34 · 566 阅读 · 0 评论 -
基于Tomcate、java、websocket 简单在线聊天
基于Tomcate、java、websocket 简单在线聊天前言 一直以来对于这个在线聊天有很大兴趣,但是一直没有学习入口,可能也是因为工作原因,没精力去深究这玩意,前段时间为了了解这个socket,还专门看了几章TCP/IP协议,想说稍微了解了解,后来没坚持两天,为什么呢! 看不懂... 后来直接上手吧,各种socket,线程。终于像个样了,不过是以图形化界面的形式展示出来,不像我想象中原创 2017-02-27 10:38:47 · 350 阅读 · 0 评论 -
JVM-垃圾回收,一个对象产生到灭亡的过程
前言什么是垃圾?在堆内存中占用空间而不被任何对象引用的对象,我们称之为垃圾(Garbage),而垃圾收集器(Garbage Collector)的工作即是通过一些列算法对这些垃圾进行清理。内存运行时区域中的程序计数器、虚拟机栈、本地方法栈3个区域生命周期随着线程的生存而生存,而堆和方法区被各线程共享,因此垃圾回收器所关注的是这部分的内存。垃圾定位哪些是垃圾?垃圾回收器进行垃圾回收前的第一个步骤就是确定哪些对象是存活的,哪些对象是被抛弃的,通过引用计数、根可达分析两种算法来定位。引用计数:给对象原创 2021-03-07 19:01:49 · 432 阅读 · 6 评论 -
JVM-调优思路,实战经验
基础概念吞吐量:用户代码执行时间/(用户代码执行时间+垃圾回收时间)响应时间:STW(stop the word)越短,响应时间越好首先要确定追求什么?吞吐量优先还是响应时间优先?还是 在满足一定的响应时间的情况下,要求达到多大的吞吐量.吞吐量优先的一般选择(PS+PO)垃圾回收器响应时间优先一般选用G1垃圾回收器什么是调优根据需求进行JVM规划和预调优优化JVM运行坏境解决JVM运行过程中出现的各种OOM从规划开始熟悉业务场景,选择垃圾回收器计算内存需求选定CPU原创 2021-03-07 19:10:07 · 242 阅读 · 0 评论 -
RabbitMQ如何保证消息的可靠性
当消息持久化至队列时已经保证了消息的可靠投递,消费者设置手动ACK,在业务处理完成后ACK保证消息的正常消费。构建channel时添加确认监听机制,当消息未发送至交换机时做补偿措施。以下实现为Java整合RabbitMQ实现,参考。中的架构模型,如下图。原创 2022-12-13 14:53:52 · 548 阅读 · 5 评论 -
SpringBoot整合Kafka简单配置实现生产消费
简单实现生产及消费,包括生产消费的配置说明、消费着offset自定义seek等原创 2022-12-05 18:18:52 · 2941 阅读 · 1 评论 -
Java整合Kafka实现生产及消费
Java整合Kafka。生产者参数配置、消费参数配置、生产自定义分区策略、生产到指定分区、设置offset根据时间戳获取 offset指定从头开始消费指定从某offset开始消费原创 2022-12-02 18:04:10 · 3859 阅读 · 0 评论 -
Linux安装JDK1.8
Linux 安装JDK1.8包含安装包原创 2022-11-29 14:47:17 · 1384 阅读 · 0 评论