- 博客(147)
- 收藏
- 关注
原创 零基础学Docker(7)--Docker网络
在 Docker 中,自定义网络是一种更灵活、更安全的容器间通信方式,相比早期的 --link 机制,它支持动态 DNS 解析、网络隔离和更灵活的配置,是现代 Docker 网络的最佳实践。为什么需要自定义网络默认的 bridge 网络(Docker 安装时自动创建)功能有限,不支持容器名直接通信(需依赖 --link)。自定义网络可实现容器间通过名称 / 别名通信(内置 DNS 服务),无需依赖 IP 或 --link。可隔离不同业务的容器(如数据库网络、应用网络分开),提高安全性。
2025-10-08 16:23:08
872
原创 零基础学Docker(6)--DockerFile
Dockerfile 是构建 Docker 镜像的核心文本文件,它通过一系列预定义的指令(Instruction),以代码化、可版本控制的方式描述镜像的构建流程。简单来说,Dockerfile 就是镜像的 “源代码”,确保了镜像构建过程的一致性、可重复性和可追溯性,是 Docker 生态中实现 “一次构建,到处运行” 的关键基础。以上是一个用于构建支持 systemd 的 CentOS 基础镜像的 Dockerfile。
2025-10-05 16:07:50
847
原创 零基础学Docker(5)--容器数据卷
在 Docker 中,容器数据卷(Volume)是一种用于持久化存储容器数据的机制,它可以将容器内部的特定目录或文件与宿主机的文件系统建立关联,实现数据的持久化和共享。
2025-09-27 17:21:57
448
原创 零基础学Docker(3)--图形化管理工具Portainer
Portainer 是一个Docker图形化管理工具,可以提供一个面板供我们操作。设置完成后会进入如下界面,我们选择Local代表管理本地Docker环境。进入之后可以看到我们的docker。安装portainer。
2025-09-25 15:37:29
294
原创 Tomcat的解析与使用
Tomcat 是一个开源的 Java Web 服务器和 Servlet 容器,由 Apache 软件基金会开发和维护。它主要用于运行 Java 编写的 Web 应用程序,是 Java Enterprise Edition (Java EE) 规范中 Servlet 和 JSP(JavaServer Pages)技术的主流实现之一。它的特点是轻量级、开源免费、易于部署和配置,广泛用于开发和生产环境,尤其适合中小型 Java Web 应用。
2025-09-24 17:32:43
1035
原创 零基础学Docker(2)--基本命令
运行上面代码表示运行的镜像:可以看到,首先提示了没有在本地找到 "hell-world:latest"这个镜像,后面又提示尝试从远程仓库拉取这个镜像,拉取成功等等。
2025-09-20 16:43:40
649
原创 零基础学Docker(1)--Docker介绍
当我们发布一个项目需要把项目打包后在服务器上运行,这时需要在服务器上安装我们项目需要的环境,例如MySQL,Redis,Kafka等等,如果后续这个项目要扩展,那么又要在新的服务器上配置环境,如果新的服务器和旧的服务器系统不一样,那么情况就更糟了。即可以理解为,Docker是把我们的项目和环境打包了,这里称为一个Docker容器,多个Docker容器是共用系统内核的,和虚拟机技术的通过软件模拟完整的计算机硬件环境(CPU、内存、磁盘、网络卡等)不同,所以十分轻便。,于是Docker诞生了。
2025-09-15 17:57:57
400
原创 分布式锁介绍与实现
那么这里我们就可以使用商品id作为key,当需要操作某个商品时把商品id作为key存入redis,存入成功的则允许进行下一步操作,注意,这里一定要设置超时时间,如果某个服务器存入key成功后恰巧这个服务器挂了,那么这个key就无法被释放了,所以一定要设置过期时间。但是随着用户量日益增多,我们的系统出现了瓶颈,这时就可以使用负载均衡技术部署多个服务器,由于我们使用的同步锁只对当前服务器生效,多个服务之间的并发依然是不安全的,所以又会导致超卖问题。可以看到防止了超卖问题,
2025-09-13 15:42:12
281
原创 Redis缓存击穿、雪崩、穿透
缓存穿透是指,请求访问了数据库中不存在的数据,数据不存在也就代表缓存中不可能有,就会直接访问数据库,这种情况可能是服务器受到了攻击。,把不存在数据的key记录下来,每次请求时先判断布隆过滤器中有无该key,如果没有则继续在redis或数据库中查询,查询到。上面代码中,如果key失效了,那么大量的并发请求就会直接访问数据库,就像是redis被击穿了,所有形象的称为缓存击穿。当缓存中多个key集中失效时,大量请求直接访问数据库,造成数据库压力暴增,甚至宕机。
2025-09-08 16:33:02
397
原创 Java中Stream流的使用
在 Java 中,Stream 流是 Java 8 引入的一个强大特性,它允许你以声明式的方式处理集合数据。Stream 流提供了一种高效且易于使用的方式来对数据进行过滤、映射、排序、聚合等操作,使代码更加简洁和可读。
2025-07-03 22:44:32
1465
原创 零基础学习RabbitMQ(5)--工作模式(1)
RabbitMQ提供七种消息传递模式:1)简单模式(点对点);2)工作队列(多消费者);3)发布/订阅(广播);4)路由模式(按规则分发);5)通配符模式(灵活匹配);6)RPC通信(异步调用);7)发布确认(可靠投递)。每种模式针对不同场景设计,如集群处理、广播通知、日志分级等,通过交换机和路由机制实现消息的灵活分发。
2025-06-29 16:47:54
1183
原创 零基础学习RabbitMQ(4)--RabbitMQ快速入门
注意:调用basicConsume()方法后,消费者会不断从队列中获取数据,这个操作是由另一个线程执行的,和主线程是异步的,直到连接被释放,这里从调用basicConsume到连接关闭中间消费的数据数量和打印出来的日志不一定是吻合的,有的消息的日志可能还没有打印出来,主线程就关闭了。可以看到队列被创建成功了,并且有一条消息,由于我们在程序末尾释放了连接所有这里是没有Connections和Channels的。这里我们直接使用内置的交换击就无需声明。这里的""代表使用的这个默认的交换机。
2025-06-29 15:06:36
462
原创 零基础学习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
493
原创 零基础学习RabbitMQ(1)--概述
MQ (消息队列)从字面上看,本质上是个队列,先进先出,只不过存储的是消息。MQ多用于分布式系统之间进行通信。直接调用对方的服务,数据从一端发出后立即就可以到达另一端。数据从一端发出后,先进入一个容器进行临时存储,当到达某种条件后,再由这个容器发送给另一端。这里的容器就可以使用MQ。
2025-06-23 15:46:31
395
原创 零基础学习Redis(14) -- Spring中使用Redis
在spring中提供的方法只要大家对于redis命令足够熟悉相信是能够正常的猜测出每个方法的具体作用,不够熟悉的也可以在spring的官方网站上进行查询,关于redis基础使用的学习到这里就基本完结了。
2025-06-22 17:49:37
353
原创 零基础学习Redis(13) -- Java使用Redis命令
上期我们学习了如何使用Java连接到redis,这期我们来学习如何在java中使用redis中的一些命令。
2025-06-22 15:50:40
546
原创 零基础学习Redis(12) -- Java连接redis服务器
在我们之前的内容中,我们会发现通过命令行操作redis是十分不科学的,所以redis官方提供了redis的应用层协议RESP,更具这个协议可以实现一个和redis服务器通信的客户端程序,来简化和完善redis的使用。现阶段有很多封装了RESP协议的库可以使用,接下来我们使用jedis来演示。
2025-06-21 13:48:57
371
原创 Spring 如何处理循环依赖
一级缓存(singletonObjects):这是一个 Map,用于存放已经完全初始化好的单例 Bean,这些 Bean 可以直接使用。二级缓存(singletonFactories):同样是一个 Map,用于存放提前暴露的单例 Bean 工厂,这里的 Bean 处于创建过程中,还未完成初始化。三级缓存(earlySingletonObjects):也是一个 Map,用于存放提前暴露的单例 Bean,这些 Bean 只是实例化了,但未完成属性注入和初始化操作。
2025-03-25 15:06:55
333
原创 项目实战--网页五子棋(对战功能)(9)
上期我们完成了websocket建立连接后的数据初始化,今天我们完成落子交互的具体代码:这里我们先复习一下,之前约定好的落子请求与响应包含的字段: 我们在script.js文件中找到落子的相关方法,增加发送请求的代码: 2. 处理请求发送响应实现putChess:注意:我们并没有把Room注册为Spring组件,进行依赖注入时,需要在构造方法中手动注入: 实现checkWinner方法检测是否获胜: 3. 处理落子响应在之前初始化游戏的代码中,我们在游戏初始化完
2025-03-08 20:04:55
301
原创 项目实战--网页五子棋(游戏房间)(6)
上期我们基本完成了匹配功能,这期我们来实现游戏房间相关的代码由于同时会存在多个游戏房间,我们实现游戏房间时可以再实现一个房间管理器,用于管理游戏房间,我们约定房间管理器通过哈希表来管理游戏房间。
2025-02-25 15:23:52
273
原创 项目实战--网页五子棋(匹配模块)(5)
我们新建一个Matcher类用来实现匹配逻辑@Component//每个匹配队列代表不同的段位,这里约定每一千分为一个段位@Autowired@Autowired//暂定三个段位i < 3;i++) {//对操作的队列加锁保证线程安全System.out.println("用户 " + user.getUsername() + " 加入了 " + index + "号 队列");
2025-02-23 16:45:54
540
原创 项目实战--网页五子棋(登录注册)(2)
上期我们实现了用户模块的后端代码,这期我们来实现登录界面的前端代码,这里主要讲解前后端交互的代码。这里我事先已经写好了一个简单的登录界面.
2025-01-13 15:13:09
485
原创 项目实战--网页五子棋(用户模块)(1)
接下来我将使用Java语言,和Spring框架,实现一个简单的网页五子棋。主要功能包括用户登录注册,人机对战,在线匹配对局,房间邀请对局,积分排行版等。这篇文件讲解用户模块的后端代码。
2025-01-11 17:36:12
632
原创 WebSocket介绍与使用
在我们平时写的web项目中,大多是使用http协议,但是http协议是典型的一问一答的模式,只能由客户端向服务器发送请求,再由服务器返回响应,但实际开发中,很多场景都需要服务器主动发送消息给服务端,这时就需要使用WebSocket协议。WebSocket是基于TCP协议实现的应用层协议,它通过 HTTP 协议进行握手。客户端首先发送一个 HTTP 请求,请求中包含一些特殊的头部信息,表明这是一个 WebSocket 连接请求。
2025-01-10 16:22:49
518
原创 面试题.05
Java 的并发问题涉及多个线程同时访问和修改共享资源,可能导致数据不一致或程序行为异常。竞态条件:多个线程同时访问和修改共享变量,导致不一致的结果。可以通过加锁解决,但是加锁又会引入新的问题。死锁:两个或更多线程互相等待对方释放资源,导致程序停滞。需要在编码层面解决。可见性问题:Java内存模型给线程引入了工作内存,一个线程更新了某个共享变量的值时,其他线程可能无法立即看到这个更新,导致程序出现不可预测的行为,可以通过volitile关键字,或者通过synchronized同步锁的方式解决。
2024-09-11 10:41:36
1052
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
664
原创 零基础学习Redis(10) -- zset类型命令使用
zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。
2024-09-09 14:51:39
2543
原创 面试题.04
jmm是一种抽象的概念,用于定义多线程程序如何与内存进行交互主内存:所有变量都存储在主内存中,主内存是共享的。工作内存:每个线程都有自己的工作内存,工作内存中保存了主内存中变量的副本。线程对变量的所有操作(读取、写入)都在工作内存中进行,最后再将结果同步回主内存。工作内存指的是CPU的寄存器和缓存,比起内存来说,访问速度是快得多的,引入工作内存可以减少内存访问延迟,提高程序的执行效率。但同时也引入了内存可见性问题。
2024-09-07 11:07:04
522
1
原创 深入理解MySQL慢查询优化
逐行读取,收集到足够的数据直接返回避免了全量计算在查询时利用有索引的序性快速定位到所需数据的区间,最大限度发挥增量查询的优势。
2024-09-04 14:04:39
1292
原创 深入理解MySQL慢查询优化(3) -- 案例实操
经过前面内容的理解,我们以及了解了MySQL的优化策略,以及SQL语句的执行流程,接下来我们通过一个问题来学习,如何优化SQL。
2024-09-02 16:51:00
1225
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅