- 博客(152)
- 资源 (2)
- 收藏
- 关注
原创 如何保证消息的可靠性传输?(如何处理消息丢失的问题)
注意,哪怕是你给 RabbitMQ 开启了持久化机制,也有一种可能,就是这个消息写到了 RabbitMQ 中,但是还没来得及持久化到磁盘上,结果不巧,此时 RabbitMQ 挂了,就会导致内存里的一点点数据丢失。,一定不会丢,要求是,你的 leader 接收到消息,所有的 follower 都同步到了消息之后,才认为本次写成功了。接口,告诉你这个消息接收失败,你可以重试。,让 Kafka 以为你已经消费好了这个消息,但其实你才刚准备处理这个消息,你还没处理,你自己就挂了,此时这条消息就丢咯。
2025-03-17 10:20:11
619
原创 如何保证消息不被重复消费?(如何保证消息消费的幂等性)
假设你有个系统,消费一条消息就往数据库里插入一条数据,要是你一个消息重复两次,你不就插入了两条,这数据不就错了?但是你要是消费到第二次的时候,自己判断一下是否已经消费过了,若是就直接扔了,这样不就保留了一条数据,从而保证了数据的正确性。能不能避免重复消费?(定时定期),会把自己消费过的消息的 offset 提交一下,表示“我已经消费过了,下次我要是重启啥的,你就让我继续从上次消费到的 offset 来继续消费吧”。幂等性,通俗点说,就一个数据,或者一个请求,给你重复来多次,你得确保对应的数据是不会改变的,
2025-03-17 09:46:07
736
原创 Cglib类增强动态代理的实现Demo
Cglib(Code Generation Library)是一个强大的高性能的代码生成包,用于在运行时扩展Java类与实现Java接口。
2025-03-13 10:18:59
313
原创 如何保证消息队列的高可用?
实际上 RabbmitMQ 之类的,并不是分布式消息队列,它就是传统的消息队列,只不过提供了一些集群、HA(High Availability, 高可用性) 的机制而已,因为无论怎么玩儿,RabbitMQ 一个 queue 的数据都是放在一个节点里的,镜像集群下,也是每个节点都放这个 queue 的完整数据。第二,这么玩儿,不是分布式的,就。,指定的时候是可以要求数据同步到所有节点的,也可以要求同步到指定数量的节点,再次创建 queue 的时候,应用这个策略,就会自动将数据同步到其他的节点上去了。
2025-03-13 10:07:38
866
原创 为什么使用消息队列?消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么优点和缺点?
通过一个 MQ,Pub/Sub 发布订阅消息这么一个模型,A 系统就跟其它系统彻底解耦了。
2025-03-10 11:52:25
1205
原创 Redis单线程多路复用 I/O 模型:客户端与Redis的通信过程
Redis 内部使用文件事件处理器,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,将产生事件的 socket 压入内存队列中,事件分派器根据 socket 上的事件类型来选择对应的事件处理器进行处理。
2025-03-07 08:00:00
412
原创 使用 Java 执行 SQL 语句和存储过程
JDBC:最基础的数据库操作方法,适合不使用任何框架时。Spring JDBC:适合在 Spring 框架下使用,简化了数据库操作并处理了许多细节。存储过程:可以通过执行存储过程,存储过程本身由数据库管理,能够提高性能。
2025-03-06 10:44:00
543
原创 Java 中使用数据库连接池
HikariCP:高性能、轻量,推荐用于大多数现代应用。Apache DBCP:功能齐全,成熟稳定,适用于很多企业应用。C3P0:老牌连接池,适用于对性能要求不高的应用。如果你使用 Spring Boot,推荐使用HikariCP,因为它是 Spring Boot 默认的连接池,性能好且配置简单。如果你在使用 Spring 或 Spring Boot,可以通过 application.properties 或 application.yml 文件进行配置,而不必显式地在代码中配置连接池。
2025-03-06 10:42:53
906
原创 数据库的乐观锁和悲观锁
乐观锁是一种假设数据库操作不会发生冲突的锁定机制。在执行数据更新操作时,它并不会立刻加锁,而是先允许所有事务继续执行,并在提交时检查数据是否发生了变化。如果数据在读取后被其他事务修改了,那么当前事务就会被阻止,并给出一个冲突的提示。悲观锁是一种假设数据库操作会发生冲突的锁定机制。在执行数据更新操作时,事务会先加锁,其他事务在锁释放之前不能访问被锁定的数据,从而保证数据一致性。悲观锁通常是在读取数据时就加锁,直到事务结束才释放锁。
2025-03-05 16:04:45
484
原创 水平分表以后怎么确定这个数据在哪一张表里面?
插入或查询时,依据数据的时间字段判断所属表。以MySQL为例,若按用户ID进行水平分表,假设要将数据存储在N个表中,可使用公式。表中查出数据所在表名,再到对应表中查询具体数据。如查询用户ID为100的用户数据,先执行。例如,按照时间范围分表,将每月的数据存到不同表中。创建一张专门的映射表,用于记录数据主键与表名的对应关系。插入数据时,先确定插入到哪个表,同时在。,进而明确操作的表。,当插入或查询数据时,都先通过此公式计算出。存储2025年1月的订单数据,表。得到表名,然后再从该表中查询数据。
2025-03-04 09:47:45
152
原创 Spring Boot整合RabbitMQ
// 创建队列 @Bean public Queue queue() {/*** @param name 队列名字* @param durable 声明一个持久队列(该队列将在服务器重启后继续存在),则为true} // 创建交换机(Direct类型) @Bean public DirectExchange exchange() {} // 绑定队列到交换机 @Bean public Binding binding() {} }
2025-03-03 16:52:06
1626
原创 MySQL支持的索引类型有哪些?
确保索引列中的值是唯一的,但允许有空值(如果有多个空值,它们被视为相同)。其作用是保证数据的唯一性,可基于B - Tree或哈希结构(取决于存储引擎和具体情况),在查询时也能提高查找效率。是一种特殊的唯一索引,用于唯一标识表中的每一行记录,一张表只能有一个主键索引,且主键值不能为空。它基于B - Tree结构实现,能加快基于主键的查询速度,同时保证数据的唯一性和完整性。最基本的索引类型,没有唯一性等约束,主要作用是加快对数据的查询速度,可以创建在单列或多列上,基于B - Tree等结构实现。
2025-03-03 09:22:21
483
原创 Redis 同步机制详解
Redis 采用主从复制(Replication)机制来进行数据同步,同时在 Redis Cluster(集群模式)下也使用 Gossip 协议进行节点间数据同步和状态传播。主要的同步方式包括全量同步和增量同步。
2025-02-28 09:32:49
907
原创 volatile 关键字
在 Java 中,volatile是一个类型修饰符,主要用于修饰变量。它在多线程编程中扮演着重要的角色,下面将从多个方面详细介绍volatile关键字。
2025-02-27 10:32:55
320
原创 synchronized 关键字
在 Java 中,关键字是用于实现线程同步的重要工具,它可以保证在同一时刻,只有一个线程能够访问被修饰的代码块或方法,从而避免多个线程同时访问共享资源时可能出现的数据不一致问题。
2025-02-27 10:32:26
639
原创 Spring Boot 整合 JMS-ActiveMQ,并安装 ActiveMQ
ActiveMQ 启动成功后,单击 Manage ActiveMQ broker 超链接进入管理员控制台。登录 ActiveMQ 的管理控制台。如果能成功登录,说明 ActiveMQ 已经启动成功。,根据你的操作系统选择合适的版本进行下载。这里以 Linux 系统,,可以看到 test-queue 队列以及发送的消息。将下载的压缩包解压到指定目录,例如。
2025-02-27 09:32:01
1130
原创 基于Ant Design Vue 引入 Flowable 【workflow-bpmn-modeler-antdv】流程设计器组件
在src目录下创建flowable文件夹,并创建Demo.vue文件。main.js 全局引入Ant Design Vue。安装Ant Design Vue。安装less相关依赖。
2025-02-26 17:14:34
281
原创 36. Spring Boot 2.1.3.RELEASE 中实现监控信息可视化并添加邮件报警功能
当被监控应用的状态发生变化(如上线、下线)时,Spring Boot Admin Server 会根据配置发送邮件到指定的收件人邮箱,你可以通过停止和启动被监控应用来验证邮件报警功能是否正常工作。这里选用 Spring Boot Admin 2.1.6 版本,与 Spring Boot 2.1.3.RELEASE 相对兼容,同时引入邮件启动器用于邮件报警。启动被监控的应用,它会自动注册到 Spring Boot Admin Server。在被监控的 Spring Boot 应用的。
2025-02-26 14:27:10
1011
原创 35. Spring Boot 2.1.3.RELEASE 应用监控【监控信息可视化】
在 Spring Boot 2.1.3.RELEASE 中实现监控信息可视化可以通过多种方式,下面为你详细介绍使用 Spring Boot Actuator 结合 Grafana 和 Prometheus 以及使用 Spring Boot Admin 这两种常见方法。
2025-02-26 11:34:33
952
原创 Java 中 String 和 StringBuilder 的主要区别
特性String可变性不可变可变可变性能低(每次修改都会创建新对象)高(直接修改)相对较高(有同步开销)线程安全线程安全不线程安全线程安全适用场景少量字符串操作多量字符串操作线程安全的字符串操作。
2025-02-26 09:18:22
415
原创 4.Flowable 应用程序定义
点击上⾯的应⽤程序菜单,然后点击右上⻆的创建应⽤程序按钮,如下:然后点击编辑包含的模型按钮,为这个应⽤选择⼀个流程 :然后点击左上⻆的保存按钮,保存并发布这个应⽤,如下:
2025-02-26 09:16:37
131
原创 JVM 面试
另一方面,通过复制存活对象,使得存活时间长的对象逐步晋升到老年代,因为每次复制时,对象的年龄(在 Survivor 区经历一次 Minor GC,年龄就加 1)会增加,当年龄达到一定阈值(默认为 15)时,对象就会被晋升到老年代,从而保证新生代的空间能够高效地利用,提高垃圾回收的效率。类实现,也叫幻影引用,它对对象的生命周期没有影响,无法通过虚引用来获取对象实例,主要用于在对象被回收时收到一个系统通知,例如用于管理堆外内存资源,当对象被回收时,可通过虚引用关联的引用队列来触发堆外内存的释放操作。
2025-02-26 09:15:46
906
原创 3.Flowable UI 流程模型图绘制
由于此处案例经理和主管审批的时候,⽆⾮就是同意或者拒绝,通过表单我们可以定义出同意或者拒绝这两个按钮。绘制完成后,点击左上⻆的保存按钮,保存成功后,会⾃动回到流程绘制⻚⾯。如果有提前绘制好的表单,这⾥就会显⽰出来,那么直接引⽤即可,如果没有提前绘制好的表单,那么⼤家看到的就如同上图那样。
2025-02-25 14:12:02
378
原创 2.Flowable UI界面
⾝份管理就是对用户、用户组的管理,可以理解为管理系统中的角色、用户、菜单等功能。我们点进到⾝份管理⻚⾯之后,可以看到如下内容:左侧可以通过。在设置的时候,我们可以直接设置⽤户,也可以设置⽤户组,设置⽤户组的话,则这个组中的所有⽤⼾都能访问这个菜单项。注意:源码启动的方式可能会因为网络等原因导致maven依赖下载失败。,切换到6.7.2版本的分支。按钮创建一个新用户,右侧默认只有一个 admin 用户。直接通过war包启动,下载指定版本的zip文件并解压。,默认登录账号:admin,密码:test。
2025-02-25 14:04:53
588
原创 Spring 面试
AOP(Aspect - Oriented Programming,面向切面编程)是一种编程范式,旨在将横切关注点(如日志记录、事务管理、权限控制、缓存管理等)从业务逻辑中分离出来,形成独立的切面(Aspect),然后在运行时将这些切面动态织入到目标对象的方法执行过程中。IOC(Inversion of Control,控制反转)是指将对象的创建和管理控制权从应用程序代码转移到容器中,由容器负责对象的创建、初始化和管理。对Java接口代理模式的实现原理的理解是什么?谈谈对Cglib类增强动态代理的实现?
2025-02-25 09:20:03
453
原创 Redis 面试
它通过一个哈希函数将数据和节点映射到一个固定的哈希环上,当有数据需要存储或读取时,先计算数据的哈希值,然后在哈希环上顺时针查找第一个大于等于该哈希值的节点,将数据存储到该节点或从该节点读取数据。但在高并发情况下,可能出现缓存被删除后,还未更新数据库时,其他线程读取数据,发现缓存为空,从数据库读取旧数据并写入缓存,导致数据不一致,可通过设置缓存过期时间或使用读写锁来降低这种风险。在更新数据时加写锁,只有一个线程可以进行写操作,写操作完成后,同时更新缓存和数据库,保证数据一致性,但会影响并发性能。
2025-02-25 09:16:56
778
原创 MySQL 面试
在事务执行过程中,若发生错误或需要回滚事务,可通过 undo 日志将数据恢复到事务开始前的状态,保证事务的原子性和一致性。它的作用是保证事务的持久性,即事务提交后,即使发生系统崩溃,重启后也能通过 redo 日志将数据恢复到事务提交后的状态。:B + 树的叶子节点通过双向链表相连,这使得范围查询时,只需要遍历叶子节点链表即可,而无需像 B 树那样多次回表查询,提升了范围查询的性能。:B + 树的节点存储了多个键值和指针,相比于二叉查找树,它的高度更低,在查找数据时,磁盘 I/O 次数更少,提高了查询效率。
2025-02-24 10:16:14
878
原创 多线程:submit和execute的区别
任务获取执行结果,或者想要更灵活地处理任务的执行状态和异常时,任务,并且希望在任务出现异常时能及时处理,使用。当你只需要提交一个不需要返回结果的。
2025-02-24 09:55:59
261
原创 Java中创建线程的方式
线程池可以管理和复用线程,避免了频繁创建和销毁线程带来的性能开销。接口或使用线程池的方式来创建线程,因为它们更具灵活性和性能优势。,通过实现该接口并将实现类的实例作为参数传递给。类是Java中用于实现线程的类,通过继承。方法可以有返回值,并且可以抛出异常。类来创建线程池,将任务提交给线程池执行。综上所述,在实际开发中,推荐使用实现。方法来定义线程要执行的任务。类的构造函数来创建线程。接口中只有一个抽象方法。
2025-02-21 09:56:25
314
原创 Java 多线程面试
当有任务提交时,线程池会从线程队列中取出一个线程来执行任务,如果线程队列中没有空闲线程,任务会被放入任务队列。:在没有竞争的情况下,线程获取锁时,会在对象头的 Mark Word 中记录自己的线程 ID,以后该线程再次获取锁时,无需进行 CAS 操作,直接进入同步块。:缓存线程池,核心线程数为 0,最大线程数为 Integer.MAX_VALUE,任务队列是同步队列。:当线程获取不到锁时,不会立即进入阻塞状态,而是在原地自旋一段时间,希望在这段时间内其他线程能够释放锁,从而避免线程上下文切换的开销。
2025-02-20 14:44:53
783
基本销售税适用于所有商品,但书籍、食品和医疗产品除外,税率为10%。进口税是适用于所有进口货物的附加销售税,税率为5
2020-05-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人