- 博客(57)
- 收藏
- 关注
原创 强弱依赖(含示例)
当某个服务(或组件)的故障或不可用会直接影响到依赖它的服务(或组件)的核心业务流程和系统的可用性时,这种依赖关系被称为强依赖。强依赖通常意味着被依赖的服务是系统稳定运行的关键部分,一旦出现问题,可能会导致整个系统或关键业务流程的中断。:与强依赖相反,弱依赖指的是某个服务(或组件)的故障或不可用对依赖它的服务(或组件)的核心业务流程和系统的可用性影响较小或没有影响。在弱依赖关系中,即使被依赖的服务出现问题,依赖方也能够通过容错机制、备用方案或其他手段继续完成其业务逻辑,保证系统的稳定运行。
2024-10-03 15:47:51 808
原创 Quartz入门与Demo搭建
创建一个实现Job接口的类,并在其中实现execute()方法。这个方法将包含需要被定时执行的业务逻辑。@Override通过以上步骤,已经成功地搭建了一个简单的Quartz Demo,并创建了一个定时任务。Quartz框架提供了强大的任务调度功能,可以满足各种复杂的定时任务需求。在实际应用中,可以根据具体需求配置不同的Job和Trigger,以实现更复杂的业务逻辑。
2024-10-03 15:38:30 558
原创 LocalStorage
LocalStorage 使用键值对的方式来存储数据,每个键值对都由一个唯一的键(key)和对应的值(value)组成。由于 LocalStorage 只能存储字符串类型的值,因此如果需要存储其他类型的数据(如对象、数组等),需要先使用 JSON.stringify() 方法将其转换为字符串格式。LocalStorage 的 API 是同步的,这意味着在执行读写操作时可能会阻塞页面的其他操作。:LocalStorage 提供的 API 是同步的,这意味着当你执行一个操作时,它会阻塞页面的其他操作直到完成。
2024-09-25 22:14:07 1110
原创 qs(Query String)查询字符串框架
qs库能够解析复杂的嵌套查询字符串,并将其转换为JavaScript对象,同时也能将JavaScript对象转换回查询字符串格式。因其高效性和易用性,qs被广泛应用于如Express和Connect等知名框架中。qs是一个功能强大且易于使用的查询字符串解析和字符串化库,它支持复杂的嵌套结构,提供了丰富的功能和选项,适用于各种Web开发场景。通过使用qs,开发者可以轻松处理复杂的查询字符串,提升应用的性能和用户体验。
2024-09-24 23:02:22 347
原创 字符串反转
对于数组的反转,通常使用双指针法,即一个指针从头开始,另一个指针从尾开始,交换两个指针所指向的元素,然后向中间移动,直到两个指针相遇或交错。对于字符串反转,可以递归地将字符串的首尾字符交换,然后递归处理剩下的字符串。这里只给出迭代法的伪代码,因为具体的链表节点定义和反转实现会依赖于链表的具体结构(如单向链表、双向链表等)。根据具体的需求和场景,可以选择最适合的方法来实现反转功能。将字符串转换为字符数组,然后通过交换数组中的元素位置来实现反转,最后再将字符数组转换回字符串。
2024-09-23 22:58:29 205
原创 网关鉴权之JWT
网关鉴权是指在请求到达系统之前,通过网关对请求进行身份验证和授权的过程。这包括验证请求的发起者身份是否合法,以及确定该发起者是否有权限访问所请求的资源。根据业务需求,在网关中编写自定义的鉴权逻辑。鉴权逻辑可以包括解析请求中的特定字段、查询数据库或调用其他服务以验证用户身份和权限。根据鉴权逻辑的结果生成响应。优点:灵活性高,可以根据业务需求进行定制化开发。创建一个自定义的 GlobalFilter 来处理 JWT 验证。try {
2024-09-22 16:56:07 1260
原创 正则表达式
用户名可以包含字母、数字、下划线和点,域名通常是字母和数字的组合,以.分隔,并以顶级域名(如.com、.cn)结束。编写复杂的正则表达式可能会带来性能上的问题,因此在使用时应根据实际需求选择合适的表达式,并进行测试和优化。手机号通常是以1开头,第二位是3、4、5、7、8中的一个数字,后面跟着9位数字。如果需要匹配包含属性的标签,可以使用更复杂的正则表达式,但通常需要根据具体情况定制。+:匹配前面的字符或字符集合出现1次或多次。:匹配前面的字符或字符集合出现0次或1次。.:匹配除换行符以外的任意字符。
2024-09-21 13:02:55 656
原创 如何使用Spring Cloud Gateway搭建网关系统
通过浏览器或Postman等工具发送请求到Gateway的端口(如http://localhost:9999/product/1或http://localhost:9999/order/1)。确保后端服务(如示例中的http://localhost:8001和http://localhost:8002)已经启动。当请求路径匹配/product/**时,请求将被转发到http://localhost:8001。当请求路径匹配/order/**时,请求将被转发到http://localhost:8002。
2024-09-20 22:36:10 1177
原创 Spring Cloud Gateway组件
Spring Cloud Gateway旨在提供一种简单有效的方式来路由和过滤HTTP请求,以构建微服务架构中的网关服务。它支持多种路由策略和过滤器,具有高性能、高吞吐量和低延迟的特点,是微服务架构中不可或缺的组件之一。
2024-09-19 23:09:29 981
原创 OpenFeign:Spring Cloud中的声明式HTTP客户端
在Spring Boot的启动类上添加@EnableFeignClients注解,以启用OpenFeign的接口扫描功能。在升级Spring Cloud或OpenFeign时,需要仔细查阅官方文档,确保版本间的兼容性。合理利用OpenFeign的日志功能,可以帮助开发者更好地了解远程服务调用的过程和结果。OpenFeign的版本需要与Spring Cloud的版本兼容。过长的超时时间或过多的重试次数可能会导致系统资源的浪费或性能下降。确保远程服务的名称与Feign客户端中指定的名称相匹配。
2024-09-19 13:29:32 1155
原创 什么是OOM
定期使用内存分析工具(如MAT、VisualVM等)来获取和分析内存快照,定位内存泄漏和占用过高的对象。注意Activity、Fragment等组件的生命周期管理,避免在非活动状态下持有它们的引用。在多进程环境下,合理分配系统资源,避免单个进程占用过多资源导致其他进程OOM。根据应用程序的需求,合理设置JVM堆内存大小(-Xmx和-Xms参数)。尽量减少大对象的创建,对于必须创建的大对象,考虑拆分或分批处理。使用对象池技术来管理对象,减少对象的创建和销毁开销。使用轻量级的数据结构和算法,减少内存占用。
2024-09-19 03:00:00 768
原创 入门sentinel
资源定义:在Sentinel中,资源是指需要被保护的微服务中的某个点,如HTTP接口、RPC调用、数据库操作等。这些资源通过Sentinel提供的API或注解进行定义,并赋予一个唯一的名称(resourceName)。资源注册:定义好的资源会被注册到Sentinel中,Sentinel会为每个资源创建相应的统计节点(如DefaultNode、ClusterNode等),用于保存该资源的各类统计信息(如QPS、异常数量等)。在Spring Boot应用中,你可以通过多种方式定义需要Sentinel保护的资源。
2024-09-18 21:59:08 1049
原创 探索微服务架构:从理论到实践,深度剖析其优缺点
微服务架构通过将功能分解到各个离散的服务中,实现对解决方案的解耦。每个微服务都围绕特定的业务领域组件来创建,这些服务可以独立地进行开发、管理和迭代。微服务架构的主要目的是提高系统的可扩展性、灵活性和可维护性。
2024-09-17 21:31:01 1242
原创 RESTful规范
RESTful规范提供了一种简单、灵活和可扩展的方式来构建分布式系统,使得系统能够更好地适应不断变化的需求和环境。通过遵循RESTful规范,可以设计出易于理解、维护和扩展的Web服务接口,提高系统的可维护性、可扩展性和可用性。
2024-09-17 20:26:40 871
原创 Mybatis-generator自动生成代码的步骤
接下来,创建一个MyBatis Generator的配置文件(通常命名为generatorConfig.xml),该文件将以XML格式定义数据库连接信息、表映射以及生成代码的格式和位置。对于Gradle:由于Gradle官方没有直接支持MyBatis Generator的插件,你可能需要编写一个自定义任务来调用Generator的jar文件。对于Maven:在pom.xml中添加MyBatis Generator Maven插件配置,以便在Maven构建过程中自动运行Generator。
2024-09-16 20:30:00 657
原创 Nacos启动报错 db.num is null
Nacos 的配置文件通常是 application.properties 或 nacos-mysql.properties(如果你使用的是 MySQL)。你需要检查这些文件中是否有关于数据库连接的配置,并且这些配置是否正确。确保 db.num、db.url.0、db.user.0 和 db.password.0 等字段都被正确设置。
2024-09-16 15:11:30 456
原创 设计模式之单例模式
单例模式是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。在实现单例模式时,需要考虑线程安全、延迟加载等因素,并根据具体场景选择合适的实现方式。枚举方式是推荐的实现方式,因为它既简洁又安全。
2024-09-16 13:59:20 727
原创 Spring Data JPA 中的findById、getOne方法
findById:适用于需要立即检查实体是否存在或需要完全加载实体的场景。它返回一个Optional对象,可以安全地处理实体不存在的情况。getOne:适用于只需要实体引用的场景,特别是当你计划在后续操作(如通过EntityManager)中完全加载实体时。它可能返回一个代理对象,需要小心处理懒加载的关联。
2024-09-15 22:03:47 475
原创 JVM基础:深入理解类加载器
类加载器是JVM中一个非常重要的组件,它负责将.class文件加载到JVM中,并为其创建java.lang.Class对象。通过了解类加载器的层次结构、加载机制以及类加载过程,我们可以更好地理解和使用Java平台,避免在开发中遇到类加载相关的问题。同时,自定义类加载器也为Java平台提供了更多的灵活性和扩展性。
2024-09-14 14:18:12 1541
原创 Java 8新特性:Lambda表达式的魅力
Lambda表达式本质上是一个匿名函数,它可以被理解为一段可以传递的代码块。Lambda表达式允许你以更简洁的方式传递行为给方法,替代了传统的匿名内部类。Lambda表达式没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。Lambda表达式也可称为闭包。
2024-09-13 17:50:01 506
原创 MySQL索引的深入学习与应用
定期检查索引的碎片化和使用情况,对无效的或不再需要的索引进行清理,对性能下降的索引进行重建。:非叶子节点仅存储键值,使得每个节点能存储更多索引项,降低树的高度,从而减少磁盘I/O次数。:过多的索引会消耗大量资源并降低数据更新操作的性能,应根据实际情况评估索引的必要性。:针对文本数据设计的索引,支持全文搜索,适用于新闻、博客等文本内容丰富的场景。:在多个列上创建的索引,适用于多条件查询场景,列的顺序对查询性能有显著影响。:在创建复合索引时,根据查询条件中列的使用频率和顺序来安排索引列的顺序。
2024-09-12 23:27:24 732
原创 什么是B树和B+树
与B树不同,B+树的所有数据(或记录的指针)都存储在叶子节点中,而非叶子节点仅作为索引使用,不保存实际数据。B树,即平衡多路查找树,也称为B-树或B_树,是一种自平衡的树状数据结构。:对于m阶的B+树,非叶子节点的关键字个数k满足ceil(m/2) ≤ k ≤ m,且这些关键字仅用于索引,指向相应的子树或叶子节点。B+树是B树的一种变体,它同样是一种自平衡的树状数据结构,但在结构和用途上与B树有所不同。:B+树的插入和删除操作主要在叶子节点上进行,并通过分裂和合并操作来保持树的平衡。
2024-09-12 23:02:03 1190
原创 MySQL分库分表
MySQL分库分表是一种有效的数据库优化手段,通过合理的拆分策略可以提高数据库的存储能力、查询性能和扩展性。在实施分库分表时,需要根据具体的业务场景和性能需求来选择合适的策略和中间件,并在实施过程中注意分布式事务、跨库查询、主键避重和数据迁移等问题。
2024-09-10 21:52:59 608
原创 vue项目中引入组件时出现的Module is not installed问题
问题描述:你可能尝试引入了一个npm包或自定义组件,但是忘记了先通过npm或yarn安装这个包,或者安装过程失败了。确保你已经在项目的根目录下运行了npm install <包名>或yarn add <包名>来安装所需的包。确保它是相对于你的文件位置的相对路径,或者是npm包的正确名称。仔细检查模块名或文件名的拼写,确保它与实际安装的包名或文件名完全匹配(包括大小写)。如果是在引入自定义组件时出错,请确保该组件文件存在于你的项目中,并且路径正确。问题描述:你安装的包可能与你项目中的其他依赖不兼容。
2024-09-10 21:45:13 881
原创 对上篇文章线程安全问题的具体解决策略实现细节的详细阐述:
在这个例子中,increment() 方法被声明为 synchronized,这意味着在同一时刻只能有一个线程执行该方法。因此,竞态条件被避免。使用 ReentrantLock 提供了比 synchronized 更灵活的锁定机制,包括尝试锁定(tryLock())和可中断的锁定(lockInterruptibly())。
2024-09-08 11:31:00 580
原创 深入探索Java多线程中的常见线程安全问题及其解决策略
然而,在Java中,许多看似简单的操作(如自增、自减)实际上都是非原子的,因为它们包含多个步骤(读取、计算、写入)。内存可见性问题源于Java的内存模型,该模型允许线程在本地缓存中持有共享变量的副本,以减少对主内存的访问次数。对于更复杂的操作,可以考虑使用锁(如ReentrantLock)或同步代码块来确保整个操作的原子性。使用volatile关键字来确保变量的内存可见性,但需注意它并不能保证复合操作的原子性。确保所有修改共享资源的操作都是原子的,或者通过同步机制将相关操作组合成原子操作。
2024-09-08 11:17:31 612
原创 Java多线程:深入探索与详细解析
作为Java中的基本执行单元,线程是轻量级的进程,由线程ID、程序计数器、Java虚拟机栈、本地方法栈、和线程私有内存等部分组成。每个线程都有独立的执行路径,但共享进程的资源(如内存)。:进程是系统资源分配的基本单位,它包含了一个或多个线程以及这些线程运行所需的资源。在Java中,JVM(Java虚拟机)就是一个进程,而运行在JVM上的多个线程则共享JVM的内存空间。:并发指的是多个任务在同一时间段内交替执行,而并行则指的是多个任务在同一时刻真正同时执行。
2024-09-08 11:09:43 1579
原创 SQL约束
SQL约束是关系型数据库中保障数据完整性和一致性的重要工具。通过合理使用SQL约束,可以确保数据库中的数据满足预期的规则和要求,从而提高数据库的整体性能和可靠性。在数据库设计和数据操作过程中,我们应该充分利用SQL约束,使其成为构建健壮应用的有力工具。
2024-09-05 22:29:20 1474
原创 idea向git上推送被拒绝 push to master was rejected
如果你确定要覆盖远程分支的历史(例如,你已经合并了远程分支的更改),并且了解强制推送的后果,你可以使用 --force 或 --force-with-lease 选项来强制推送。如果没有权限,你应该创建一个新的分支,将你的更改推送到这个分支,并创建一个合并请求或拉取请求来合并到你的目标分支(如 master)。检查你的远程分支名是否正确(通常使用 git branch -r 查看远程分支列表)。确保你正在尝试推送的分支名与远程仓库中的分支名完全匹配。如果分支名不正确,更改你的本地分支名或更正你的推送命令。
2024-09-04 22:59:46 741
原创 MySQL备份:备份策略、物理备份、mysqldump备份、增量备份、差异备份
1.备份策略概述制定MySQL备份策略时,应考虑以下几个方面:备份频率:根据业务需求和数据变化频率,确定备份的时间间隔。对于高变化率的数据,可能需要更频繁的备份。备份类型:包括全量备份、增量备份和差异备份等,每种类型有其适用场景和优缺点。备份存储:确保备份数据存储在安全可靠的位置,可以是本地磁盘、网络存储设备或云存储服务。恢复演练:定期进行备份恢复演练,以验证备份的有效性和恢复流程的正确性。自动化与监控:实现备份过程的自动化,并设置监控机制以跟踪备份状态和及时发现潜在问题。冷备份:在数据库关闭状
2024-09-03 20:49:42 895
原创 MySQL主从同步
主服务器的副本,接收主服务器上的二进制日志,并将其应用到自己的数据库中,以实现数据的同步。:从服务器上的一个日志文件,存储了从主服务器接收到的二进制日志的副本。从服务器会读取中继日志,并将其中的操作应用到自己的数据库中。从服务器上的SQL线程会读取中继日志中的事件,并按照这些事件在主服务器上发生的顺序在从服务器上执行。:通过主从同步,可以将主服务器上的数据实时复制到从服务器上,实现从服务器作为数据备份的功能。中继日志是从服务器上的一个日志文件,用于存储从主服务器接收到的二进制日志的副本。
2024-09-02 22:53:10 858
原创 MySQL用户管理:用户管理、用户授权、用户权限撤销
通过GRANT语句,可以将不同的权限授予给不同的用户,以控制他们对数据库和表的访问。这里,‘username’@'localhost’指定了用户名和用户可以从哪个主机连接,'password’是用户的登录密码。用户权限的撤销是通过REVOKE语句实现的。通过REVOKE语句,可以删除用户的一个或多个权限,甚至收回所有权限。在进行用户管理时,应谨慎操作,避免授予过多权限给不需要这些权限的用户,以维护数据库的安全性。WITH GRANT OPTION(可选):允许用户将自己的权限授予其他用户。
2024-09-01 14:29:50 869
原创 如何在MySQL中实现乐观锁
如果受影响的行数为0,说明版本号已经改变,数据在读取和更新之间被其他事务修改过,此时需要根据业务需求进行相应的处理(如回滚事务、抛出异常、重试等)。:如果表的更新操作非常频繁,且经常需要根据版本号或时间戳进行筛选,那么为这些字段添加索引可能会提高查询性能。但请注意,索引也会占用额外的存储空间,并可能增加写操作的开销。更新数据时,将版本号作为更新条件的一部分,以确保在更新操作执行时,版本号仍然与读取时一致。:版本号或时间戳的更新和数据的更新必须在一个事务中完成,以确保操作的原子性。
2024-08-31 22:04:06 1061
原创 MySQL锁机制的介绍
例如,可以在数据库表中添加一个版本号字段,每次更新数据时,将该字段的值加一。在更新前,先检查该字段的值是否与预期一致,如果一致则进行更新,否则认为数据已被其他事务修改,操作失败。加锁后,整个数据库实例处于只读状态,后续的DML(数据操作语言)写语句、DDL(数据定义语言)语句以及更新操作的事务提交语句都将被阻塞。:每次操作锁住对应的行数据,锁定粒度最小,发生锁冲突的概率最低,并发度最高,但开销大、加锁慢,且容易发生死锁。:在事务结束后要及时释放锁,以避免锁定资源过长时间,影响其他事务的执行。
2024-08-31 21:53:28 560
原创 MySQL数据库事务的学习(有业务场景案例)
事务中的操作要么全部成功,要么全部失败,不会结束在中间某个环节。事务在执行过程中发生错误会被回滚(Rollback)到事务开始前的状态,就像这个事务从未执行过一样。
2024-08-30 23:00:21 1474
原创 数据库视图的使用
数据库视图是一种强大的工具,它可以帮助我们简化查询、提高数据安全性、减少数据冗余并支持数据复用。通过创建、查询、更新和删除视图,我们可以更高效地管理和使用数据库中的数据。然而,在使用视图时也需要注意其限制和潜在的性能影响。
2024-08-29 23:08:56 680
原创 RuoYi前后端分离如何使用详细描述
将RuoYi项目中提供的SQL文件(如ry_xxxx.sql)导入到刚刚创建的数据库中,这些SQL文件包含了项目所需的基础数据表结构和初始数据。在IDE中,右键点击后端项目的主类(如RuoYiApplication.java),选择“Run”来启动后端服务。:Node.js是前端项目的运行环境,npm是Node.js的包管理工具,用于下载和安装前端项目所需的依赖。前端项目(通常位于ruoyi-ui文件夹)需要配置Vue项目的基本信息,如端口号、代理设置等。
2024-08-27 23:19:02 837
原创 学习MyBatis-Plus
MyBatis-Plus是MyBatis的增强版,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。它内置了通用Mapper、通用Service,仅通过少量配置即可实现单表大部分CRUD操作,并且提供了强大的条件构造器,支持Lambda形式调用,方便编写各类查询条件。
2024-08-26 21:31:39 984
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人