- 博客(130)
- 收藏
- 关注
原创 分布式事务
分布式事务是一个复杂的问题,没有银弹。不同的实现方式有不同的优缺点和适用场景。选择哪种方案取决于具体的业务需求、系统架构和技术栈。RocketMQ 支持事务消息,可以实现分布式事务。其原理类似于 2PC,但依赖于消息队列而不是数据库。TCC 通常被认为是。
2025-02-16 22:36:13
685
原创 动态规划之背包问题
枚举:我们可以用0和1来表示当前物品是不是取了,0表示没有取,1表示取了,比如说有三个物品,001,那么001表示第一个物品取了,第二个和第三个物品都没有取。个这个物品的时候,不一定需要一个一个地去遍历,我们可以像计算机存储数字的二进制一样,通过一些数字来组合成你想要的数字。当我们考虑了前i个物品取还是不取的情况,如果有两组方案的体积是一样的,保留最大收益的即可。如果数据量很大的时候,就需要对其进行优化,能够进行优化的点就是在将一个能取。组物品之后,总体积为0,1,2,3,4,5,…所以,我们可以用一个。
2025-01-29 19:52:35
574
原创 Linux命令复习
是 Linux 系统中用于显示文件系统的磁盘空间使用情况的命令。,我们可以显示进程的运行状态、进程 ID、所属用户、CPU 和内存占用等信息,适用于实时监控和问题诊断。free 命令能够显示系统中物理上的空闲和已用内存,还有交换内存,同时,也能显示被内核使用的缓冲和缓存。是 Linux 系统中用于实时监视系统性能和运行状态的命令行工具,它提供了系统的。格式的文件,是 Linux 和 Unix 系统中常用的工具。是 Linux 系统中用于查看系统中运行进程的命令。显示的是执行命令时刻的静态快照。
2024-12-31 16:19:50
998
原创 力扣150题
返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。请注意,输入数组是以**「引用」**方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。**进阶:**尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。**进阶:**如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用。**注意:**最终,合并后数组不应由函数返回,而是存储在数组。的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
2024-12-22 20:30:36
1307
原创 交换机是如何避免数据碰撞的(详细解释 + 示例)
独立冲突域:每个端口独立,通信互不干扰。全双工通信:设备同时发送和接收数据。MAC地址学习和转发:数据仅发往目标端口。交换矩阵并行处理:多路通信同时进行。流量控制:动态协调发送和接收,避免过载。举例说明的核心在于,交换机智能管理每条通信路径,实现无冲突的高效网络传输。
2024-12-14 16:19:20
887
原创 MySQL中的redoLog
Redo log 存储的是数据库的操作记录,而不是原始数据,主要用于事务恢复。它的内容包括事务的修改操作,确保数据一致性和恢复能力。
2024-12-06 17:03:02
608
原创 MySQL的锁
而8刚好是在(5,10)这个间歇锁的范围内,所以session B的插入语句会被阻塞,而session C的插入语句不会被阻塞,10不在(5,10)的区间内。首先session A要给索引c上c=5这一行加上读锁。这个例子是关于覆盖索引上的锁。
2024-12-06 16:37:39
394
原创 设计模式- Java
新播放器接口:定义新版本播放器支持的播放方法。旧播放器接口:定义老版本播放器支持的播放方法。// 新播放器接口// 旧播放器接口// 区域接口,所有的区域类(省、市等)都需要实现这个接口// 获取该区域的人口数// 接口,真实角色和代理角色都实现这个接口// 处理者接口,每个处理者处理某个请求,或者将请求传递给下一个处理者// 设置下一个处理者// 处理请求责任链模式通过将多个处理对象连接成一个链条,让请求在链中传递,直到某个处理对象能够处理它为止。
2024-12-02 21:11:01
805
原创 批量缓存模版
缓存通常有两种使用方式,一种是Cache-Aside,一种是cache-through。也就是旁路缓存和缓存即数据源。一般一种用于读,另一种用于读写。参考。比如Spring-Cache就是Cache-Aside,只需要写上load逻辑,加上注解,就可以实现Cache-Aside缓存的效果了。但是这种缓存存在一个缺陷,如果我们需要获取一批用户信息,碰巧用户的缓存全都失效了(也就是缓存雪崩),就需要去数据库中全部拉出来,那么这样一个本来性能很高的循环,就等同于全部查了数据库,缓存一点儿作用都没了。
2024-11-10 21:44:25
981
原创 RocketMQ部署教程
为了设置账户密码,需要在 Broker 的配置文件中启用 ACL(访问控制列表)。NameServer 是 RocketMQ 的核心组件之一,负责管理路由信息。为了方便管理和监控,您可以部署 RocketMQ 控制台。首先,拉取控制台镜像:。为了使各容器之间能够通信,创建一个名为。,使用配置的账户密码登录控制台。上述配置创建了一个用户名为。的管理员账户,且仅允许来自。用于启用 ACL 功能。此时,可以通过浏览器访问。然后,在该目录下创建。
2024-11-08 22:42:30
857
原创 为什么表数据删掉一半,表文件大小不变?
这种标记删除的方式带来了一些优势,比如快速删除操作,以及可能会在后续插入操作中复用这些标记删除的空间。:如果数据页的使用率下降到一定程度(比如删除了大部分记录),InnoDB 可能会将这个数据页中的剩余记录移动到相邻页中,然后将该数据页标记为空闲页。每个数据页有固定的大小,页内存储数据记录。:InnoDB 的数据存储在 B+ 树的结构中,数据页(数据存储的基本单位)即使被完全腾空,也不会立刻释放。这意味着如果你在表中插入新的记录,系统会尝试将它们填充到先前删除的数据位置上,而不立即分配新的空间。
2024-11-07 23:59:05
1130
原创 synchronized的优化
如果偏向锁是开启的,并且没有延迟,有延迟的不会刚开始就创建偏向锁刚开始从无锁状态—>偏向锁的状态然后如果有有人与偏向锁的持有者进行竞争就会升级会轻量锁然后从偏向锁状态—>轻量锁如果继续有人和轻量锁的持有者竞争,一开始会尝试自旋获取锁,因为重量级锁对性能的损耗还是比较大。如果自旋过程中获取到了锁,就不会升级为重量级的锁如果自选过程中没有获取到锁,就会升级会重量级别的锁。
2024-10-30 14:05:01
578
原创 MySQL为什么有时候会选错索引
然后,我们往表 t 中插入 10 万行记录,取值按整数递增,即:(1,1,1),(2,2,2),(3,3,3) 直到 (100000,100000,100000)。首先从磁盘中随机加载N份数据页,然后统计不同的值,取得平均值后乘以索引页面的数量,当变更的数据行数超过 1/M 的时候,会自动触发重新做一次索引统计。MySQL中索引的选择是由优化器来决定的,而决定用什么索引的原因有很多,比如 区分度、扫描行数、是否使用了临时表、是否需要排序、是否需要回表等。这时,默认的 N 是 20,M 是 10。
2024-10-23 00:49:33
504
原创 普通索引和唯一索引,应该怎么选择?
普通索引,不能保证字段的唯一性,所以普通索引会比唯一索引要多N次判断,比如判断下一条记录是否和目标相同。InnoDB的数据其实是按页来取的,也就是说要拿到某一个数据,其实会把这一整页的数据都从磁盘加载到内存中,一页默认是16KB。
2024-10-18 10:54:35
972
原创 BeanFactory和ApplicationContext
Q:到底什么是 BeanFactory它是 ApplicationContext 的父接口它才是 Spring 的核心容器,主要的 ApplicationContext 的实现都是依赖BeanFactory的首先看一下继承关系再调试打断点看看ApplicationContext这个玩意里有什么东西。
2024-10-16 15:20:19
592
原创 IOC是怎么来的?
先创建一个空工程,用来存放接下来的所有工程编写DemoDao、DemoDaoImpl、DemoService、DemoServiceImpl、DemoServlwet这时候访问/demo1就可以看到返回值了。
2024-10-16 15:19:09
790
原创 合并两个有序数组
我们可以使用双指针法从后向前遍历,避免将已经排序的数组打乱。这个方法的核心思路是从。的末尾开始填充较大的元素,因为末尾是用零填充的空闲区域,这样我们可以避免覆盖。这个方法能够高效地解决问题,并且符合进阶要求的 O(m + n) 复杂度。
2024-09-30 18:53:35
559
原创 简单创建代理工厂
一般对于JDBC来说,无非就是连接数据库、查询数据库、封装实体、返回实体,如果要设计一个ORM框架的话也就是要考虑怎么把用户自定义的数据库操作接口、XML中的SQL语句、数据库三者给联系起来,其实最适合的操作就是代理,使用代理的方式来进行处理,因为代理可以封装一个复杂的流程为借口对象的实现类。接口的代理对象,并通过代理对象来处理接口方法的调用,从而实现接口的具体操作。这个流程图展示了如何通过代理工厂和代理模式,动态创建。这张图描述了一个使用代理模式的流程,主要涉及。首先是IUserDao。
2024-08-15 17:20:02
426
原创 MySQL架构设计
语法分析器使用上下文无关文法(Context-Free Grammar, CFG)来描述SQL语言的语法规则。这些规则定义了SQL语句如何由一系列词法单元构成,并规定了各个词法单元之间的合法组合方式。
2024-08-15 17:18:44
834
原创 【WEB系列】过滤器Filter
Filter,过滤器,属于Servlet规范,并不是Spring独有的。其作用从命名上也可以看出一二,拦截一个请求,做一些业务逻辑操作,然后可以决定请求是否可以继续往下分发,落到其他的Filter或者对应的Servlet。WebFilter常用属性如下,其中urlPatterns最为常用,表示这个filter适用于哪些url请求(默认场景下全部请求都被拦截)接下来的一个问题就是如何让我们自定义的Filter生效,在SpringBoot项目中,有两种常见的使用方式。那么如何让@WebFilter生效呢?
2024-06-04 16:11:19
510
1
原创 如何利用GPT4写论文
我是一个科学研究助理,专门帮助用户通过搜索相关科学论文来回答问题、撰写内容和进行研究。我可以为你找到关于特定话题的研究论文摘要,并从中提取关键信息。无论你有关科学研究的任何问题或需要帮助撰写内容,我都可以提供帮助,并确保引用相关的研究论文。比如,如果你想知道某种药物的效果如何,或者某种技术在特定领域的应用,我可以为你搜索最相关的研究论文并总结它们的发现。我还可以帮助准备学术报告或文章草稿,提供数据分析和总结等。
2024-04-25 09:34:10
1393
1
原创 ForkJoinPool、CAS原子操作
ForkJoinPool是由JDK1.7后提供多线程并行执行任务的框架。可以理解为一种特殊的线程池。1.任务分割:Fork(分岔),先把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进行继续分割。2.合并结果:join,分割后的子任务被多个线程执行后,再合并结果,得到最终的完整输出。类似于分治的思想,把大任务一点点拆分为一个个小任务。如果要统计1~100之间的和,当然可以直接暴力for循环,不过也可以把它拆分为10个任务,计算1到10的和,11到20的和…
2024-03-29 20:46:05
1189
原创 ThreadPoolExecutor经典面试题
每个work在runWork()的时候去getTask(),在getTask内部,并没有针对性的区分当前work是否是核心线程或者类似的标记。只要判断works数量超出core,就会调用poll(),否则take()答案:如果队列中没有任务时,核心线程会一直阻塞在获取任务的方法,直到返回任务。即便是第一个被创建的核心线程,仍然有可能被销毁。验证:起一个线程池,放置一个任务sleep,debug查看结束前后的状态。1)线程池是如何保证线程不被销毁的呢?2)那么线程池中的线程会处于什么状态?
2024-03-29 17:22:41
323
原创 线程池详解
设置为20,那么任何时候线程池至少会有10个活跃的线程(如果有任务需要执行),即使有些线程是闲置的。当任务数增加,并且所有的核心线程都在忙时,线程池可以临时创建更多的线程,最多到20个。线程上下文切换是有成本的,因为它需要CPU周期来保存和加载线程的状态信息,并且在切换过程中CPU不做任何实际的工作,只是在两个线程之间传递。举例来说,如果你想要添加一个新线程到线程池时,需要检查当前活动的线程数是否少于配置的最大线程数。节省cpu切换线程的时间成本(需要保持当前执行线程的现场,并恢复要执行线程的现场)。
2024-03-28 23:56:13
910
1
原创 Linux 收发网络包的流程
数据包首先到达网络接口,并被放置在环形缓冲区(Ring Buffer)中。当环形缓冲区接收到数据后,会触发一个软中断(或者在某些情况下是NAPI轮询机制)。ksoftirqd内核线程(或者在高负载时直接由中断上下文)处理这些软中断,从环形缓冲区中取出数据帧。使用sk_buff结构来表示网络包,并进行基本的合法性检查,如CRC检验等,不合法的帧会被丢弃。识别上层协议(如IPv4, IPv6),并移除数据链路层的头(如以太网帧头)。在网络层,包括IP头的网络数据包会被进一步处理。
2024-03-28 12:50:31
1613
2
原创 Keepalive与idle监测及性能优化
两者的主要区别在于它们的目的和实施方式。Keepalive 主要用于确保连接双方知道对方仍然“活着”,并且连接是有效的。而Idle监测则用于确定一个连接在一段时间内是否有活动,以决定是否应该保持或关闭这个连接。Keepalive是通过定期发送控制消息来实现的,而Idle监测是通过观察一段时间内的数据传输活动来实现的。在Linux内核中也有一个keepalive来确认对端的连接状态是否健康。
2024-03-23 20:40:48
1237
1
原创 【Netty】TCP粘包、拆包、编解码问题
粘包拆包分析主要探讨固定长度字段存消息长度在这个例子中, 设置了最大行长度为 8192 字节,会剔除换行符,并且在检测到超长行时立即抛出异常。假设有一个基于文本的协议,消息以(换行符)结束。在这个例子中,会查找换行符,将接收的数据分割成单独的行,并将每行作为一个单独的帧传递到管道中的下一个处理器。LengthFieldPrepender从继承关系可以看出来,这是一个可以处理收、发的处理器其他编解码器maven依赖:插件依赖:proto文件可以看到,返回的就是我们在proto文件中
2024-03-23 13:13:23
1034
1
原创 Netty中的核心概念
内存分配在jvm堆,分配和回收速度比较快,可以被JVM自动回收,缺点是,如果进行socket的IO读写,需要额外做一次内存复制,将堆内存对应的缓冲区复制到内核Channel中,性能会有一定程度的下降。2,Netty的 Promise接口扩展了Netty的Future接口,它可以设置异步执行的结果并触发Listener,比如在IO操作过程,不管是顺利完成、还是发生异常,都可以设置Promise的结果,并且通知Promise的。1,Netty是基于事件驱动的,比如:连接就绪;
2024-03-18 21:54:29
1132
2
原创 初识Netty网络编程
是一个有序的处理器链容器,每个Channel(在网络编程中,Channel表示连接的抽象)都有自己的管道。管道中的处理器按顺序排列,形成一个链式结构,用于处理或拦截进出Channel的各种事件和数据。当数据从网络流入或流出时,它会经过管道中的每一个处理器。处理器可以修改、过滤、转换数据或者处理特定类型的事件(比如连接建立、读取完成、异常等)。提供了一种灵活的方式来组织和管理这些处理器,允许开发者在运行时动态插入、删除或替换处理器,从而定制不同阶段的数据处理逻辑。
2024-03-17 20:02:48
942
原创 Reactor线程模型
一个线程来处理所有的请求,会导致并发很高,如果其中一个Channel在进行读写数据的时候,数据量很大,会导致处理速度很缓慢,这时候如果有人再次发次连接,速度会很慢。单线程模型的特点:接收连接、IO处理、业务处理均在一个线程中完成。那么可以怎么优化呢?既然问题出在数据的读取上,那能不能把数据的读取放到线程池中进行,这样就不会因为某个Channel的读取导致整个系统的效率降低了。
2024-03-16 20:27:17
1147
原创 操作系统IO模型
服务端:Channel(通道)、Buffer(缓冲区)、Selector(选择器/多路复用器)什么是Channelcapacity:缓冲区可以容纳的元素的最大数量limit:停止读写的索引position:当前要读或者写的索引,读写操作是从position开始,到limit停止mark:用于标记position的位置,默认为-1。
2024-03-15 21:17:21
1041
原创 RPC通信原理(二)
网络IO其实就是计算机内存和外部设备之间拷贝数据的过程,对于单个进程是无法直接要到网卡的数据的,但是Linux kernel可以,在内核当中会存在一片内核缓冲区,内核会给上层提供一些列的系统接口来刷走这片数据。当可用率过低/失败率过高的时候会对服务进行熔断,熔断的时候会设置一个熔断时间,当超过熔断时间的时候系统会尝试调用一下这个服务,如果调用成功了,就可以结束熔断,反之继续熔断。限流的作用是用来限制其请求的速率,保护后台相应服务,以免服务过载导致服务不可用的现象出现。那么熔断工作什么时候开始的呢?
2024-03-13 15:54:35
1096
原创 RPC通信原理(一)
如果现在我有一个电商项目,用户要查询订单,自然而然是通过Service接口来调用订单的实现类。我们把用户模块和订单模块都放在一起,打包成一个war包,然后再tomcat上运行,tomcat占有一个进程,这个项目也是在这个进程中运行的,模块之间的调用也是在进程的本地进行调用,那么如果我是一个分布式项目该怎么解决呢?现在用户和订单模块部署在两台服务器上,这时候用户模块就不能直接调用订单模块了,只能够通过网络来进行调用,而RPC就是用来干这个事情的,。需要远程通信的各类场景。
2024-03-12 16:33:21
1160
原创 Redis的散列插槽及故障转移
利用cluster failover命令可以手动让集群中的某个master宕机,切换到执行cluster failover命令的这个slave节点,实现无感知的数据迁移。如图,在7001这个节点执行set a 1时,对a做hash运算,对16384取余,得到的结果是15495,因此要存储到103节点。类似于一个哈希散列表,通过哈希算法来映射插槽,并为redis节点分配插槽区间,插槽的所有范围是0~16383。时,对num做hash运算,对16384取余,得到的结果是2765,因此需要切换到7001节点。
2024-03-06 19:11:24
1169
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人