- 博客(77)
- 收藏
- 关注
原创 浅谈JAVA中的SPI机制
SPI,全称Service Provider Interface, 是Java中提供的一种服务发现机制,它允许应用程序动态地加载和使用第三方提供的服务实现,而无需在代码中显示引用这些实现类。通过将服务接口和其实现分离,从而具备更加好的可扩展性和可维护性。Java SPI就是提供这样的一个机制:为某个接口寻找服务实现的机制,将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。所以SPI的核心思想就是解耦。
2024-09-02 16:16:19
431
原创 【负载均衡】
可解决以下问题消息发送的容灾策略:您可以根据生产者负载均衡策略,明确当局部节点出现故障时,消息发送如何进行容灾切换。消息发送的顺序性机制:通过生产者负载均衡策略,您可以进一步了解顺序消息发送时,如何保证相同消息组内消息的先后顺序。消息服务能力的均衡性策略:了解生产者负载均衡策略,您可以知晓消息在不同节点间分配的规律,您可以按照负载策略针对性地设计流量迁移和水平扩缩容的方案。
2024-09-02 16:13:41
1089
原创 Git-详解 :从入门到精通
Git 是一个开源的分布式版本控制系统,由 Linus Torvalds 在 2005 年创建,用于有效、高速地处理从小到大的项目版本管理。本文将详细介绍 Git 的基本概念、工作流程、常用命令以及一些高级技巧,帮助读者从入门到精通 Git。
2024-08-15 17:28:13
532
原创 Linux-零拷贝技术
在传统的数据传输过程中,数据需要从磁盘读取到内核空间的缓冲区,然后再从内核空间拷贝到用户空间的应用程序缓冲区。如果需要将数据发送到网络,数据还需要再次从用户空间拷贝到内核空间的网络缓冲区。这个过程涉及到多次数据拷贝,增加了系统的开销。零拷贝技术通过减少或消除这些不必要的数据拷贝步骤来提高效率。在零拷贝的情况下,数据可以直接从磁盘传输到网络,或者从网络传输到磁盘,而无需经过用户空间的缓冲区。
2024-08-15 17:18:47
678
原创 一个简单的灰度发布案例(基于Apollo配置开关)
当达到灰度比例最大值时,对所有用户(包含未登录用户)均使用新接口。未达到灰度比例最大值时,对已登录用户进行判断是否进行切流。
2024-08-14 15:54:14
447
原创 布隆过滤器
布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,主要用于判断一个元素是否可能属于某个集合。它的基本原理是利用位数组(Bitmap)和一组哈希函数来实现快速且近似的存在性查询。
2024-08-01 10:06:08
866
原创 Eureka的介绍与使用
Eureka是微服务架构中不可或缺的服务发现工具。通过服务注册与发现,它简化了服务间的通信,提高了系统的可用性和伸缩性。结合Spring Cloud,Eureka的使用变得更加简单和强大。Eureka是微服务世界中的一盏明灯,照亮了服务之间的互相发现之路。如果你正在构建一个微服务系统,Eureka绝对值得一试。以上就是Eureka的介绍与使用指南。希望这篇博客能帮助你快速上手Eureka,为你的微服务架构增添一份稳健的服务发现能力。
2024-08-01 09:59:01
421
原创 什么是幂等
幂等(idempotent、idempotence)是一个数学与计算机学概念,在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。可以把这句话大白话一点,那就是对于幂等性字段值是一样的必须永远给出同一个结果,不能给出两个不同的结果。在我们的系统设计里面,所有的写操作都是需要具备幂等性的,否则非常容易出现故障。
2024-07-23 15:26:22
1618
原创 如何减少开发过程中的bug-数据库篇
如果一条SQL没加索引,或者没有命中索引的话,就会产生慢查询。死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。= 或者 < >,not in)时,可能会导致索引失效。索引字段上使用is null, is not null,可能导致索引失效。,可以这样,返回上次查询的最大记录(偏移量),再往下limit。联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。在索引列上使用mysql的内置函数,索引失效。对索引列运算(如,+、-、*、/),索引失效。
2024-07-09 14:03:29
661
原创 面对数据不一致性的解决方案:
所以在瞬时进行写和读的操作时,是不可避免会存在数据一致性问题,导致这个数据一致性问题的原因不是事务,而是多副本日志同步水位不一致导致的。polarDB是读写分离和计算存储分离的分布式数据库,并且副本的log replicate是基于。
2024-07-09 13:59:57
291
原创 【LeetCode-300.最长递增子序列】
是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。最长递增子序列是 [2,3,7,101],因此长度为 4。,找到其中最长严格递增子序列的长度。
2024-03-25 15:03:51
339
原创 【并发编程---上】
充分利用多核CPU的计算能力:通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升方便进行业务拆分,提升系统并发能力和性能:在特殊的业务场景下,先天的就适合于并发编程。多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
2024-03-25 14:59:48
905
原创 【LeetCode-45.跳跃游戏】
从下标为 0 跳到下标为 1 的位置,跳。向前跳转的最大长度。生成的测试用例可以到达。跳到最后一个位置的最小跳跃数是。步到达数组的最后一个位置。处,你可以跳转到任意。
2024-03-24 20:24:03
408
原创 【LeetCode-322.零钱兑换】
如果没有任何一种硬币组合能组成总金额,返回。,表示不同面额的硬币;你可以认为每种硬币的数量是无限的。计算并返回可以凑成总金额所需的。
2024-03-24 20:22:22
342
原创 【LeetCode-394.字符串解码】
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数。给定一个经过编码的字符串,返回它解码后的字符串。,表示其中方括号内部的。
2024-03-23 21:32:42
396
原创 【LeetCode-153.寻找旋转排序数组的最小值】
它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的。原数组为 [0,1,2,4,5,6,7] ,旋转 3 次得到输入数组。原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。的数组,预先按照升序排列,经由。你必须设计一个时间复杂度为。
2024-03-22 21:23:07
481
原创 Java开发面试小结Day1
首先,DELETE是一个数据操作语言(DML)命令,主要用于从表中删除部分或全部元组,即删除表中的特定行。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。使用这些命令时,你可以将它们组合起来,通过管道(|)将一个命令的输出作为另一个命令的输入,从而执行更复杂的操作。在数据库设计中,视图是一个非常重要的工具,它可以帮助开发人员和数据库管理员更好地组织和管理数据,提高系统的性能和可维护性。
2024-03-20 21:56:18
1345
原创 【Leetcode-19.删除链表的第N个节点】
使用栈结构(先进后出)特性进行解答。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。你能尝试使用一趟扫描实现吗?
2024-03-18 17:07:25
324
原创 【Leetcode-21合并两个有序链表】
如果 l1 或者 l2 一开始就是空链表 ,那么没有任何操作需要合并,所以我们只需要返回非空链表。否则,我们要判断 l1 和 l2 哪一个链表的头节点的值更小,然后递归地决定下一个添加到结果里的节点。如果两个链表有一个为空,递归结束。新链表是通过拼接给定的两个链表的所有节点组成的。我们直接将以上递归过程建模,同时需要考虑边界情况。将两个升序链表合并为一个新的。
2024-03-18 17:04:48
478
原创 【Leetcode-54.螺旋矩阵】
2.其次向右移动到最右,此时第一行因为已经使用过了,可以将其从图中删去,体现在代码中就是重新定义上边界;4.若上下边界不交错,则遍历还未结束,接着向下向左向上移动,操作过程与第一,二步同理;3.判断若重新定义后,上下边界交错,表明螺旋矩阵遍历结束,跳出循环,返回答案;5.不断循环以上步骤,直到某两条边界交错,跳出循环,返回答案。,返回矩阵中的所有元素。1.首先设定上下左右边界;
2024-03-17 10:42:35
410
原创 【Leetcode-189.轮转数组】
我们可以使用额外的数组来将每个元素放至正确的位置。用 len 表示数组的长度,我们遍历原数组,将原数组下标为 i 的元素放至新数组下标为 (i+k)mod len 的位置,最后将新数组拷贝至原数组即可。向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100],将数组中的元素向右轮转。
2024-03-14 19:36:47
242
原创 【leetcode-53最大子数组和】
dp[n - 1] 都看一遍,取最大值。根据状态的定义,由于 nums[i] 一定会被选取,并且以 nums[i] 结尾的连续子数组与以 nums[i - 1] 结尾的连续子数组只相差一个元素 nums[i]。而子问题的定义必须以一个数结尾,因此如果子问题 i 的结果是负数或者 000,那么子问题 i + 1 的答案就是以 nums[i] 结尾的那个数。简单的动态规划问题,很有可能问的问题就可以设计成为子问题,复杂的动态规划问题就没有那么容易看出子问题应该如何设计了,这需要一定的解决问题的经验。
2024-03-14 19:05:27
909
原创 ArrayList 和 Vector 的区别是什么?
①线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是。③扩容:ArrayList 和 Vector 都会根据实际的需要动态的调整容量,只不过在 Vector 扩容每。这两个类都实现了 List 接口(List 接口继承了 Collection 接口),他们都是有序集合。Vector类的所有方法都是同步的。Arraylist不是同步的,所以在不需要保证线程安全时时建议使用Arraylist。
2024-03-10 21:01:36
152
1
原创 ArrayList 和 LinkedList 的区别是什么?
①数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结。③增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为。综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作。双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前。还存储了两个引用,一个指向前一个元素,一个指向后一个元素。
2024-03-10 21:00:37
173
原创 遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java中 List 遍历的最佳实践是什么?
①如果一个数据集合实现了该接口,就意味着它支持 Random Access,按位置读取元素的平。推荐的做法就是,支持 Random Access 的列表可用 for 循环遍历,否则建议用 Iterator。据集合的特点,统一遍历集合的接口。②如果没有实现该接口,表示不支持 Random Access,如LinkedList。2. 迭代器遍历,Iterator。缺点是只能做简单的遍。1. for 循环遍历,基于计数器。历,不能在遍历过程中操作数据集合,例如删除、替换。置的元素,当读取到最后一个元素后停止。
2024-03-10 20:58:39
844
原创 Java集合的快速失败机制 “fail-fast”?
1. 在遍历过程中,所有涉及到改变modCount值得地方全部加上synchronized。例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,原因:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount。集合在被遍历期间如果内容发生变化,就会改变modCount的值。是java集合的一种错误检测机制,当多个线程对集合进行结构上的改变的操作时,有可能。在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的。
2024-03-10 20:55:55
107
原创 List,Set,Map三者的区别?List、Set、Map 是否继承自Collection 接口?List、Map、Set 三个接口存取元素时,各有什么特点?
Java 容器分为 Collection 和 Map 两大类,Collection集合的子接口有Set、List、Queue。多个null元素,元素都有索引。Map没有继承于Collection接口,从Map集合中检索元素时,只要给出键。我们比较常用的是Set、List,Map接口不是collection的子接口。是一个键值对集合,存储键、值和之间的映射。一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入。一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入。
2024-03-10 20:53:29
305
原创 人工智能与大数据:技术前沿与实践
在当今信息爆炸的时代,人工智能(AI)与大数据已经成为推动社会进步的重要力量。本文将探讨这两项技术的最新发展,以及如何将其应用于实践。
2024-01-31 22:34:54
707
原创 JVM 执行引擎
JVM 的将字节码装载到内存,但字节码。随着时间的推移,编译器把越来越多的代码编译成本地代码,此时运行本地机器指令,编译器把代码编译成本地代码需要一定的执行时间,但编译为本地代码后。执行引擎的翻译过程有两种:1、通过解释器将字节码文件转为机器指令执行;为了执行内存中的字节码文件指令,执行引擎。则会将字节码文件编译为机器指令,存在方法区中,编译完成后直接执行本。用即时编译器(JIT)将字节码文件的二进制流编译成机器指令执行。解释器可以马上发挥作用,省去编译的时间,立即执行。获得更高的执行效率。
2024-01-31 22:24:16
368
原创 JVM 内存模型
常量数据会存放到方法区的常量池中,不管是基本数据类型还是引用数据类型都会存放常量池的地址。则无法继续运行程序。引用数据类型将值的引用存放到虚拟机栈中,而对象存放在堆内存中,引用数据类型占用 4。每一个线程都会对应一个虚拟机栈,线程中的每个方法都会创建一个栈帧,存放本次方法执。当线程被销毁的时候,共享区的数据不会立即回收,需要等待达到垃圾回收的阈(yu)存放当前线程中所声明的变量,包括基本数据类型的数据和引用数据类型的引用。执行的方法一定在栈顶,我们只能获取栈顶的栈帧,栈帧在虚拟机栈中先进后出。
2024-01-30 14:51:27
771
原创 类加载机制
父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器。如果父类加载器可以完成类加载任务,就成功返回。如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给。<JAVA_HOME>/lib/ext 中,是启动类加载器的子类。倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载。(1)验证:验证被加载类的正确性:如文件的格式,元数据等。(3)解析:把类的符号引用转为直接引用。主要加载 JAVA 中的一些拓展类,位于。
2024-01-30 14:44:06
355
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人