- 博客(127)
- 收藏
- 关注
原创 Spring 如何处理循环依赖
一级缓存(singletonObjects):这是一个 Map,用于存放已经完全初始化好的单例 Bean,这些 Bean 可以直接使用。二级缓存(singletonFactories):同样是一个 Map,用于存放提前暴露的单例 Bean 工厂,这里的 Bean 处于创建过程中,还未完成初始化。三级缓存(earlySingletonObjects):也是一个 Map,用于存放提前暴露的单例 Bean,这些 Bean 只是实例化了,但未完成属性注入和初始化操作。
2025-03-25 15:06:55
275
原创 项目实战--网页五子棋(对战功能)(9)
上期我们完成了websocket建立连接后的数据初始化,今天我们完成落子交互的具体代码:这里我们先复习一下,之前约定好的落子请求与响应包含的字段: 我们在script.js文件中找到落子的相关方法,增加发送请求的代码: 2. 处理请求发送响应实现putChess:注意:我们并没有把Room注册为Spring组件,进行依赖注入时,需要在构造方法中手动注入: 实现checkWinner方法检测是否获胜: 3. 处理落子响应在之前初始化游戏的代码中,我们在游戏初始化完
2025-03-08 20:04:55
243
原创 项目实战--网页五子棋(游戏房间)(6)
上期我们基本完成了匹配功能,这期我们来实现游戏房间相关的代码由于同时会存在多个游戏房间,我们实现游戏房间时可以再实现一个房间管理器,用于管理游戏房间,我们约定房间管理器通过哈希表来管理游戏房间。
2025-02-25 15:23:52
179
原创 项目实战--网页五子棋(匹配模块)(5)
我们新建一个Matcher类用来实现匹配逻辑@Component//每个匹配队列代表不同的段位,这里约定每一千分为一个段位@Autowired@Autowired//暂定三个段位i < 3;i++) {//对操作的队列加锁保证线程安全System.out.println("用户 " + user.getUsername() + " 加入了 " + index + "号 队列");
2025-02-23 16:45:54
485
原创 项目实战--网页五子棋(登录注册)(2)
上期我们实现了用户模块的后端代码,这期我们来实现登录界面的前端代码,这里主要讲解前后端交互的代码。这里我事先已经写好了一个简单的登录界面.
2025-01-13 15:13:09
436
原创 项目实战--网页五子棋(用户模块)(1)
接下来我将使用Java语言,和Spring框架,实现一个简单的网页五子棋。主要功能包括用户登录注册,人机对战,在线匹配对局,房间邀请对局,积分排行版等。这篇文件讲解用户模块的后端代码。
2025-01-11 17:36:12
578
原创 WebSocket介绍与使用
在我们平时写的web项目中,大多是使用http协议,但是http协议是典型的一问一答的模式,只能由客户端向服务器发送请求,再由服务器返回响应,但实际开发中,很多场景都需要服务器主动发送消息给服务端,这时就需要使用WebSocket协议。WebSocket是基于TCP协议实现的应用层协议,它通过 HTTP 协议进行握手。客户端首先发送一个 HTTP 请求,请求中包含一些特殊的头部信息,表明这是一个 WebSocket 连接请求。
2025-01-10 16:22:49
426
原创 面试题.05
Java 的并发问题涉及多个线程同时访问和修改共享资源,可能导致数据不一致或程序行为异常。竞态条件:多个线程同时访问和修改共享变量,导致不一致的结果。可以通过加锁解决,但是加锁又会引入新的问题。死锁:两个或更多线程互相等待对方释放资源,导致程序停滞。需要在编码层面解决。可见性问题:Java内存模型给线程引入了工作内存,一个线程更新了某个共享变量的值时,其他线程可能无法立即看到这个更新,导致程序出现不可预测的行为,可以通过volitile关键字,或者通过synchronized同步锁的方式解决。
2024-09-11 10:41:36
999
1
原创 零基础学习Redis(11) -- 全局命令补充
scan用于获取redis中的key,前面我们学习过keys,keys命名会一次性获取所有满足条件的key,如果key的数量过多的话就可能把redis卡死,scan则可以指定一次获取key的数量。使用count必须加count关键字,注意cursor,返回的cursor为0时代表遍历完了所有的key注意:sacn 虽然解决了阻塞的问题,但如果在遍历期间,键的数量有所变化,可能导致遍历时重复或者遗漏,这点必须在开发中考虑。
2024-09-10 16:05:03
603
原创 零基础学习Redis(10) -- zset类型命令使用
zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。
2024-09-09 14:51:39
2177
原创 面试题.04
jmm是一种抽象的概念,用于定义多线程程序如何与内存进行交互主内存:所有变量都存储在主内存中,主内存是共享的。工作内存:每个线程都有自己的工作内存,工作内存中保存了主内存中变量的副本。线程对变量的所有操作(读取、写入)都在工作内存中进行,最后再将结果同步回主内存。工作内存指的是CPU的寄存器和缓存,比起内存来说,访问速度是快得多的,引入工作内存可以减少内存访问延迟,提高程序的执行效率。但同时也引入了内存可见性问题。
2024-09-07 11:07:04
489
1
原创 深入理解MySQL慢查询优化
逐行读取,收集到足够的数据直接返回避免了全量计算在查询时利用有索引的序性快速定位到所需数据的区间,最大限度发挥增量查询的优势。
2024-09-04 14:04:39
1185
原创 深入理解MySQL慢查询优化(3) -- 案例实操
经过前面内容的理解,我们以及了解了MySQL的优化策略,以及SQL语句的执行流程,接下来我们通过一个问题来学习,如何优化SQL。
2024-09-02 16:51:00
1076
原创 深入理解MySQL慢查询优化(1) -- 优化策略
逐行读取,收集到足够的数据直接返回避免了全量计算在查询时利用有索引的序性快速定位到所需数据的区间,最大限度发挥增量查询的优势。
2024-09-02 16:37:19
592
原创 零基础学习Redis(9) -- set类型命令使用
set,即集合和list类似,集合中的每个元素都是string类型,但是集合中的元素是无序且不能重复的。
2024-08-30 15:06:18
1340
原创 MySQL索引详解
索引可以理解为把数据按照某种数据结构组织起来,从而提高查询效率,例如把数据构建为二叉搜索树,可以把查询时间复杂度降为O(log2n)。MySQL中的索引就可以很好的解决这两个问题。
2024-08-29 11:11:39
1260
原创 MySQL数据库MVCC机制底层原理详解
由于min_id是所有未提交事务中最小的id,所以事务id小于min_id的一定是已经提交的事务是可见的,同时大于max_id的事务,是生成快照时还没有创建的事务,是不可见的,在min_id和max_id之间的事务要分两种情况,在未提交数组中则说明是不可见的,不在则说明事务已经提交是可见的,当执行查询语句,就会沿着版本链从最新的数据开始查,直到查到可见的数据。接下来执行第5行,同样是一个写操作也会生成事务id,同时上面我们说过,对于被修改的数据行还会生成一个数据版本,于是这个新生成的。
2024-08-28 12:54:12
1271
原创 零基础学习Redis(7) -- hash类型命令使用
Redis本身就是通过哈希表的方式组织数据,同时redis中的value也可以是另一个哈希表。
2024-08-27 14:35:18
689
原创 零基础学习Redis(6) -- string类型命令使用
redis中,不同的数据结构有不同的操作命令。redis中的string是按照二进制存储的,不会对数据做任何编码转换。
2024-08-25 15:51:10
732
原创 零基础学习Redis(4) -- 常用数据结构介绍
我们之前提到过,redis中key只能是字符串类型,而value有多种类型。redis中的数据结构有自己独特的实现方式能根据特定的场景进行优化。
2024-08-19 14:34:20
425
原创 零基础学习Redis(3) -- Redis常用命令
Redis是一个 客户端-服务器 结构的程序,Redis客户端和服务器可以在同一台主机上,也可以在不同主机上,客户端和服务器之间通过网络进行通信。服务器端负责存储和管理数据。客户端则可以通过命名对服务端的数据进行操作。Redis客户端有多种,1.自带的命令行客户端(redis-cli),2.带图形界面的客户端(不推荐使用),3. 基于Redis的api自行开发的客户端(类似于mysql的jdbc,工作中最常用的)
2024-08-18 15:52:43
1191
原创 零基础学习Redis(2) -- Redis安装与配置
Redis官方是并不支持Windows系统的,并且现在绝大部分公司都是使用的Linux,所以我们在Linux上进行安装,这里我使用的是Ubuntu。
2024-08-14 15:55:14
383
原创 性能测试--LoadRunner的使用(1)
VUG用于录制脚本,写代码。Controller:设计测试场景运行测试场景。Analysis:产生测试报告。通过VUG录制脚本,把脚本放在Controller中设计的场景中运行,Controller将监控的指标生成测试报告给到Analysis。
2024-08-07 14:44:35
991
原创 面试题.03
HashMap,HashTable都是Java标准库中的数据结构,都使用了key-value的存储形式,其中key不能重复,value可以重复,存储的元素是无序的。HashMap中key和value都可以为null,HashTable中key和value都不能为nullHashTable是线程安全的浅拷贝深拷贝都是复制对象时的概念。浅拷贝是指复制对象时,只复制每个属性的值,如果有引用类型则直接复制该引用的值,这就导致复制完成后,两个对象中的引用类型是指向同一个对象。
2024-08-05 09:41:27
526
原创 MySQL锁详解
锁是计算机在执行多线程或线程时用于并发访问同一共享资源时的同步机制,MySQL中的锁是在服务器层或者存储引擎层实现的,保证了数据访问的一致性与有效性。
2024-08-01 16:22:55
684
原创 性能测试--概述
性能测试是评估系统在特定条件下执行的能力和稳定性的过程。它旨在识别系统在正常和峰值负载下的表现,以及系统在持续使用和不同负载情况下的响应时间、资源利用率和稳定性。
2024-07-28 15:33:15
279
原创 自动化测试--WebDriver API
如果在进行搜索后马上对结果进行检查,页面可能还没有加载完成,此时检查可能会误判,可以添加等待来等待页面加载完成后再检查。通过隐式等待,会等待页面所有元素加载完成后停止等待,如果设置时间内页面没有加载完成,则会抛出异常。例如我想点击这个click。
2024-07-25 15:39:45
459
1
原创 面试题.02
ThreadLocal可以理解为一个容器,其中可以存放对象,一个线程只能访问到自身存入其中的对象。在Thread类中有一个属性为ThreadLocalMap,一个线程往ThreadLocal中存对象时,实际上是存入了自己的ThreadLocalMap中,ThreadLocal对象为Key,存入的对象为Value,所以每个线程只能访问自己存入ThreadLocal中的对象。
2024-07-24 20:50:34
481
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人