JAVA三阶段思维导图
2026-09-07 16:46:11 0 举报JAVA三阶段思维导图
java
模板推荐
作者其他创作
大纲/内容
Linux
服务器分类:硬件服务器、软件服务器、云服务器
云服务器
操作系统
什么是操作系统
1、操作系统(OS),是管理计算机硬件和软件的资源的系统。<br>2、操作系统是人与计算机交互的接口<br> 3、操作系统核心功能包括:管理CPU、内存(RAM)、存储设备 、输入输出设备、以及执行应用程序。
操作系统的分类
1、桌面操作系统:主要针对个人用户。如 Windows、Linux 发行版(Ubuntu 等,red hat,龙蜥)、mac
2、服务器操作系统
3、移动操作系统
4、嵌入式操作系统
5、分布式操作系统
Linux介绍
POSIX<br>- 一切皆文件<br>- 命令单一简单,复杂的功能由多个单一命令组成
Linux 内核(1w多行经典代码)负责系统的核心功能,如硬件管理、文件系统操作、网络通信和进程调度。
- 基于 unix:Linux 继承了 unix 操作系统的设计理念和架构特点。unix 是 1970 年代由 AT&T 的贝尔实验室开发,是一个多用户、多任务的操作系统,一般具有开源、一切皆文件、遵循 POSIX 标准等特点。但注意的是 Linux 并非由 unix 的代码而来,Linux 本身的设计是独立于 unix 的,只是设计的理念和架构来自于 unix。unix 项目团队成员丹尼斯・里奇为了开发 unix 而设计了 c 语言。linux 也大部分用 c 语言编写的。<br>- 开源:源代码公开全社会可用。一般会带有开源许可证(比如 GNU 通用公共许可证(GPL))<br>- 遵循 POSIX 标准:全称可移植操作系统接口。一套定义操作系统应该为应用程序提供哪些接口的规范<br>- 一切皆文件:linux 把所有内容在系统都表示为一个文件,包括设备(比如打印机、usb 设备等),这个跟 window 有很大的不同。<br><br>注意:一般我们平时讨论的 linux 是指 linux 系统发行版,而发行版的最重要的就是 linux 内核。
目录结构
├── bin/ # 基本命令二进制文件 ,计算机可以去执行的指令<br>├── boot/ # 引导加载程序文件<br>├── dev/ # 设备文件<br>├── etc/ # 系统配置文件<br>├── home/ # 用户主目录<br>├── lib/ # 系统库文件 系统启动、基础命令和内核模块所<br>├── media/ # 可移动媒体挂载点<br>├── mnt/ # 临时挂载文件系统<br>├── opt/ # 可选应用软件包<br>├── proc/ # 进程和内核信息<br>├── root/ # root用户主目录<br>├── sbin/ # 系统二进制文件<br>├── tmp/ # 临时文件<br>├── usr/ # 用户程序和数据<br>└── var/ # 可变数据文件
重要目录
/etc: 存放系统配置文件 <br>/var: 存放经常变化的文件,如日志<br>/home: 普通用户的主目录<br>/root: 管理员root的主目录
linux常用命令
(cd)进入目录
(pwd)查看当前目录的完整路径
(ls、ll)查看当前目录下有哪些文件
(touch)创建文件
(rm)删除文件
(mkdir)创建目录
(mkdir -p)创建子目录
(rmdir)删除目录
(rm -rf)递归删除
(cp)目录复制
(mv)目录/文件移动重命名
vi/vim编辑器
如果没有vim这个命令就需要安装一下
sudo yum install vim
vim的工作模式
命令模式(Command Mode)
无法直接进行编辑内容,只能控制屏幕光标的移动,进行文本行的删除、复制等文字编辑工作(不使用【Del】键和【Backspace】键),以及进入插入模式(i),或者回到底行模式(:)。
插入模式(Insert Mode)
i进入插入模式
只有在插入模式下,才可以输入文字(编辑)。并且按【Esc】键可回到命令行模式。很多 vim 编辑器使用者希望一打开 vim 就可以输入内容,但这是不能成功的,因为刚打开 vim 编辑器时处于命令模式。
底行模式(Last Line Mode)
保存文件或退出 vim,同时也可以设置编辑环境和一些编译工作,如列出号、寻找字符串等。
vim的指令
命令模式
按 [ESC] 键返回命令模式
基本命令
i:在当前光标位置插入文本。<br>x:删除当前光标所在位置的字符。<br>:w:保存文件。<br>:q:退出Vim编辑器。<br>:q!:强制退出Vim编辑器,不保存文件。<br>:wq:保存文件并退出Vim编辑器。
打包与解压
tar
打包和压缩
tar -cvf archive.tar dir/ # 打包目录 verbose <br>tar -czvf archive.tar.gz dir/ # 打包并用gzip压缩 <br>tar -cjvf archive.tar.bz2 dir/ # 打包并用bzip2压缩
解包和解压
tar -xvf archive.tar # 解包 <br>tar -xzvf archive.tar.gz # 解压gzip包 <br>tar -xjvf archive.tar.bz2 # 解压bzip2包<br>tar -xvf ./myfile.tar -C ./myfile #如何过解压到指定的目录,增加一个 可选命令 -C
查看包内容
tar -tf archive.tar # 查看包内文件列表
zip
压缩
zip archive.zip file1 file2 # 压缩文件 <br>zip -r archive.zip dir/ # 递归压缩目录
解压
unzip archive.zip # 解压到当前目录 <br>unzip archive.zip -d /path # 解压到指定目录<br>unzip -l archive.zip # 查看压缩包内容
gzip/gunzip
压缩
gzip filename # 压缩文件(生成.gz文件)<br>gzip -9 filename # 最大压缩率
解压
gunzip filename.gz # 解压.gz文件<br>gzip -d filename.gz
权限命令
用户相关
查看有哪些用户
cat /etc/passwd
增加用户
sudo useradd -m username 加用户 -m给用户创建目录
sudo passwd username 给用户设置密码
修改密码
sudo passwd username
删除用户
sudo userdel -r username //r递归删除这个用户相关的目录
查看用户信息
id username
eg.
id root
权限相关
查看文件看看权限
ls -la 看列表权限
ls -ld /data 看某一个目录(data目录)
drwxr-xr-x
1、d代表的是否是目录<br>2、每一组3位 ,第一组表示所有者的权限;第二组是组权限;第三组是其他<br>3、rwx: r代表的read读 ,w代表写,x代表是执行
分配权限用chmod
chmod 777 filename
ls -l filename # 查看文件详细权限<br>所有者:rwx = 4+2+1 = 7 <br>所属组:r-x = 4+0+1 = 5 <br>其他用户:r-x = 4+0+1 = 5 <br><br># 修改文件权限<br>chmod 777 filename # 数字方式设置权限 <br>chmod u+x filename # 给所有者添加执行权限 u代表所有者<br>chmod g-w filename # 删除所属组的写权限 g代表用户组<br>chmod o=r filename # 设置其他用户只读权限 o其他<br><br># 修改文件所有者<br>chown user:group filename # 修改所有者和所属组<br>chown user filename # 只修改所有者<br>chgrp group filename # 只修改所属组
系统相关
top
查看系统cpu和内存的情况
free -h
查看内存的情况
df -h
查看磁盘的占用情况
du -sh *
查看当前目录占用情况
systemctl start/stop xxx
systemctl enable xx
系统服务后台启动
ps -ef
系统进程查看(重要)
ps -ef | grep java or mysql
kill -9 PID 进程号
杀死进程
netstat -tulnp
ss -tulnp | grep :8080
端口查看
ifconfig
查看ip
防火墙命令
firewalld
# 服务管理
systemctl status firewalld # 查看防火墙状态
systemctl start firewalld # 启动防火墙
systemctl stop firewalld # 停止防火墙
systemctl enable firewalld # 开机自启
systemctl disable firewalld # 禁用开机自启
# 基本操作
firewall-cmd --state # 查看防火墙状态
firewall-cmd --reload # 重新加载配置
firewall-cmd --list-all # 查看所有规则
# 端口管理
firewall-cmd --add-port=80/tcp --permanent # 永久开放80端口
firewall-cmd --remove-port=80/tcp --permanent # 永久关闭80端口
firewall-cmd --add-service=http --permanent # 永久开放http服务
firewall-cmd --list-ports # 查看开放端口
# 区域管理
firewall-cmd --get-active-zones # 查看活动区域
firewall-cmd --zone=public --add-port=8080/tcp --permanent # 指定区域开放端口
iptables
# 查看规则
iptables -L # 查看所有规则
iptables -L -n # 以数字形式显示
# 管理规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许SSH连接
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许HTTP连接
iptables -A INPUT -j DROP # 拒绝所有其他连接
常用服务端口
22 # SSH服务
80 # HTTP服务
443 # HTTPS服务
21 # FTP服务
25 # SMTP服务
53 # DNS服务
3306 # MySQL数据库
5432 # PostgreSQL数据库
6379 # Redis服务
Docker
Docker介绍
1、Docker 就是一个大轮船
2、上面的集装箱,代表的就是容器,容器里面装的就是你的应用(jar、redis、mysql、nginx...)
3、应用可以做成一个一个的镜像,大家可以共享
Docker 的组成
- Docker 主机:安装了Docker程序的主机叫宿主机,会在后台运行一个叫Daemon的程序,准备服务(docker程序)
- Docker 客户端:一系列的操作指令 docker pull 、docker ps ...(可以操作docker Daemon程序)
- Docker的应用市场:提供各种镜像images, eg.jdk、nginx、mysql ...(docker pull 去下载)。类似我们的app应用商店。
docker安装
#添加软件源信息<br>yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo<br>#更新并安装Docker-CE<br>yum makecache fast<br>yum -y install docker-ce<br>#等安装完成<br>#开启Docker服务<br>service docker start<br>#设置为开机启动 #关闭开机启动 systemctl disable docker<br>systemctl enable docker<br>#测试是否安装成功<br>docker -v
docker命令
拉取/下载镜像
docker pull 镜像名称
docker pull nginx:1.28-alpine //如果无法下载就去掉版本号
docker pull nginx
查看本地镜像
docker images
- REPOSITORY:镜像所在的仓库名称
- TAG:镜像标签
- IMAGE ID:镜像ID
- CREATED:镜像的创建日期(不是获取该镜像的日期)
- SIZE:镜像大小
删除镜像
docker rmi 镜像id/镜像名:版本
- docker rmi id:删除指定镜像
- docker rmi `docker images -q`:删除所有镜像
搜索远程镜像
docker search 镜像名
- NAME:仓库名称
- DESCRIPTION:镜像描述
- STARS:用户评价,反应一个镜像的受欢迎程度
- OFFICIAL:是否官方
- AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的63.4拉取镜像
docker容器操作
创建容器
docker run -i -t/-d --name=redis
[-p=6379:6379] [-v=/xx:/yy] [--restart=always] [-m 2048M] redis:7.0
创建容器常用的参数说明:
- 创建容器命令:docker run<br>- -i:表示运行容器<br>- -t:表示容器启动后会进入容器命令行(交互式)。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。注意:在交互式容器中如果执行 “exit”会结束容器,如果使用“ctrl + p + q”就不会退出容器<br>- -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器),后台容器退出依然是运行的<br>- --name :为创建的容器命名。<br>- -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射<br> - 例如:docker run -id --name=redis3 -p=6379:6379 redis:7.0<br>-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,让宿主机上的目录与容器中的目录做映射,同步增删改操作<br> - 例如:docker run -id --name=nginx -p=80:80 -v=/data/nginx:/usr/share/nginx/html nginx<br> - 解释: 运行 后台 容器名 端口映射 目录映射 镜像(默认最新版)<br>- --restart : 指定容器异常退出时的重启模式, always 总是重启, no 不重启, on-failure - 只有在非0状态退出时才从新启动容器<br>- -m :指定容器的总分配内存,比如:-m 2048m ,容器最大可用2G内存
查看容器
docker ps -a
查看所有容器:不加-a表示查看运行中的容器
docker ps -f status=exited
查看退出的容器
docker ps – l
查看最后一次运行的容器
进入容器
有时候我们需要进入到容器中去查看容器的情况
docker exec -i -t 容器名字 /bin/bash
注意:进入容器需要 -t ,容器名字直接 ,需要 /bin/bash
退出容器
暴力退出 : exit
注意:exit会结束交互式容器,而不会结束守护式容器 友好退出 : ctrl + p + q
容器的关闭
docker stop 容器名/容器id 或 docker kill 容器名/容器id
kill 相比 stop 可以更加快速的关闭容器
容器的启动
docker start 容器名/容器id
停止中的容器可以通过start重新启动
容器的删除
docker rm 容器名/容器id 容器名/容器id ...
注意:容器在运行是不能删除的,需要先停止
删除所有容器: docker ps -a -q 指的是获取所有容器的ID , 然后进行批量删除
查看容器
docker inspect 容器名
文件拷贝
docker cp
拷贝进去
docker cp 需要拷贝的文件或目录 容器名称:容器目录
拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或目录
查看容器日志
docker logs 容器名
docker安装软件
创建Mysql容器
docker run -i -d --name=mysql -p=3306:3306 -e MYSQL_ROOT_PASSWORD=yuxiaoyuan123456 mysql:8.0
- -e MYSQL_ROOT_PASSWORD : 是指定root用户的密码
- 注意:如果没有mysql:5.7,docker会自动去下载或拉取镜像
创建Nginx容器
docker run -i -d --name=nginx -p=80:80 -v=/usr/local/nginx/html:/usr/share/nginx/html nginx
-v=/usr/local/nginx/html:/usr/share/nginx/html : 目录映射,我们只需往 /usr/local/nginx/html 放html页面就会自动同步到容器中
创建redis容器
docker run -di --name=redis -p=6379:6379 --restart=always redis --requirepass "123456"
--requirepass "123456" : 指定密码
Dockder构建镜像
容器由镜像启动而来,我们要安装某个软件就需要去下载相应的镜像,我们也可以自己去构建自己的镜像,构建镜像的方式包括如下三种
- 基于已有容器构建镜像
- dockerfile构建-脚本构建
- maven插件构建-也是转换为dockerfile - idea中的项目就可以直接用这种构建镜像
基于容器构建
docker commit 容器名 新的镜像名:版本
例:(先通过docker ps 查看正在运行的容器):docker comming nginx mynginx:1.0
基于dockerfile构建
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。
<br>
构建JDK17的镜像
项目打包镜像
开启docker远程端口
下载依赖镜像
项目安装docker插件
构建镜像
Docker容器通信
使用端口映射
使用ip通信
使用link通信
创建bridge网络
镜像推送
推送到dockerhub官方仓库
推送到阿里云镜像仓库
# 把旧镜像的名字,改成仓库要求的新版名字
docker tag zcj-nginx:v1.0 crpi-skr5lqg4auixcasp.cn-chengdu.personal.cr.aliyuncs.com/zcj_my_test/zcj_nginx:v1.0
# 登录到docker hub docker logout(推送完成镜像后退出)
docker login --username=z1289022116 crpi-skr5lqg4auixcasp.cn-chengdu.personal.cr.aliyuncs.com
# 推送
docker push crpi-skr5lqg4auixcasp.cn-chengdu.personal.cr.aliyuncs.com/zcj_my_test/zcj_nginx:v1.0
# 别的机器下载
docker pull crpi-skr5lqg4auixcasp.cn-chengdu.personal.cr.aliyuncs.com/zcj_my_test/zcj_nginx:v1.0
git
Git简介
Git是一个免费开源分布式版本控制工具,是由Linux的作者Linus开发的第二个伟大作品。2005年由于BitKeeper软件公司对Linux社区停止了免费使用权。Linus迫不得己自己开发了一个分布式版本控制工具,从而Git诞生了
Git命令操作
- Clone:克隆,从共享仓库/中央仓库将代码拷贝一份下来
- add: 添加 要提交哪些文件
- Commit:提交,提交的本地仓库
- PUSH:推送,将本地仓库代码推送到远程中央仓库
- PULL:拉取,从远程仓库下载最新的代码
- Git是先提交到本地仓库,然后再推送
shell
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
shell入门
创建一个文件 hello.sh
#!/bin/bash
# 这是注释:声明用bash解释器 必须放在第一行,告诉系统用什么解释器
echo "hello shell"
运行方式有两种
bash hello.sh
#给hello.sh添加权限 添加可执行权限
chmod +x hello.sh
./hello.sh
变量、输出
条件判断
循环for/while
函数/方法
shell操作docker
git+docker+shell自动化部署
redis
Redis基础
Redis是什么
Redis是一个**开源的、基于内存的高性能键值对(Key-Value)存储系统**。它使用ANSI C语言编写,遵循BSD协议,支持网络通信,并提供多种编程语言的API。
极高性能
丰富的数据结构
持久化能力
高可用与分布式
redis数据结构
String(字符串):存储字符串、整数或浮点数,二进制安全,最大支持512MB。常用于缓存对象、计数器(点赞数)、分布式锁。
Hash(哈希):存储字段与值的映射,适合存储对象属性(如用户信息),可单独操作某个字段,节省内存。
List(列表):按插入顺序排序的字符串列表,基于链表实现,支持两端推入/弹出。常用于消息队列、栈、最新动态列表。
Set(集合):存储不重复且无序的字符串,支持交集、并集、差集运算。常用于标签系统、抽奖去重、共同好友。
Zset(有序集合):存储不重复的字符串并关联一个浮点数分数用于排序,按分数自动排序。常用于排行榜、带权重的任务队列、延迟队列。
Bitmap(位图):对字符串进行位级操作的数组,极省内存,每位代表一个状态。常用于签到统计、在线用户状态、布隆过滤器。
Stream(流):追加日志式的消息队列数据结构,支持消费者组、消息持久化及ACK确认。常用于事件溯源、消息中间件(类似Kafka)。
GEO(地理空间):存储经纬度坐标,支持计算两地距离、查找附近半径内的元素。底层基于Zset实现。常用于附近的人/门店。
Graph(图):存储节点和边的属性图,支持Cypher查询语言,用于复杂的关系遍历。适用于社交关系链、知识图谱(需RedisGraph模块)。
Vector(向量):存储浮点数数组(嵌入向量),支持向量相似度搜索(KNN)。适用于AI语义检索、推荐系统、以图搜图(需RediSearch向量模块)。
Redis常用命令
keys
keys * 查询所有的key
keys *x*
模糊查询
慎用!阻塞!
DEL删除
del num
1代表删除成功,0代表失败或没有
EXISTS是否存在
exists num
0表示没有,1表示有
EXPIRE设置过期时间
EXPIRE num 30
TTL查看过期时间
TTL num
事务
MULTi开启事务<br>EXEC执行事务<br>DISCARD 取消
发布 / 订阅(Pub/Sub)
实现简单的mq功能
备份命令
# 保存 RDB 快照(如果配置了)
127.0.0.1:6379> SAVE
# 或者后台保存
127.0.0.1:6379> BGSAVE
切换数据库
SELECT 1
springboot集成redis
依赖
<!--spring boot web 起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 2. 连接池支持 (推荐) -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
配置
server:
port: 8888
spring:
application:
name: springboot-redis
data:
redis:
host: 182.92.108.193 #redis的地址
port: 16379 #redis的端口
password: 7e40796#Tb9bbf861 #密码
database: 13
lettuce:
pool:
max-active: 8 #最大连接
max-idle: 8 #最大空闲连接
min-idle: 0 #最小空闲连接
max-wait: 100 #最大等待时间
- **Jedis:同步阻塞,非线程安全**:Jedis 采用同步阻塞的 I/O 模型。它的实例**不是线程安全**的,不能在多线程环境下直接共享。通常需要使用**连接池**来管理,每个线程从池中获取一个独立的 Jedis 实例进行操作。
- **Lettuce:异步非阻塞,线程安全**:Lettuce 基于 Netty 框架,采用异步非阻塞的 I/O 模型。它的实例是**线程安全**的,多个线程可以共享同一个连接,无需额外的同步措施。
redis进阶
redis持久化
RDB方式
整体流程:
1、主进程会开启一个子进程去进行数据备份,不会影响主进程的读写操作(因为是单独的一个进程)
2、子进程是以定时的方式,把内存中的数据,写入到磁盘(可配置)
3、也可以手动去调用bgsave(生产上用BGSAVE异步操作不会阻塞读写)或save(同步操作对读写有影响)去手动备份
4、整个过程不影响数据的使用,因为用户访问的数据都是在内存里面
RDB的优缺点
1、RDB备份是二进制文件,相对文件内容更加紧凑,文件大小更小;速度更快
2、因为是间隔一定时间进行全量备份,有可能导致数据的丢失
RBD持久化的两种方式:
1. fork一个子进程,按配置的周期执行保存
2. 手动触发,save、bgsave两种方式
AOF方式
每次写入命令都作为**日志**形式,**追加到一个日志文件中**,redis启动的时候,可以通过**AOF日志**,重新构建数据。(指定回放)
记录命令的方式有三种:推荐everysec(默认值)
appendfsync always #: 每次有新命令直接追加到AOF文件时就执行一次fsync,非常慢,但是非常安全。
appendfsync everysec #:每秒fsync一次,足够快,并且在故障时会有1秒的数据丢失
appendfsync no # 不执行fsync,数据交给系统处理。很快,但是不安全
AOF的优缺点
1、数据相对更加可靠,AOF记录了所有的SET指令,可以直接执行这些指令回复数据
2、文件大、恢复慢;记录了所有的set指令,一条一条执行
混合持久化 redis4.0提出
两种持久化机制都开启后。只要达到了设置的触发条件,两种持久化机制都会执行,但是在数据恢复的时候会使用AOF进行数据恢复。因为AOF中存放的数据会比RDB的数据多。
混合持久化必须在AOF开启之后才能开启 修改配置文件的:aof-use-rdb-preamble yes
开启之后的效果
当触发AOF的重写时会将内存中的数据以RDB的形式(二进制)存储到appendonly.aof中,如果还有新的命令进来以命令的形式进行存放在一起(上面的二进制形式下面新的命令是命令形式),等到重写完成后才会覆盖之前的appendonly.aof。当我们重启redis那么数据恢复就会提升,前面重写的数据就以二进制进行恢复后面的数据就以命令的方式恢复。
Redis淘汰策略
八大淘汰策略
针对设置了过期时间的key做处理:
1. volatile-ttl:在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除.
2. volatile-random:就像它的名称一样,在设置了过期时间的键值对中,进行随机删除。
3. volatile-lru:指的是在内存满了时,根据 LRU(Least Recently Used,最近最少使用)算法从已设置过期时间的 key 集合中筛选出最近最少使用的 key 进行淘汰。
4. volatile-lfu:指的是在内存满了时,根据 LFU(Least Frequently Used,最不经常使用)算法从已设置过期时间的 key 集合中筛选出最不经常使用的 key 进行淘汰。
针对所有的key做处理
1. allkeys-random:从所有键值对中随机选择并删除数据。
2. allkeys-Iru:使用LRU(Least Recently Used,最近最少使用)算法在所有数据中进行筛选删除。
3. allkeys-lfu:使用LFU(Least Frequently Used,最不经常使用)算法在所有数据中进行筛选删除。
不处理
noeviction:不会剔除任何数据,拒绝所有写入操作并返回客户端错误信息"(error) OOM command not allowed whenused memory",此时Redis只响应读操作。
redis面试题
redis的大key
大key代表是value大 ,不是key大
key过大的问题
- 读取缓慢,消耗网络IO
- 因为redis是单线程 会阻塞,导致redis性能急剧下降
- OOM,out of memory
解决办法
1、图片、文件放在redis(不要大文件在redis,放在oss或者Minio)
2、把key拆分一下
3、前预防 ;防御性编程和设计(可以考虑2,3年左右的扩展)
缓存击穿
某一个key在redis里过期了,这个Key比较热(会有大量的用户去查询这个key),导致大量请求直接连接到数据库
解决办法:
1、刷新key的过期时间(可以用定时任务com:woniu:good:*)
2、永不过期
缓存雪崩
大量的、多个key同时过期,虽然每一个key的访问量不大,但是多在请求的时候,多个key没有命中redis,导致都访问了数据库去查询
如何解决:
1、可以设置永不过期,但是也有可能导致内存过高(OOM)
2、监控提前刷新这些key
3、设置这些key的过期时间,**用随机或者其他逻辑**;不要在某一个时间里让这些key同时过期;这样就可以避免雪崩。
缓存穿透-恶意攻击
请求中的参数,比如id,数据库和redis里根本就没有。<br>少量无所谓,当大量无效ID,穿过redis的时候,直接打到了数据库上
如何解决:
根据实际情况,把恶意的key也放在redis里,避免打在数据库上。
处理流程:如果redis没有这一个key的数据,就直接set,下一次再访问同一个key的数据时,就直接从redis返回。
增加查询前的验证,比如在contoller层进行必要的校验
恶意的ip设置黑名单
布隆过滤器
在项目中使用布隆过滤器
redis的集群搭建
什么是redis集群
部署多个服务,组成的集合,成为集群;
对外的性能、并发、数据安全更加的可靠;
其中主库出现了故障,可以迅速升级从库,替换主库的功能
集群目的
读写分离和负载均衡
为什么要集群
数据安全
- **实时热备份**:从节点自动同步主节点数据,实现实时备份
- **数据安全**:主节点故障时,从节点保留完整数据副本
- **灾难恢复**:防止单点故障导致数据丢失
性能好
- **读操作扩展**:通过增加从节点**横向扩展**读性能
- **写读分离**:主节点专注写操作,从节点分担读压力
- **并发处理**:多个客户端可同时从不同从节点读取数据
redis主从流程(一般情况一主二从的搭建)
1、第一次启动的时候,从库会全量复制主库的数据
2、启动以后,会以追加的方式,增量同步数据
3、主库负责写 ,从库负责读(**读写分离**)
哨兵模式
基本概念
Redis Sentinel 是 Redis 的高可用性解决方案,它主要提供以下功能:
- **监控**:持续检查主从服务器是否正常运行()
- **通知**:当被监控的 Redis 实例出现问题时,向管理员发送通知
- **自动故障转移**:当主服务器故障时,自动将一个从服务器升级为主服务器
- **配置提供者**:为客户端提供服务发现,告知当前可用的主服务器地址
主观下线
**主观下线**是指**单个 Sentinel 实例**认为某个 Redis 实例已经不可用。
检测机制
- 每个 Sentinel 会定期向所有被监控的 Redis 实例发送 PING 命令
- 如果在配置的 `down-after-milliseconds` 时间内没有收到有效回复(PONG)
- 该 Sentinel 就会将这个实例标记为"主观下线"
如果有问题
- **局部判断**:只是一个 Sentinel 的独立判断
- **可能误判**:可能因为网络波动、Sentinel 自身问题导致误判
- **不会触发故障转移**:单纯的主观下线不会立即启动故障转移流程
客观下线
客观下线是指多个 Sentinel 实例达成共识,认为某个 Redis(master) 实例确实不可用。
检测机制
1. 当某个 Sentinel 将主服务器标记为主观下线后
2. 它会向其他 Sentinel 询问他们对这个主服务器的看法
3. 如果**足够数量**的 Sentinel 都报告主服务器主观下线
4. 那么这个主服务器就被标记为"客观下线"
好处
- **共识判断**:多个 Sentinel 达成一致的判断
- **准确性高**:减少了单点误判的可能性
- **触发故障转移**:客观下线是启动自动故障转移的前提条件
脑裂
解释
1、在分布式架构中,因为网络的问题master与所有的slave都失去连接
2、master(老)正常运行
3、slave节点被sentinel选举出一个新的master(新)
4、新、老master同时运行,分别读写自己的数据导致数据不一致
搭建sentinel
RocketMQ
消息模型与基础概念
消息生产者与消费者
消息生产者的职责与工作流程
消息消费者的消费模式与推拉模型
生产者组与消费者组的作用
消息过滤与标签(Tag)的使用
消息存储与队列模型
主题(Topic)与消息队列(Queue)的关系
消息的物理存储结构与文件组织
消息的索引机制与查询方式
队列负载均衡与消息分发策略
消息类型与特性支持
普通消息与顺序消息的区别与应用
延时消息与定时消息的实现原理
事务消息的流程与一致性保障
批量消息与广播消息的使用场景
消息确认与重试机制
消费确认(ACK)的语义与实现
消息重试策略与死信队列
消费进度管理与重置功能
消息幂等性处理方案
RocketMQ 架构组件与部署模式
核心组件及其协作流程
NameServer 的职责与路由管理机制
Broker 的存储与高可用设计
Producer 与 Consumer 的客户端交互逻辑
组件间的通信协议与心跳机制
集群部署与高可用架构
单主单从模式的配置与局限
多主多从模式的同步与异步复制
Dledger 模式与自动故障切换
多机房容灾与异地多活方案
存储机制与性能优化
CommitLog 与 ConsumeQueue 的写入流程
页缓存与零拷贝技术的应用
刷盘策略对性能与可靠性的影响
消息堆积与存储空间管理策略
运维监控与故障排查
常用管理命令与运维工具
关键监控指标与告警配置
消息积压排查与处理流程
Broker 宕机与网络分区应对方案
RocketMQ 高级功能与最佳实践
顺序消息的保证与实现
全局顺序消息的适用场景与限制
分区顺序消息的队列选择策略
顺序消费与并发消费的权衡
顺序消息故障时的处理方案
事务消息的可靠性与实现细节
事务消息的两阶段提交流程
本地事务与消息发送的一致性保证
事务回查机制与超时处理
事务消息的常见使用场景示例
消息过滤与路由的灵活配置
基于 Tag 的简单过滤实现
基于 SQL92 的复杂过滤语法
过滤逻辑在 Broker 端的执行过程
过滤规则变更与动态生效策略
性能调优与容量规划
Producer 端批量发送与压缩优化
Consumer 端消费线程与拉取参数调优
Broker 端 JVM 与内核参数设置
基于业务量级的集群容量预估
RocketMQ 生态集成与实战应用
与其他消息中间件的对比选型
RocketMQ 与 Kafka 的差异与适用场景
RocketMQ 与 RabbitMQ 的功能对比
RocketMQ 与 Pulsar 在云原生下的取舍
基于业务需求的消息中间件选型指南
Spring 生态中的集成实践
使用 RocketMQ-Spring-Boot-Starter 快速集成
注解式消息监听与消息转换器配置
事务消息与 RocketMQTemplate 的使用
集成中的常见问题与解决方案
大数据与实时计算场景应用
消息数据接入 Flink 与 Spark 的流程
基于 RocketMQ 的流式处理管道构建
消息轨迹跟踪与数据血缘分析
与数据湖和数仓的集成方案
企业级安全与治理实践
消息数据的加密与权限控制机制
多租户隔离与资源配额管理方案
消息链路追踪与全链路压测方法
基于 RocketMQ 的微服务事件驱动架构设计
收藏
立即使用
收藏
立即使用
评论
0 条评论
下一页