- 博客(50)
- 收藏
- 关注
原创 RocketMQ事务消息详解
事务消息是指一种特殊类型的消息,它允许生产者发送消息时保证消息的最终一致性(即执行流程可能会存在时差,但最终状态一定是一致的),即在生产者发出消息后,如果发生了错误,系统能够自动回滚,保障消息的可靠性。事务消息由三部分组成:事务消息的发送、事务消息的回查、事务消息的确认,,此时对消费者不可见,当本地事务执行成功时,半消息状态变为”已提交“,消费者可进行消费。如果本地事务执行失败,则会回滚该事务,消息被标记为”回滚“状态,RocketMQ会丢弃该消息。
2025-04-24 14:42:01
682
2
原创 初识分布式事务原理
事务是指符合ACID特性的操作就是事务,在同一个数据库中,如果要分别对表A和表B进行插入和删除操作,如果其中一个操作执行失败,可以对当前数据库进行回滚,使其回滚到执行操作前的状态,但是现有的系统架构都是基于微服务的,不同服务和操作设计不同的数据库和表,如果插入操作使用的是数据库A,删除操作使用的是数据库B,那么如果想要二者符合事务的特性,要么全部执行成功,要么全部执行失败,如果失败就要进行回滚,但是不同的数据库又不能同时回滚,因此就需要使用分布式事务。- 每个参与者执行本地操作,但不提交,锁住资源。
2025-04-23 22:17:54
1040
原创 阿里云RAM账号免密登录Java最佳实践
阿里云的访问控制RAM(Resource Access Management)提供了强大的细粒度权限管理功能,适用于企业中多个部门或角色需要访问ECS资源的情况。针对以上三类不同的人群便可设置不同的RAM账号,对应设置不同的权限,以实现资源及操作权限的隔离。开发人员:能够查看所有ECS实例的信息,但不能修改任何设置,同时可以登录ECS实例进行操作。运维人员:具备创建部分资源的权限,但不具备删除资源的权限,如创建快照和镜像、执行脚本等任务。,直接嵌入代码或配置文件中,用于API请求签名验证。
2025-04-17 13:22:08
1284
1
原创 过滤器和拦截器的区别
今天在写完公司的需求后梳理代码时发现使用了拦截器,下意识地发散性的思考了一下过滤器与拦截器的区别,简单总结整理一下。拦截器和过滤器的区别在于它们的作用层面不同。
2025-03-28 16:17:14
319
1
原创 Linux阿里云服务器安装RocketMQ教程
使用原始的拉取MQ包并进行解压缩运行的方法较为复杂,且原始的MQ配置中JVM的内存空间大小是8g,也需要修改对应的配置,因此不推荐该方法。而使用docker方式也可以,但需要分别拉取NameServer、Broker和DashBoa的镜像再运行,有点麻烦,不如Docker Compose通过编写Docker Compose.yaml配置文件进行运行来的方便快捷。
2025-02-20 15:12:02
1102
原创 从网络的角度来看,用户输入网址到网页显示,期间发生了什么?
HTTP用于发送含有请求内容和服务器信息的请求报文,DNS用于将域名解析成IP地址,TCP用于建立连接,IP用于路由的分组和转发,ARP用于查询MAC地址,为物理层的比特流的传输找到物理地址。
2025-01-15 19:14:59
838
原创 Cookie、Session和Token之间的区别是什么?
概念Cookie是由服务器生成并存储在客户端(通常是浏览器)的一小段数据,以键值对的形式进行存储,它是无状态协议(HTTP)的补充机制,用来在客户端和服务器之间维持状态。每次发送的HTTP请求都会自动携带该域名下存储的Cookie到服务器,以便让服务器能够识别客户端的状态。注意并非所有的请求都会携带相同的Cookie,而是每个域名会存储对应的Cookie,因此Cookie符合同源策略,不允许跨域请求。同源策略。
2025-01-15 19:09:13
1345
原创 如何解决Redis中的热点key问题
Redis中的是指某些特定的Key被频繁访问,导致Redis中某个节点(或实例)承担过高的压力,可能引发性能瓶颈,甚至若缓存承受不住服务压力挂掉后,仍有大量请求时直接打到DB上,由于DB层相对缓存层查询性能更弱,在面临大请求时很容易发生DB雪崩现象,严重影响业务。通常以Key被请求频率来判定,目前没有具体的固定的数值来衡量,但有相关参考标准: 热点Key问题是由于某个(或某些)Key被频繁访问,因此最直接的解决方案是破坏热点Key的形成,将热点Key进行逻辑拆分,将一个热点key拆分为多个Ke
2025-01-07 17:02:17
1337
原创 什么叫做全表扫描?什么叫做全表扫描索引?你分的清吗?
在MySQL中一张表只能有一个聚簇索引,通常来说是主键索引,但是如果该表没有主键,则存储引擎会选取一个唯一索引作为聚簇索引,若也没有唯一索引,则会根据隐藏字段db_row_id构建聚簇索引,因此。可能此时会疑惑既然全表扫描了二级索引,为什么不全表扫描主键索引?这是因为主键索引存储了所有的数据,包括数据相关的事务id、回滚指针等等,因此。而所谓的用到了索引指的是利用了索引树的存储结构特性来查询数据,那什么叫做全表扫描索引呢?,而聚簇索引的叶子结点存储了索引值和完整的数据项,这个二级索引的,只不过查询类型。
2024-12-26 14:24:17
639
原创 【算法】图论中DFS和BFS模板讲解
其实可以先合法性判断,然后再进行DFS和BFS,但是我们用的方法是先使用后判断,将判断的操作统一放在前面,这样在取上下左右四个位置的时候不用判断四次参数的合理性,而是先将其视为合法的进行保存,然后在要访问的时候在统一判断合法性,避免了多次冗余的判断。对于格子(row,col)来说,它的相邻结点分别在上下左右,分别为(row-1,col)、(row+1,col)、(row,col-1)、(row,col+1),其次类比二叉树通过。图论的解题模板和二叉树基本一致,都是在DFS和BFS基础上进行求解。
2024-12-14 15:42:30
821
3
原创 Redis主从复制原理详解
Redis的主从复制是指一个Redis实例(主节点)可以将数据复制到一个或多个从节点(从节点),从节点从主节点获取数据并保持同步。RDB文件生成完毕后,主节点将其发送给从节点,从节点清空旧数据,加载RDB的数据。命令生成RDB文件,在RDB文件生成过程中,主节点新接收到的写入数据的命令会存储到。从节点加载完RDB文件中的数据后,主节点生成RDB文件期间存放在。的新写入数据发送给从节点,从节点执行命令,保证数据的一致性。
2024-10-21 11:29:04
509
1
原创 缓存常见问题:缓存穿透、雪崩、击穿及解决方案分析
缓存穿透是指用户请求的数据在缓存中不存在即没有命中,同时在数据库中也不存在,导致用户每次请求该数据都要去数据库中查询一遍。如果有恶意攻击者不断请求系统中不存在的数据,会导致短时间大量请求落在数据库上,造成数据库压力过大,甚至导致数据库承受不住而宕机崩溃。缓存穿透的关键在于在Redis中查不到key值,它和缓存击穿的根本区别在于传进来的key在Redis中是不存在的。
2024-10-17 19:42:04
1772
1
原创 如何保证数据库和缓存双写一致性?
总的来说,前两种方案:先写缓存,后写数据库和先写数据库,后写缓存因为无法保证写数据库和写缓存这两步能够顺利执行,并且执行顺序会受到其他请求的影响,不推荐使用。后两种方案:先删缓存,后写数据库和先写数据库,后删缓存能够极大程度减少由于其他请求的插入或者网络卡顿导致的数据不一致性问题,但在高并发的场景下仍有可能发生,相比之下先写数据库,后删缓存的这个方案最优,发生数据不一致的概率最小。
2024-10-13 17:47:22
1285
原创 Redis中的Lua脚本是否是原子性操作?详解
我们都知道Redis是不支持事务回滚的,因为Redis的设计初衷就是简单、高效,常用作缓存,而要实现事务的回滚需要额外的机制和数据结果来保证(参考MySQL中的MVCC和数据项中的回滚指针及事务id),因此。不执行的情况是指如果在事务执行的过程中,发生了异常或者死锁等,会将之前对数据库所做的全部操作撤销,将数据库的状态回滚到事务执行前的状态(具体原理可以了解一下MVCC)。,即Lua脚本在执行过程中如果发生了异常,对于异常发生前已经执行的指令,会进行撤销,以此来实现回滚的效果。来执行Redis命令时,
2024-10-12 20:38:08
1094
2
原创 Redis到底是单线程还是多线程的?详解
来解决上述问题,它的作用是当多个线程尝试操作同一资源时,确保同一时刻只有一个线程能够获得资源的控制权,其他客户端必须等待该客户端释放锁后才能继续操作,确保了多个线程对共享资源的修改是有序的,避免了数据竞争和不一致的情况。,但是因为单线程避免了线程切换之间的消耗、线程创建的开销等等,其执行效率在大多数场景下极高,但是随着网络I/O请求数量的急剧增加,当Redis服务器处于高负载情况时,单线程就无法高效的处理请求,因此自。模式,其中主线程负责核心的命令处理,只有一个核心线程, 它主要负责通过。
2024-10-12 16:28:10
947
原创 ThreadLocal底层原理及数据结构详解
允许为创建,使得同一个对象在不同的线程中拥有不同的值。它的主要作用是在并发环境下提供,避免多个线程共享同一个变量,从而减少线程间的相互干扰。的核心在于为每个线程维护一个独立的数据副本,它的实现主要依赖于,这是专用的Map,用来存储线程自己的变量。
2024-10-05 12:15:28
749
原创 TCP三次握手四次挥手详解
只有在第一次和第二次发起连接请求和连接接受的情况下置为1,seq为随机取值。,用于标识客户端将要发送的数据包顺序。确保建立的连接是可靠的传输,不会造成数据丢失和失序。
2024-09-28 20:16:27
1542
原创 sql执行流程经典案例分析
扫描联合索引(a, b):MySQL 根据联合索引(a, b)找到b = xx的所有记录。按a进行分组:由于联合索引(a, b)中的a已经排序,MySQL 可以直接根据a进行GROUP BY操作。是否需要回表如果查询的列全部包含在联合索引中(如),则不需要回表。如果查询需要访问其他列(如SELECT *),则 MySQL 需要回表,从表中读取完整数据。返回结果集:将查询结果返回给客户端。全表扫描MySQL 扫描原始数据表,逐行检查b列是否满足b = xx的条件。将符合b = xx。
2024-09-21 17:10:00
753
原创 SQL优化之深度分页优化方案详解——延迟游标分页
因此有序且唯一的查询字段在查询结果中是有明确顺序的,因此可以根据上一次页面的查询结果,来将该字段作为'游标',下一次查询时从游标处开始查找下一页的记录即可。延迟游标分页能够记住上一页的最后一条记录,并在此基础上进行查询,是因为它依赖于数据库表中的某个。分页不同,延迟游标分页不需要跳过前面多余的行,因此可以有效解决因深度分页而导致的查询效率急剧下降的问题。高效分页,不会随着分页深度的增加导致查询速度变慢,避免了大量不必要的查询。,且无法实现随机跳转,无法直接跳转到具体的页面。延迟游标分页的核心思想是。
2024-09-21 15:53:24
811
原创 SQL优化之深度分页优化
此时数据库需要查询第19981到2000条商品的数据,但是需要跳过前面近两万条的数据,导致了额外的查询耗时,虽然只查询出20条数据,但是数据库需要扫描更多的数据。此时只需从数据库中查询20条数据,速度很快。,数据库在梳理分页查询时需要跳过大量的数据,降低查询效率。是指在分页查询场景下,当数量很大时,随着。
2024-09-21 15:49:59
902
1
原创 Redisson分布式锁实现及原理详解
客户端从N个 Redis 实例中请求锁,并设置相同的键、值和过期时间。客户端计算从每个 Redis 实例成功获取锁的时间。如果客户端能在大多数(即N/2 + 1个)Redis 实例中获取到锁,并且获取锁的总时间小于设定的超时时间,那么客户端成功获得了锁。如果客户端在大多数实例中获取了锁,客户端可以进行对共享资源的操作。如果锁超时后仍未成功获得足够多的实例锁,或者在操作过程中锁过期,则客户端应放弃该锁,等待下一次重试。操作完成后,客户端会向所有 Redis 实例发出解锁命令,以释放锁。
2024-09-11 21:53:28
2607
1
原创 数据库锁之行级锁、记录锁、间隙锁和临键锁
行级锁是最常见的锁机制,用于锁定单个行记录,确保并发事务之间的数据一致性,适合高并发场景。记录锁是一种作用于索引记录的行级锁,通常在涉及具体行的查询或修改时使用,确保其他事务无法修改特定记录。间隙锁则用于锁定索引记录之间的间隙,防止其他事务插入新的行,解决并发事务中可能出现的幻读问题。
2024-09-07 20:09:50
2305
1
原创 动态规划之股票问题详解
而将状态具体展开:0-表示第一次持有股票,1-表示第一次不持有股票,2-表示第二次持有股票,3-表示第二次不持有股票,4-表示第三次持有股票,5-表示第三次不持有股票,..... ,通过分析可以看出为偶数时表示持有股票的状态,为奇数时表示不持有股票的状态。而本题是最多买卖两次,可以买卖一次,也可以买卖两次,因此需要记录每次持有股票时是第几次持有股票,不持有股票时是第几次不持有股票,故需要四个状态来记录:0-第一次持有股票,1-第一次不持有股票,2-第二次持有股票,3-第二次不持有股票。其余代码和分析相同。
2024-08-19 11:42:04
1399
原创 MySQL进阶知识点分析
因为页的大小有限,一张表的数据量较大时,需要很多页来存储,当没有使用索引的情况下,每次查找一条记录时,只能从头遍历所有的页,来确定该记录存在于哪个页中,然后在页中二分查找来找到对应的记录,时间复杂度很高。因为非聚族索引的叶子节点只存放索引的键值和主键的值,不存放具体的数据,因此在使用非聚族索引如二级索引查数据时,会先根据二级索引查到该数据的主键值,然后到聚族索引中根据该主键值找到具体的数据信息,这种二次查表的过程就是回表,回表会导致查询效率降低,需要额外再查一次表。
2024-08-16 22:49:45
1205
原创 explain执行结果分析详解
查询表内数据的方式,描述了查询具体数据是如何执行的,其中按照性能从高到底依次为:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。SELECT标识符,是查询中SELECT的序号,其排列顺序代表整个查询中SELECT语句的执行顺序,值越高优先级越高。匹配的分区,对于未分区的表,值为null。
2024-07-23 22:32:06
1574
原创 数据库索引原理及其分类详解
索引是帮助MySQL高效获取数据的数据结构(有序索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,会保存在额外的文件中。通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。B树存储结构示意图:B+树存储结构示意图:B-tree因为B树不管叶子节点还是非叶子节点,都会保存数据在单个节点存储容量有限的情况下,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度。
2024-07-21 21:13:38
1506
原创 数据库事务隔离级别及底层原理详解
MySQL事务管理自动提交在MySQL中,默认DML指令的执行时自动提交的,当我们执行一个DML指令之后,自动同步到数据库中。事务管理开启事务,就是关闭自动提交在开始事务第一个操作之前,执行开启事务。依次执行事务中的每个DML操作如果在执行的过程中的任何位置出现异常,则执行rollback回滚事务。如果事务中所有的DML操作都执行成功,则在最后执行commit提交事务。# 库存表# 订单表num int。
2024-07-20 21:30:14
1616
6
原创 MySQL核心知识点汇总(持续更新中)
数据库事务特性(ACID)原子性(Atomicity):原子性指的是事务是一个不可分割的工作单位事务中的所有操作要么全部完成,要么全部不完成,不存在部分完成的情况。如果事务中的任何一步操作失败,整个事务都会被回滚(Rollback)到事务开始前的状态,以保证数据的一致性和完整性。一致性一致性确保了当事务完成时,数据从一个一致性状态转换到另一个一致性状态。事务在执行前后,数据库的完整性约束没有被破坏,如主键、外键、触发器等约束条件依然有效。这保证了数据库的结构和数据在事务开始和结束时都是有效的。隔离性。
2024-07-13 14:25:12
1485
原创 JUC核心知识点汇总(持续更新中)
进程进程是操作系统资源分配的基本单位,是程序的一次执行过程,进程之间是相互独立的,各自有各自的内存空间,它由操作系统进行调度。线程线程是CPU执行调度的基本单位,一个进程在其执行的过程中会产生多个线程,与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。下面来思考这样一个问题:为什么程序计数器虚拟机栈和本地方法栈是线程私有的呢?为什么堆。
2024-07-11 18:51:53
864
原创 基于Java的科大讯飞大模型API调用实现
因为现在自己实习的公司新拓展的一个业务是结合AI的低代码平台,我负责后端的开发,之前一直都是直接使用gpt或者文心一言等ui界面来直接使用大模型,从来没有自己调接口过,所以本文记录一下自己第一次使用大模型的心得,小趴菜一个,大佬们勿喷~~,进入注册账号然后申请对应的API权限即可(第一次使用免费,有量的限制),在控制台中得到我们对应API接口的APPID、APISecret和APIKey,这些是后面我们通过java使用大模型的密钥相当于。:定义了用于解析从服务端返回的JSON数据的内部类。
2024-07-09 19:24:29
3350
4
原创 设计模式之职责链模式
在以上示例代码中,Handler抽象类定义了处理的抽象方法和后续的执行连接处理对象,而HandlerA~D是对应不同的具体处理类,每个类可以解决不同级别的问题,请求者可以设置执行链路,当一个含有不同等级的问题要处理时,会根据执行链路进行执行,若当前处理类无法处理该问题,则让下一个处理对象判断是否能处理,执行全部处理完毕。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B处理器处理完后再传递给 C 处理器,以此类推,形成一个链条。2、需要动态更换处理对象时。处理: 34,处理完的结果为:4。
2024-07-08 18:13:42
1345
原创 设计模式之策略模式
传统的实现方式,通过传统if代码判断。这样就会导致后期的维护性非常差。当后期需要新增付费方式,还需要在这里再加上if(),也不符合设计模式的开闭原则。,行为之间可以相互替换。每个if判断都可以理解为就是一个策略。本模式使得算法可独立于使用它的用户而变化。2、电商网站活动方式,一般分为满减送、限时折扣、包邮活动,拼团等可以采用策略模式。平时所使用的支付方式,一般分为微信、支付宝、花呗等,可以使用策略模式。1、电商网站支付方式,一般分为银联、微信、支付宝,可以采用策略模式。是一种行为型模式,它。
2024-07-08 16:11:00
501
原创 设计模式之工厂模式(简单工厂、工厂方法、抽象工厂)
其他实现原理和流程同工厂方法模式。只不过抽象工厂中包含很多个具体的功能,是一个超级工厂父类。:实例化具体对象不需要关系具体细节,直接根据参数从工厂索要即可,初步实现了责任的分离。,即工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。既保留了简单工厂的优点,同时又解决了简单工厂的缺点。(因为工厂类定义了一个静态方法)相对于工厂方法模式来说,就是。
2024-07-04 10:51:20
1213
原创 常用设计模式总结(持续更新中)
将构造器私有化避免了类在外部被实例化,只能通过getInstance()来获得唯一的实例,但存在线程安全问题,当A线程调用getInstance()时instance为null,实例化对象,此时B线程也调用getInstance(),此时因为A未实例化完对象,所以instance也还是为空,B再次实例化对象,此时就会创建了两个单例对象。从名称上看,顾名思义,懒汉式就是懒的加载,只有在第一次使用时加载,属于延迟加载,但是第一次加载导致所有人一起加载,会导致线程安全问题。,它的加载并不依赖于外部类的加载。
2024-07-03 11:07:05
563
原创 Java集合
Java集合从分类上看,有collection和map两种,前者是存储对象的集合类,后者存储的是键值对(key-value)。Collection接口继承树Map接口继承树。
2024-07-01 11:06:24
844
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅