- 博客(136)
- 收藏
- 关注
原创 Java中Stream流的使用
在 Java 中,Stream 流是 Java 8 引入的一个强大特性,它允许你以声明式的方式处理集合数据。Stream 流提供了一种高效且易于使用的方式来对数据进行过滤、映射、排序、聚合等操作,使代码更加简洁和可读。
2025-07-03 22:44:32
1344
原创 零基础学习RabbitMQ(5)--工作模式(1)
RabbitMQ提供七种消息传递模式:1)简单模式(点对点);2)工作队列(多消费者);3)发布/订阅(广播);4)路由模式(按规则分发);5)通配符模式(灵活匹配);6)RPC通信(异步调用);7)发布确认(可靠投递)。每种模式针对不同场景设计,如集群处理、广播通知、日志分级等,通过交换机和路由机制实现消息的灵活分发。
2025-06-29 16:47:54
1119
原创 零基础学习RabbitMQ(4)--RabbitMQ快速入门
注意:调用basicConsume()方法后,消费者会不断从队列中获取数据,这个操作是由另一个线程执行的,和主线程是异步的,直到连接被释放,这里从调用basicConsume到连接关闭中间消费的数据数量和打印出来的日志不一定是吻合的,有的消息的日志可能还没有打印出来,主线程就关闭了。可以看到队列被创建成功了,并且有一条消息,由于我们在程序末尾释放了连接所有这里是没有Connections和Channels的。这里我们直接使用内置的交换击就无需声明。这里的""代表使用的这个默认的交换机。
2025-06-29 15:06:36
450
原创 零基础学习RabbitMQ(2)--Linux安装RabbitMQ
注意:这里使用的是ubuntu系统RabbitMQ需要Erlang语言的支持,在安装rabbitMQ之前需要安装Erlang安装后输入 rel可查看Erlang版本:输入halt().退出 通过 IP:port访问界面ip为自己的云服务器地址,端口号为15672,注意先开放云服务器该端口的防火墙。默认用户名和密码都是guest rabbitmq从3.3.0开始禁⽌使⽤guest/guest权限通过除localhost外的访问,所以这里我们登录失败了添加管理员用户:设置权限:
2025-06-23 16:47:20
447
原创 零基础学习RabbitMQ(1)--概述
MQ (消息队列)从字面上看,本质上是个队列,先进先出,只不过存储的是消息。MQ多用于分布式系统之间进行通信。直接调用对方的服务,数据从一端发出后立即就可以到达另一端。数据从一端发出后,先进入一个容器进行临时存储,当到达某种条件后,再由这个容器发送给另一端。这里的容器就可以使用MQ。
2025-06-23 15:46:31
373
原创 零基础学习Redis(14) -- Spring中使用Redis
在spring中提供的方法只要大家对于redis命令足够熟悉相信是能够正常的猜测出每个方法的具体作用,不够熟悉的也可以在spring的官方网站上进行查询,关于redis基础使用的学习到这里就基本完结了。
2025-06-22 17:49:37
327
原创 零基础学习Redis(13) -- Java使用Redis命令
上期我们学习了如何使用Java连接到redis,这期我们来学习如何在java中使用redis中的一些命令。
2025-06-22 15:50:40
494
原创 零基础学习Redis(12) -- Java连接redis服务器
在我们之前的内容中,我们会发现通过命令行操作redis是十分不科学的,所以redis官方提供了redis的应用层协议RESP,更具这个协议可以实现一个和redis服务器通信的客户端程序,来简化和完善redis的使用。现阶段有很多封装了RESP协议的库可以使用,接下来我们使用jedis来演示。
2025-06-21 13:48:57
341
原创 Spring 如何处理循环依赖
一级缓存(singletonObjects):这是一个 Map,用于存放已经完全初始化好的单例 Bean,这些 Bean 可以直接使用。二级缓存(singletonFactories):同样是一个 Map,用于存放提前暴露的单例 Bean 工厂,这里的 Bean 处于创建过程中,还未完成初始化。三级缓存(earlySingletonObjects):也是一个 Map,用于存放提前暴露的单例 Bean,这些 Bean 只是实例化了,但未完成属性注入和初始化操作。
2025-03-25 15:06:55
315
原创 项目实战--网页五子棋(对战功能)(9)
上期我们完成了websocket建立连接后的数据初始化,今天我们完成落子交互的具体代码:这里我们先复习一下,之前约定好的落子请求与响应包含的字段: 我们在script.js文件中找到落子的相关方法,增加发送请求的代码: 2. 处理请求发送响应实现putChess:注意:我们并没有把Room注册为Spring组件,进行依赖注入时,需要在构造方法中手动注入: 实现checkWinner方法检测是否获胜: 3. 处理落子响应在之前初始化游戏的代码中,我们在游戏初始化完
2025-03-08 20:04:55
290
原创 项目实战--网页五子棋(游戏房间)(6)
上期我们基本完成了匹配功能,这期我们来实现游戏房间相关的代码由于同时会存在多个游戏房间,我们实现游戏房间时可以再实现一个房间管理器,用于管理游戏房间,我们约定房间管理器通过哈希表来管理游戏房间。
2025-02-25 15:23:52
245
原创 项目实战--网页五子棋(匹配模块)(5)
我们新建一个Matcher类用来实现匹配逻辑@Component//每个匹配队列代表不同的段位,这里约定每一千分为一个段位@Autowired@Autowired//暂定三个段位i < 3;i++) {//对操作的队列加锁保证线程安全System.out.println("用户 " + user.getUsername() + " 加入了 " + index + "号 队列");
2025-02-23 16:45:54
522
原创 项目实战--网页五子棋(登录注册)(2)
上期我们实现了用户模块的后端代码,这期我们来实现登录界面的前端代码,这里主要讲解前后端交互的代码。这里我事先已经写好了一个简单的登录界面.
2025-01-13 15:13:09
475
原创 项目实战--网页五子棋(用户模块)(1)
接下来我将使用Java语言,和Spring框架,实现一个简单的网页五子棋。主要功能包括用户登录注册,人机对战,在线匹配对局,房间邀请对局,积分排行版等。这篇文件讲解用户模块的后端代码。
2025-01-11 17:36:12
624
原创 WebSocket介绍与使用
在我们平时写的web项目中,大多是使用http协议,但是http协议是典型的一问一答的模式,只能由客户端向服务器发送请求,再由服务器返回响应,但实际开发中,很多场景都需要服务器主动发送消息给服务端,这时就需要使用WebSocket协议。WebSocket是基于TCP协议实现的应用层协议,它通过 HTTP 协议进行握手。客户端首先发送一个 HTTP 请求,请求中包含一些特殊的头部信息,表明这是一个 WebSocket 连接请求。
2025-01-10 16:22:49
499
原创 面试题.05
Java 的并发问题涉及多个线程同时访问和修改共享资源,可能导致数据不一致或程序行为异常。竞态条件:多个线程同时访问和修改共享变量,导致不一致的结果。可以通过加锁解决,但是加锁又会引入新的问题。死锁:两个或更多线程互相等待对方释放资源,导致程序停滞。需要在编码层面解决。可见性问题:Java内存模型给线程引入了工作内存,一个线程更新了某个共享变量的值时,其他线程可能无法立即看到这个更新,导致程序出现不可预测的行为,可以通过volitile关键字,或者通过synchronized同步锁的方式解决。
2024-09-11 10:41:36
1042
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
644
原创 零基础学习Redis(10) -- zset类型命令使用
zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。
2024-09-09 14:51:39
2411
原创 面试题.04
jmm是一种抽象的概念,用于定义多线程程序如何与内存进行交互主内存:所有变量都存储在主内存中,主内存是共享的。工作内存:每个线程都有自己的工作内存,工作内存中保存了主内存中变量的副本。线程对变量的所有操作(读取、写入)都在工作内存中进行,最后再将结果同步回主内存。工作内存指的是CPU的寄存器和缓存,比起内存来说,访问速度是快得多的,引入工作内存可以减少内存访问延迟,提高程序的执行效率。但同时也引入了内存可见性问题。
2024-09-07 11:07:04
516
1
原创 深入理解MySQL慢查询优化
逐行读取,收集到足够的数据直接返回避免了全量计算在查询时利用有索引的序性快速定位到所需数据的区间,最大限度发挥增量查询的优势。
2024-09-04 14:04:39
1259
原创 深入理解MySQL慢查询优化(3) -- 案例实操
经过前面内容的理解,我们以及了解了MySQL的优化策略,以及SQL语句的执行流程,接下来我们通过一个问题来学习,如何优化SQL。
2024-09-02 16:51:00
1174
原创 深入理解MySQL慢查询优化(1) -- 优化策略
逐行读取,收集到足够的数据直接返回避免了全量计算在查询时利用有索引的序性快速定位到所需数据的区间,最大限度发挥增量查询的优势。
2024-09-02 16:37:19
647
原创 零基础学习Redis(9) -- set类型命令使用
set,即集合和list类似,集合中的每个元素都是string类型,但是集合中的元素是无序且不能重复的。
2024-08-30 15:06:18
1425
原创 MySQL索引详解
索引可以理解为把数据按照某种数据结构组织起来,从而提高查询效率,例如把数据构建为二叉搜索树,可以把查询时间复杂度降为O(log2n)。MySQL中的索引就可以很好的解决这两个问题。
2024-08-29 11:11:39
1310
原创 MySQL数据库MVCC机制底层原理详解
由于min_id是所有未提交事务中最小的id,所以事务id小于min_id的一定是已经提交的事务是可见的,同时大于max_id的事务,是生成快照时还没有创建的事务,是不可见的,在min_id和max_id之间的事务要分两种情况,在未提交数组中则说明是不可见的,不在则说明事务已经提交是可见的,当执行查询语句,就会沿着版本链从最新的数据开始查,直到查到可见的数据。接下来执行第5行,同样是一个写操作也会生成事务id,同时上面我们说过,对于被修改的数据行还会生成一个数据版本,于是这个新生成的。
2024-08-28 12:54:12
1302
原创 零基础学习Redis(7) -- hash类型命令使用
Redis本身就是通过哈希表的方式组织数据,同时redis中的value也可以是另一个哈希表。
2024-08-27 14:35:18
743
原创 零基础学习Redis(6) -- string类型命令使用
redis中,不同的数据结构有不同的操作命令。redis中的string是按照二进制存储的,不会对数据做任何编码转换。
2024-08-25 15:51:10
808
原创 零基础学习Redis(4) -- 常用数据结构介绍
我们之前提到过,redis中key只能是字符串类型,而value有多种类型。redis中的数据结构有自己独特的实现方式能根据特定的场景进行优化。
2024-08-19 14:34:20
445
原创 零基础学习Redis(3) -- Redis常用命令
Redis是一个 客户端-服务器 结构的程序,Redis客户端和服务器可以在同一台主机上,也可以在不同主机上,客户端和服务器之间通过网络进行通信。服务器端负责存储和管理数据。客户端则可以通过命名对服务端的数据进行操作。Redis客户端有多种,1.自带的命令行客户端(redis-cli),2.带图形界面的客户端(不推荐使用),3. 基于Redis的api自行开发的客户端(类似于mysql的jdbc,工作中最常用的)
2024-08-18 15:52:43
1263
原创 零基础学习Redis(2) -- Redis安装与配置
Redis官方是并不支持Windows系统的,并且现在绝大部分公司都是使用的Linux,所以我们在Linux上进行安装,这里我使用的是Ubuntu。
2024-08-14 15:55:14
478
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人