- 博客(52)
- 收藏
- 关注
原创 责任链模式
责任链模式是一种行为型设计模式。它的核心思想是:通俗理解:责任链模式解决的问题:典型应用场景:责任链结构图可以抽象如下:Client 不知道具体哪个 Handler 会处理请求。每个 Handler 自己判断能否处理,不能处理就交给 next。责任链模式核心设计链条是动态可扩展的通过 或者构造函数动态组合节点。节点内逻辑独立每个节点只关注自己处理的业务逻辑,不依赖其他节点。递归或循环传递请求节点处理完后,如果有下一个节点,递归调用下一节点处理请求。可停止链条
2025-11-21 20:03:02
584
1
原创 Redis哨兵
由于redis中的主从是读写分离的 如果主节点挂了 那么写操作会都被阻塞 说白了整个集群直接不可用了 怎么可能还要高可用 因此我们需要对此做出一些应对Redis 在 2.8 版本以后提供的Sentinel,它的作用是实现。它会监测主节点是否存活,如果发现主节点挂了,它就会选举一个从节点切换为主节点,并且把新主节点的相关信息通知给从节点和客户端。
2025-09-24 17:09:51
485
原创 RabbitMQ高级
由于每个消息发送时的处理逻辑不一定相同,因此ConfirmCallback需要在每次发消息时定义。具体来说,是在调用RabbitTemplate中的convertAndSend方法时,多传递一个参数:id:消息的唯一标示,MQ对不同的消息的回执以此做判断,避免混淆:回执结果的Future对象将来MQ的回执就会通过这个Future来返回,我们可以提前给中的Future。
2025-09-21 19:57:43
344
原创 Redis主从
为什么需要redis的主从机制呢?那么问题来了 这些服务器之间的数据如何保持一致性呢?数据的读写操作是否每台服务器都可以处理?Redis 提供了,来避免上述的问题。这个模式可以保证多台服务器的数据一致性,且主从服务器之间采用的是「读写分离」的方式。也就是说,所有的数据修改只在主服务器上进行,然后将最新的数据同步给从服务器,这样就使得主从服务器的数据是一致的。我们先来简单看看怎么搭建一个简单的主从集群。
2025-09-10 19:11:42
261
原创 RabbitMQ
Work queues,任务模型。简单来说就是。当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度。长此以往,消息就会堆积越来越多,无法及时处理。此时就可以使用work 模型,了。消息是平均分配给每个消费者,并没有考虑到消费者的处理能力。导致1个消费者空闲,另一个消费者忙的不可开交。没有充分利用每一个消费者的能力,这样显然是有问题的。
2025-09-08 00:07:25
1127
原创 网关 配置管理
Spring Cloud Gateway 要求你写的过滤器能和配置文件(yaml)绑定。如果直接实现,没法在配置文件里使用。所以官方推荐继承,它帮你把过滤器和配置文件打通。自定义不是直接实现,而是实现。@Component@Override@Override// 获取请求// 编写过滤器逻辑System.out.println("过滤器执行了");// 放行注意:该类的名称一定要以为后缀!
2025-08-31 11:39:15
914
原创 Spring Cloud
微服务架构,首先是服务化,就是将单体架构中的功能模块从单体应用中拆分出来,独立部署为多个服务。微服务拆分以后碰到的各种问题都有对应的解决方案和微服务组件,而SpringCloud框架可以说是目前Java领域最全面的微服务组件的集合了。而且SpringCloud依托于SpringBoot的自动装配能力,大大降低了其项目搭建、组件使用的成本。对于没有自研微服务组件能力的中小型企业,使用SpringCloud全家桶来实现微服务开发可以说是最合适的选择了!
2025-08-02 17:04:38
852
原创 Mybatis-Plus(为简化开发而生)
在某些企业中SQL语句是不能写在service层的代码中的 SQL语句在service中不仅难维护 并且违背了三层架构的初心 因此我们就直接使用mp提供的自定义SQL基本用法@Test// 1.准备自定义查询条件// 2.调用mapper的自定义方法,直接传递Wrapperimportcom。
2025-07-22 20:24:29
1029
原创 如何实现一个定时任务
尽管二者的适用场景有所区别,但它们的核心思想都是将任务的执行时间安排在未来的某个点上,以达到预期的调度效果那么我们如何实现一个定时任务呢。
2025-07-19 17:42:04
723
原创 MQ(消息队列)
MQ(message quene,消息队列) 是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中取出消息供自己使用即可。由于队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的参与消息传递的双方称为和,生产者负责发送消息,消费者负责处理消息。随着分布式和微服务系统的发展,消息队列在系统设计中有了更大的发挥空间,使用消息队列可以降低系统耦合性、实现任务异步、有效地进行流量削峰,是分布式和微服务系统中重要的组件之一。
2025-07-17 20:58:06
1266
原创 Redisson
我们发现昨天的项目还是有些问题 昨天我们用lua脚本保证原子性 但是还是有几点问题这个我们手动实现极其麻烦 所以我们选择一种成熟的技术 redisson Redisson是一个在Redis的基础上实现的Java驻Java内存数据网格。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务,其中就包含了各种分布式锁的实现。实现步骤导入依赖</</</</通过redissonClient中的getlock来拿到锁 实现分布式锁 从而解决上面我们提到的问题。
2025-07-16 19:36:19
855
原创 基于redis的分布式锁 lua脚本解决原子性
解决起来也很简单 解决方案就是在每个线程释放锁的时候,去判断一下当前这把锁是否属于自己,如果属于自己,则不进行锁的删除,假设还是上边的情况,线程1卡顿,锁自动释放,线程2进入到锁的内部执行逻辑,此时线程1反应过来,然后删除锁,但是线程1,一看当前这把锁不是属于自己,于是不进行删除锁逻辑,当线程2走到删除锁逻辑时,如果没有卡过自动释放锁的时间点,则判断当前这把锁是属于自己的,于是删除这把锁。这样我们在测试的时候就会发现 我们虽然部署两台tomcat服务器 但锁不仅仅是在一个jvm中的 而是作用域全局的。
2025-07-15 21:29:33
561
3
原创 悲观锁 乐观锁
在没有加锁的秒杀场景下 每秒打进来的请求是巨大的 高并发场景下 我们发现不仅异常率高的可怕 库存竟然还变成了负数 这产生的结果肯定是很大损失的 那为什么会出现超卖问题呢我们假设有下面两个线程线程1查询库存,发现库存充足,创建订单,然后准备对库存进行扣减,但此时线程2和线程3也进行查询,同样发现库存充足,然后线程1执行完扣减操作后,库存变为了0,线程2和线程3同样完成了库存扣减操作,最终导致库存变成了负数!这就是超卖问题的完整流程。
2025-07-14 20:38:17
546
原创 MySQL中的锁
执行后,当然,当会话断开了,全局锁会被自动释放。全局锁主要应用于做,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。但是使用全局锁在更新的时候 会出现数据量过大 更新时间过长 导致数据库长时间不能写数据 导致业务停滞那有什么其他方式可以避免?有的,如果数据库的引擎支持的事务支持,那么在备份数据库之前先开启事务,会先创建 Read View,然后整个事务执行期间都在用这个 Read View,而且由于 MVCC 的支持,备份期间业务依然可以对数据进行更新操作。
2025-06-11 18:36:22
995
原创 点评中是如何实现短信登录的
首先在这个项目中 我们主要还是通过session来实现的验证码登录根据这个图片我们很清楚的知道 首先要制造一个随机的验证码以确保并且保存到redis中(等下我会说为什么不存在session中)接下来前端传来验证码 后端校验后 判断是否为新用户 如果是新用户 那么注册一个用户 将昵称设置为随机字段 手机号为唯一字段 如果存在 就保存在redis中 返回随机token给客户端 接下来前端传来手机号 我们从redis中拿到用户信息 保存到Threadlocal中 放行请求。
2025-06-05 00:02:48
891
原创 缓存击穿 缓存穿透 缓存雪崩
在日常开发中,我们经常会在后端引入 Redis 缓存来减轻数据库压力、提高访问性能。本文将介绍 Redis 缓存常见问题及解决策略。
2025-06-05 00:01:28
509
原创 执行SQL语句时 MySQL内部发生了什么
概念特点优点出现情况主键索引查询走主键B+树直接定位数据行(聚簇索引)快,直接命中且 id 是主键时全表扫描从头读到尾,不走索引简单粗暴没有索引,或索引选择性差时索引下推利用索引中的额外字段提前做条件判断减少回表次数,提高查询效率联合索引 + WHERE条件较多时。
2025-05-22 11:28:30
716
原创 redis的List为什么用ziplist和quicklist
是一种节省内存的,最早是 Redis 中为了减少内存开销而引入的一种。它不是标准库里的内容,而是某些底层系统(比如 Redis)在特定场景下的手动实现。你可以把它理解为一个连续内存块中,紧凑地存储多个数据项(字符串或整数)的结构。
2025-05-19 21:34:19
1444
1
原创 基于PageHelper的分页查询
它的使用很便利,大大简化了分页查询的操作步骤,因此在企业开发中也比较常见,作为一名合格的开发者,我们要熟练的掌握基于PageHelper的分页查询操作。分页查询支持:PageHelper提供了直接在SQL语句中添加分页相关的信息,如页码、每页记录数等,从而实现分页查询功能。SQL拦截器:PageHelper通过自定义的SQL拦截器拦截和处理查询SQL,自动添加分页的SQL语句,实现分页查询。PageHelper的底层原理是拦截,拦截需要进行分页查询的SQL请求,读取用户传入参数,自主构造分页SQL语句。
2025-05-18 22:33:41
544
原创 ThreadLocal
ThreadLocal 的适用场景和不适用场景线程安全性:当多个线程需要访问相同的对象,但每个线程需要维护自己的独立副本时,可以使用 ThreadLocal 来实现线程安全。例如,在Web应用程序中,每个请求可能由不同的线程处理,而每个线程都需要独立地访问数据库连接或用户身份信息等。线程上下文信息传递:在某些情况下,我们需要在线程之间传递一些上下文信息,如用户身份、语言偏好等。通过将这些上下文信息存储在 ThreadLocal 中,可以避免在方法参数中传递这些信息,从而简化方法签名和调用。
2025-05-15 16:04:59
845
原创 计算机网络
是一种面向连接的、可靠的传输协议。它在发送数据之前必须先建立连接,这一过程称为“三次握手”。数据在传输过程中经过确认应答机制重传机制和排序机制,确保数据完整、按顺序地送达接收端。是一种无连接的、不可靠的传输协议。它不建立连接,数据直接发出,不确认是否到达。虽然它不保证数据的顺序与完整性,但正因为简洁,传输效率非常高,常用于对实时性要求高的应用。
2025-05-14 18:39:43
830
原创 Object类
这三个方法是Object类中与线程协作相关的方法,只能在同步代码块或方法中使用。方法含义wait()当前线程进入“等待状态”,释放锁notify()唤醒一个正在等待这个对象锁的线程唤醒所有等待的线程方法用途是否常重写使用场景toString()输出对象信息是打印日志、调试equals()对象内容比较是判断业务对象是否“相等”hashCode()哈希容器索引是wait()notify()线程通信否多线程协作模型==和equals有什么区别?==比较的是两个变量是否指向同一个内存地址。
2025-05-11 16:03:02
1077
原创 spring常见注解
资源,就是网络上的一个实体,可以是任何东西:比如:一个用户、一张图片、一篇文章、一条评论…资源应该被抽象为名词。资源本身是一个抽象概念,但我们通过某种形式把它表现出来,这就叫表现层。JSON(最常见)XMLHTML图片文件(二进制)客户端通过操作资源来改变资源的状态创建一个用户修改一个用户信息删除一个用户每一次操作,都是一次状态转移。而这些操作,主要是通过 HTTP 协议的方法(动词)完成的。
2025-05-05 16:28:35
1017
原创 01背包 完全背包
回溯就是。遇到一个问题时,递归地,直到到达终点,然后换一种选择继续试。:在一棵决策树上,暴力走遍所有路径。记忆化搜索是的。就是在递归的时候,,下次遇到同样的子问题就直接用,不用再算。:在走决策树的过程中,遇到同一棵子树,直接抄答案。递推是的做法。明确每一个子问题的定义(也叫做),然后根据小的状态一步步算出大的状态,推进。:像搭积木一样,一块块从底部搭上去。所以动态规划中每一个状态一定是由上一个状态推导出来的,,贪心没有状态推导,而是从局部直接选最优的,题目1:打家劫舍(House Robber)
2025-04-28 19:12:22
876
原创 从回溯到记忆化搜索再到递推
令 P = (sum(nums) + target) / 2,统计凑成 P 的子集方案数,定义。思路:对第 i 间房可“偷”或“不偷”,暴力枚举所有方案,时间复杂度 O(2^n)。状态到 Map 或二维数组,避免重复,复杂度 O(n·sum)。对每个元素选择“+”或“-”,暴力枚举,时间 O(2^n)。缓存已算结果,避免重复调用,时间复杂度降为 O(n)。:在走决策树的过程中,遇到同一棵子树,直接抄答案。缓存子问题,时间降为 O(n·amount)。,下次遇到同样的子问题就直接用,不用再算。
2025-04-27 17:17:58
708
原创 Redis入门
Spring Data Redis 通过和提供了一套简洁、强大的 API,让 Java 开发者可以非常方便地在 Spring 应用中集成和操作 Redis,专注于业务逻辑而非底层细节。它无疑是 Spring 技术栈中操作 Redis 的首选方案。/*** 配置Redis连接和操作的相关设置*/@Slf4j/*** 创建并配置RedisTemplate实例* @param redisConnectionFactory Redis连接工厂,用于创建Redis连接。
2025-04-20 17:34:16
363
原创 重生之外卖配送时被投诉后的反思
写苍穹外卖时 我们发现在每一次调用sql语句时 insert update语句总会需要在service的实现类里加入例如create_time,create_user , update_time , update_user的填充 每次赋值都要重新编写代码,会造成代码冗余;那我们有什么解决办法呢 很容易想到我们之前用的aop的通知应用实例 也就是在执行mapper层的方法前先被aop切面拦截下来 通过切面对公共字段填充(反射赋值)具体操作如下。
2025-04-13 15:13:55
925
原创 SQL语句
MySQL 是当前互联网公司中使用最广泛的开源关系型数据库,主要分为商业版和社区版。本文中我们主要以 MySQL 社区版为例,版本号可参考 8.0.34。DDL 用于定义数据库和数据表的结构,包括创建、查询、修改和删除操作。
2025-04-06 18:00:19
1053
原创 HTTP协议
Web服务器(Tomcat)对HTTP协议的请求数据进行解析,并进行了封装(HttpServletRequest),并在调用Controller方法的时候传递给了该方法。http是个无状态的协议,所以在请求头设置浏览器的一些自身信息和想要响应的形式。无状态指的是客户端发送HTTP请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息。刚才提到HTTP协议是规定了请求和响应数据的格式,那具体的格式是什么呢?响应行(以上图中红色部分):响应数据的第一行。HTTP协议又分为:请求协议和响应协议。
2025-03-30 16:09:24
368
原创 Ioc(控制反转)
通俗点讲,因为项目中每次创建对象是很麻烦的,所以我们使用 Spring IoC 容器来管理这些对象,需要的时候你就直接用,不用管它是怎么来的、什么时候要销毁,只管用就好了。容器负责创建、配置和管理 bean,也就是它管理着 bean 的生命,控制着 bean 的依赖注入。控制反转就是把创建和管理 bean 的过程转移给了第三方。而这个第三方,就是 Spring IoC Container,对于 IoC 来说,最重要的就是。bean又是什么?
2025-03-30 16:08:08
546
原创 Java的异常处理
异常是指中断程序正常执行的一个不确定的事件。当异常发生时,程序的正常执行流程就会被打断。一般情况下,程序都会有很多条语句,如果没有异常处理机制,前面的语句一旦出现了异常,后面的语句就没办法继续执行了,有了异常处理机制后,程序在发生异常的时候就不会中断,我们可以对异常进行捕获,然后改变程序执行的流程。除此之外,异常处理机制可以保证我们向用户提供友好的提示信息,而不是程序原生的异常信息——用户根本理解不了。
2025-03-23 16:20:26
619
原创 Java中的枚举
枚举(enum),是 Java 1.5 时引入的关键字,它表示一种特殊类型的类,继承自 java.lang.Enum。“我们来新建一个枚举 PlayerType。继承关系见反编译的字节码既然枚举是一种特殊的类,那它其实是可以定义在一个类的内部的,这样它的作用域就可以限定于这个外部类中使用PlayerType 就相当于 Player 的内部类。由于枚举是 final 的,所以可以确保在 Java 虚拟机中仅有一个常量对象,基于这个原因,我们可以使用“==”运算符来比较两个枚举是否相等,参照方法。
2025-03-16 16:55:57
945
原创 方法的重写与重载
如果一个类有多个名字相同但参数个数不同的方法,我们通常称这些方法为方法重载如果子类具有和父类一样的方法(参数相同、返回类型相同、方法名相同,但方法体可能不同),我们称之为方法重写。
2025-03-16 16:54:55
769
原创 I O知识框架
IO,即in和out,也就是输入和输出,指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。Java 中是通过流处理IO 的,那么什么是流?流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道。当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样。
2025-03-09 18:07:36
959
原创 JavaScript
是一门跨平台、面向对象的脚本语言,是用来控制网页行为的,实现人机交互效果。JavaScript 和 Java 是完全不同的语言,不论是概念还是设计。但是基础语法类似。
2025-02-27 22:29:48
1190
原创 HTML+CSS
HTML文件后缀为.html首先html有固定的基本结构</</</</</其中<html>是根标签,<head>和<body>是子标签。
2025-02-26 21:09:33
1273
原创 Java ArrayList
从名字就可以看得出来,ArrayList实现了List接口,并且是基于数组实现的。有人就会问了那ArrayList和数组有什么区别呢数组的大小是固定的,一旦创建的时候指定了大小,就不能再调整了。也就是说,如果数组满了,就不能再添加任何元素了。ArrayList在数组的基础上实现了自动扩容,并且提供了比数组更丰富的预定义方法(各种增删改查),非常灵活。
2025-01-17 19:27:43
1157
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅