一,编程语法分类(了解)
-
编程范式:
- 面向过程:程序通过按步骤执行函数或过程完成任务,强调流程控制和函数调用,适合流程明确的任务,如 C。
- 面向对象:通过“类”和“对象”封装数据和方法,支持继承、多态等特性,适用于复杂应用和软件架构,如 Java、Python。
- 函数式:强调函数的组合和不可变性,避免使用可变状态(变量),适合数据处理和高并发应用,如 Haskell、Lisp。
- 逻辑编程:基于逻辑规则和推理来解决问题,常用于人工智能和规则推理场景,如 Prolog。
- 声明式:描述“是什么”而非“怎么做”,适合描述性任务(如数据库查询、标记语言),如 SQL、HTML。
-
执行方式:
- 编译型:代码先通过编译器转换为机器码,提高执行速度,适合性能要求高的应用,如 C、Rust。
- 解释型:代码逐行解释执行,便于调试和修改,但速度较慢,适合快速开发和脚本任务,如 Python、Ruby。
- 混合型:先编译为中间代码(如字节码),然后由虚拟机解释执行,兼顾性能与便携性,如 Java。
-
用途:
- 系统编程:用于开发操作系统、驱动和底层软件,要求高性能和低级硬件控制,如 C、Rust。
- Web开发:用于构建网站和 Web 应用,适合处理前端和后端交互,如 HTML、JavaScript、PHP。
- 数据科学:用于数据分析、机器学习等计算密集型任务,支持科学计算库和数据处理,如 Python、R。
- 嵌入式开发:用于嵌入式系统和硬件编程,通常直接控制硬件资源,如 C、Assembly。
- 脚本编写:用于自动化和任务脚本,简单且快速编写,适合管理任务和轻量级开发,如 Python、Bash。
-
抽象级别:
- 低级语言:接近机器语言,提供直接硬件控制,适合底层开发但编写复杂,如汇编语言。
- 高级语言:抽象程度高,易读性好,便于快速开发,适合应用开发和软件工程,如 Python、Java。
- 中级语言:兼具高低级特性,既能操作硬件又支持抽象,如 C。
-
类型系统:
- 静态类型:变量类型在编译时确定,有助于减少类型错误,提高安全性和性能,如 Java、C++。
- 动态类型:变量类型在运行时确定,灵活性高,适合快速开发,但容易出错,如 Python、JavaScript。
- 强类型:严格的类型转换规则,减少不安全的类型操作,提升安全性和代码可读性,如 Haskell、Python。
- 弱类型:类型转换灵活,开发便捷但容易出错,适合轻量级应用和脚本任务,如 JavaScript、Perl。
二,shell概述
概述
Shell 是一种命令解释器,提供用户与操作系统交互的接口。用户可以通过 Shell 输入命令或执行脚本来控制和管理系统。Shell 不仅能执行基本的系统命令,还可以通过编写脚本完成自动化任务。常见的 Shell 包括 Bash、Zsh、Ksh 等。
分类
Shell 有多种类型,不同的 Shell 具有不同的语法和功能:
- Bourne Shell(sh):最早的 Shell 之一,Unix 系统的标准 Shell。
- Bourne-Again Shell(Bash):基于 Bourne Shell 扩展的 Shell,是 Linux 系统默认的 Shell,功能丰富且兼容性好。
- C Shell(csh):类似 C 语言的语法,适合用户熟悉 C 语言的操作。
- Korn Shell(ksh):集成了 Bourne 和 C Shell 的优点,兼顾了脚本编写和交互操作。
- Z Shell(zsh):功能丰富的 Shell,具备高自定义性,适合个性化配置。
查看系统支持哪些shell:cat /etc/shells
[root@localhost ly]# cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/tcsh /bin/csh
shell脚本概述
Shell 脚本是一组按顺序执行的命令集合,保存为文本文件,并通过 Shell 解释执行。Shell 脚本主要用于自动化任务,管理系统环境、批量处理文件等。脚本可以包含变量、循环、条件判断等结构,帮助实现流程控制和自动化管理。
shell格式
Shell 脚本格式有一定规范,以提高可读性和执行效率:
- 脚本文件:以
.sh
为扩展名(可选),便于区分。- 开头声明:第一行通常使用
#!/bin/bash
,指定使用的 Shell。- 注释:使用
#
开头,增加注释说明,提高可读性。- 代码风格:统一的缩进和格式,便于阅读和维护。
#!/bin/bash
# 一些注释 This is a sample shell script
echo "Hello, World!"
运行方式
运行方式 | 方法示例 | 适用场景 | 特点 |
---|---|---|---|
直接执行脚本 | ./script.sh | 常规脚本执行 | 需要添加执行权限,若不在 $PATH 目录中需指定路径,运行在新 Shell 实例中,不影响当前环境变量。 |
使用特定 Shell 解释器运行 | bash script.sh | 脚本无执行权限或测试不同解释器时 | 指定特定 Shell 解释器,方便调试不同 Shell 兼容性,不影响当前环境变量。 |
在当前 Shell 中运行脚本 | source script.sh 或 . script.sh | 需要脚本对当前环境生效(如设置环境变量) | 直接在当前 Shell 中执行脚本内容,变量和配置影响当前环境。 |
在交互式 Shell 中逐行运行 | 直接输入每条命令 | 测试命令或脚本调试 | 手动输入命令,适合调试、检查结果,便于修改,适合小片段代码测试,适合立即执行的短代码。 |
作为系统命令运行 | sudo mv script.sh /usr/local/bin/ | 频繁调用脚本并希望随时可用时 | 将脚本置于 $PATH 目录,添加执行权限后可在任意位置运行,适合定义系统范围的自定义命令。 |
通过 Cron 定时执行脚本 | crontab -e | 定时任务,如日志清理、定期备份 | 定时自动运行,后台执行,不需手动干预,适合周期性任务。 |
通过后台运行和作业控制 | ./script.sh & 或 nohup ./script.sh & | 脚本长时间运行,不希望占用前台或终端关闭也保持执行 | 后台运行脚本,使用 nohup 可保证即使关闭终端也继续运行,适合长时间任务,避免进程中断。 |
详细说明补充:
直接执行脚本:执行前确保脚本有执行权限,权限命令:
chmod +x script.sh
。此方式会启动一个新 Shell 会话,与当前会话隔离,脚本中的变量和设置不会影响当前会话。使用特定 Shell 解释器运行:无执行权限时此方法可直接运行,且能选择不同解释器测试兼容性(例如,某些功能在
bash
下兼容而在sh
下不兼容)。适合需要测试脚本在不同解释器中的行为差异。在当前 Shell 中运行脚本:用
source
或.
可使脚本直接在当前 Shell 运行,使脚本的所有变量、函数和配置直接影响当前环境,适合配置环境变量等。在交互式 Shell 中逐行运行:逐行测试是调试和试验的好方法。适合调试特定命令、部分代码段,不适合长脚本。
作为系统命令运行:适合脚本文件反复使用,将脚本移至
$PATH
路径如/usr/local/bin/
可在任何位置直接执行,简化调用。可通过echo $PATH
查看$PATH
路径。通过 Cron 定时执行脚本:适合周期性任务。编辑
crontab
时指定时间格式,如0 0 * * *
表示每天午夜运行一次脚本。需确保脚本路径正确且具备执行权限。可通过crontab -l
查看当前任务。通过后台运行和作业控制:
&
符号将任务后台运行,适合长时间任务。使用nohup
能确保终端关闭后任务继续运行,适合不想被终端关闭影响的任务。
三,bash基本特征
命令与文件自动补全
- Bash 提供了自动补全功能,可以在输入命令或文件名时,按下 Tab 键,自动补全你输入的内容。
常见的快捷键
快捷键 | 功能描述 |
---|---|
ctrl + a | 光标移动到命令行的开头。 |
ctrl + e | 光标移动到命令行的结尾。 |
ctrl + u | 删除光标到行首的所有字符。 |
ctrl + k | 删除光标到行尾的所有字符。 |
ctrl + w | 删除光标前的一个单词。 |
ctrl + c | 终止当前运行的命令。 |
ctrl + z | 将当前运行的命令挂起(暂停)。 |
ctrl + r | 反向搜索之前输入的命令。 |
ctrl + l | 清屏,相当于输入 clear 命令。 |
常用的通配符
*
:匹配零个或多个字符。例如,*.txt
可以匹配所有以.txt
结尾的文件。?
:匹配一个字符。例如,file?.txt
可以匹配file1.txt
、file2.txt
等。[...]
:匹配括号内的任意一个字符。例如,file[1-3].txt
可以匹配file1.txt
、file2.txt
和file3.txt
。!
:用于表示不匹配。例如,file[!1].txt
匹配所有不包含1
的文件。- {x,x,xx,…………}:会生成所有的组合,并在命令运行前替换为多个值。进行匹配。
bash中的引号
- 单引号 (
'
):会原样输出引号内的内容,不会进行任何变量替换或转义。例如,echo '$USER'
会输出$USER
。 - 双引号 (
"
):会保留引号内的内容,但允许变量替换和转义字符。例如,echo "$USER"
会输出当前用户的用户名。 - 反引号(
`
):用于命令替换,用反引号将命令包裹起来,Shell 将执行该命令并用其输出替换整个表达式。比如:echo "Today is `date`"
四,变量的分类
概述
变量:就是系统中可以改变的量。
定义:使用等号(=)将变量名与值连接,等号两边不可以有等号,变量名=值
分类
- 本地变量:当前用户自定义的变量,只可以在当前进程中有效,在其他进程或者子进程都无效,对于其它用户也无效。
- 环境变量:当前进程有效,而且可以被子进程调用,其他进程和用户无效
- 查看当前用户的环境变量:env
- 查看当前用户的所有变量(临时【本地】和环境)(硬盘中):set
- 将当前的本地变量变为环境变量:export
- 查看当前用户的环境变量:env
- 系统变量(内置到bash的变量):shell本身就已经固定好了的变量,一般有固定的名字和作用
本地变量
- 定义:本地变量是在当前 Shell 会话中定义的变量,只在该会话内有效。
- 作用域:本地变量的作用域仅限于定义它的 Shell 脚本或会话,退出该脚本或会话后,该变量会消失。
环境变量(全局变量)
- 定义:环境变量是可以被所有子进程访问的变量。通过将本地变量导出为环境变量,可以使其在所有子进程中可用。
- 作用域:环境变量可以在当前 Shell 会话及其所有子进程中使用。
系统变量
- 定义:系统变量是由操作系统定义并维护的变量,包含有关系统和用户的信息,通常是全局可用的。
- 使用:系统变量通常用作环境变量的一部分,在Shell和应用程序中广泛使用。
-
常见和常用的系统变量如下:
变量名 功能描述 $PATH
系统查找可执行文件的路径列表,用冒号分隔多个路径。 $HOME
当前用户的主目录路径。 $USER
当前登录的用户名。 $SHELL
当前使用的 Shell 程序的路径(例如 /bin/bash
或/bin/zsh
)。$PWD
当前工作目录的路径。 $OLDPWD
上一次所在的工作目录路径,可以用 cd -
快速切换到上一个目录。$HOSTNAME
当前主机的名称,用于标识机器。 $UID
当前用户的用户 ID,用于标识不同用户的权限。 $LANG
系统的默认语言和编码设置,控制应用程序的语言显示。 $TERM
终端类型,用于指定终端仿真器的类型,如 xterm
、vt100
等。$RANDOM
返回一个 0-32767 之间的随机数,用于生成简单的随机数。 $PS1
主提示符变量,用于定义命令行提示符的外观(通常是 $
表示普通用户,#
表示管理员)。$PS2
次提示符变量,用于定义多行命令时的提示符(默认是 >
)。$MAIL
当前用户的邮件存放路径。 $EDITOR
默认的文本编辑器程序,用于指定编辑器(如 vim
、nano
等)。$LOGNAME
当前用户的登录名,通常与 $USER
相同。$HISTFILE
存储命令历史记录的文件路径,通常是 ~/.bash_history
。$HISTSIZE
历史记录中可以保存的命令条目数量,控制 history
命令能显示多少历史命令。$TMOUT
超时变量,定义 Shell 会话在无输入状态下等待的秒数,超时后会自动退出。 $PATH
列出可执行程序的搜索路径,多个路径用冒号分隔。 -
在 Bash 中,
$
符号与数字和其他符号结合时,具有不同的特殊含义,常用于引用命令行参数、脚本信息和其他特殊变量:变量/符号 含义及说明 案例 $0
当前脚本的文件名或执行的命令名。 $1, $2, ...
传递给脚本或函数的第一个、第二个、……参数。例如 $1
表示第一个参数,$2
表示第二个参数。$#
传递给脚本或函数的参数数量。 $@
表示传递给脚本或函数的所有参数,每个参数作为独立的字符串。 $*
表示传递给脚本或函数的所有参数,将所有参数视为一个整体字符串。 $?
上一个命令的退出状态码, 0
表示成功,非0
表示失败。$$
当前 Shell 进程的 PID(进程 ID)。 $!
最近一个后台执行的命令的 PID。 $-
显示当前 Shell 的选项标志,通常用于查看 Bash 运行时的选项状态。 $_
上一个命令的最后一个参数或结果,在命令行中可以快捷访问。
五,变量的定义
概述
Bash 变量用于存储文本、数字和其他数据类型,可分为本地变量、环境变量和系统变量等类型。变量帮助管理脚本的灵活性、控制执行流程,并允许在脚本之间共享信息。
规则
- 命名规则:
- 命名规则:变量名只能包含字母(大小写)、数字和下划线(
_
),且不能以数字开头。- 区分大小写:Bash 变量是区分大小写的,如
VAR
和var
是两个不同的变量。- 无空格赋值:定义变量时,
=
两侧不能有空格,否则会被识别为语法错误。例如,var=10
是正确的,而var = 10
是错误的。- 避免保留字:变量名不要与 Shell 的关键字(如
if
、while
等)重名,以避免冲突。- 命名规范:
- 习惯上,用户自定义的变量使用小写字母,如
name
;系统变量使用大写字母,如PATH
。
定义获取与取消
定义变量:
- 直接使用
变量名=值
格式定义变量(如name="John"
)。变量赋值时等号两边不能有空格。- 或者使用set 变量来定义而不初始化变量。
获取变量:
- 使用
$变量名
获取变量值(如echo $name
)。在复杂表达式中,可以使用${变量名}
格式。取消变量:
- 使用
unset 变量名
取消变量定义(如unset name
),使其在当前会话中无效。
类型变量
Bash 中的变量类型大致分为以下几种:
类型 | 描述 | 示例 |
---|---|---|
本地变量 | 在当前 Shell 会话或函数中有效的变量,通常通过直接赋值定义。 | name="Alice" |
环境变量 | 对所有子进程有效的全局变量,通常通过 export 命令定义。 | export PATH=$PATH:/newpath |
只读变量 | 不可修改或删除的变量,使用 readonly 命令定义。 | readonly version=1.0 |
数组变量 | 可以存储多个值的变量,使用 数组名[index]=值 的方式定义,支持一维数组。或者数组名=(多个值逗号隔开) | arr[0]="apple" |
关联数组 | 存储键值对的数组,使用 declare -A 数组名 声明关联数组。 | declare -A mydict |
关联数组
关联数组是带有键值对的数组,需要先声明,再进行赋值和获取。
- 声明关联数组:使用
declare -A 数组名
,例如declare -A mydict
。 - 赋值:通过
数组名[key]=value
进行赋值,例如mydict[name]="Alice"
。 - 获取值:通过
数组名[key]
获取值,例如echo ${mydict[name]}
输出Alice
。 - 遍历数组:使用
for key in "${!数组名[@]}"
来获取键,并用数组名[$key]
获取对应的值。
交互式定义
交互式定义变量允许用户在脚本运行时输入变量值,使用 read
命令完成。
- 基本用法:
read 变量名
会在命令行等待用户输入,将输入内容赋值给变量。例如:-
#!/bin/bash read name sex [……] echo "Hello, $name $sex!"
- 提示输入:使用
-p
选项指定提示信息,例如read -p "Enter your name: " name
。 - 隐藏输入:使用
-s
选项隐藏用户输入(常用于密码),例如read -s -p "Enter password: " password
。 - 超时限制:使用
-t
选项设置等待输入的秒数,例如read -t 10 name
会在 10 秒后超时退出。 - -n:限制字符数
-
一些关于$()${}$[]等的运用
符号 | 用法说明 | 示例 |
---|---|---|
$() | 命令替换:执行括号内的命令并返回输出。支持嵌套。 | date=$(date +%Y-%m-%d) echo "Today is $date" |
替代语法:反引号(`command` ),但不支持嵌套。 | `ls` | |
${} | 变量替换:引用变量值。 | name="Alice" echo "Hello, ${name}!" |
默认值设定:若变量为空或未定义,返回默认值。 | echo ${name:-"Unknown"} | |
字符串长度:获取字符串长度。 | str="Hello" echo ${#str} | |
字符串替换:替换字符串中的部分内容。 | path="/usr/local/bin" echo ${path/local/opt} | |
去除前后缀:移除字符串的指定前缀或后缀。 | file="test_file.txt" echo ${file%.txt} | |
$[] | 算术运算:执行简单的整数运算,功能较弱。 | result=$[5 + 3] |
$(( )) | 算术运算:执行复杂的整数运算,推荐使用。 | result=$((a + b)) echo $((5 * 3)) |
${varname[@]} | 数组操作:引用数组的所有元素,各元素独立。 | array=(apple banana cherry) echo ${array[@]} |
${varname[*]} | 数组操作:引用数组的所有元素,作为一个整体字符串。 | echo ${array[*]} |
${#array[@]} | 获取数组长度:返回数组的元素数量。 | echo ${#array[@]} |
${!array[@]} | 获取数组所有下标:返回数组的所有下标。 | echo ${!array[@]} |
${array[@]:开始位:长度} | 获取数组指定内容:返回数组中指定起始位置及长度的元素。 | echo ${array[@]:1:2} # 返回数组从下标1开始的2个元素 |
变量定义
定义变量:可以通过直接赋值来定义变量。
var="value" # 定义变量
导出变量:使用 export
将变量导出为环境变量。
export VAR="value" # 将变量 VAR 导出
取消变量:使用 unset
来删除变量。
unset var # 删除变量 var
读取变量:使用 $
前缀获取变量的值。
echo $var # 输出变量 var 的值
变量的常用方法
使用 declare
定义变量类型:
-i 定义整型变量,自动进行算术运算。
declare -i num=5
echo $((num + 2)) # 输出 7
-a 定义数组变量。
declare -a array=(apple banana cherry)
echo ${array[1]} # 输出 banana
-A 定义关联数组(键值对数组)。
declare -A assoc_array=(["key1"]="value1" ["key2"]="value2")
echo ${assoc_array[key1]} # 输出 value1
-r 定义只读变量,值不能被修改。
declare -r constant="fixed_value"
constant="new_value" # 会报错
-x 定义环境变量,将变量导出到子进程中。
declare -x env_var="exported_value"
env # 查看导出的变量
-p 打印当前变量及其属性。
declare -p var_name
使用 readonly
定义只读变量:
readonly 定义只读变量,值不能被修改或取消。
readonly VAR="fixed_value"
VAR="new_value" # 会报错
字符串截取方法(下标从0开始)
用法 | 示例 | 说明 |
---|---|---|
${string:起始位置} | str='Hello, World!'echo ${str:7} | 从第 7 个字符开始截取,输出 "World!" |
${string:起始位置:长度} | echo ${str:0:5} | 从第 0 个字符开始截取 5 个字符,输出 "Hello" |
${string#模式} | echo ${str#*o} | 从左侧开始,删除第一个匹配模式的内容,输出 " World!" |
${string##模式} | echo ${str##*o} | 从左侧开始,删除所有匹配模式的内容,输出 "rld!" |
${string%模式} | echo ${str%o*} | 从右侧开始,删除第一个匹配模式的内容,输出 "Hello, W" |
${string%%模式} | echo ${str%%o*} | 从右侧开始,删除所有匹配模式的内容,输出 "Hell" |
${#string} | echo ${#str} | 获取字符串的长度,输出 13 |
$(切片) | substring=${str:7:5} echo $substring | 从第 7 个字符开始,截取 5 个字符,输出 "World" |
六,四则运算
概述
在 Bash 中,四则运算指的是基本的加法、减法、乘法和除法运算。这些运算通常用于处理数值变量,并可以通过多种方式实现。
运算方式
使用 let 命令:
let
不需要$(())
或expr
,使得运算更加简洁。内部直接用变量名- let expression
+
:加法-
:减法*
:乘法/
:除法%
:取余++
:自增--
:自减
-
x=10 y=5 let result=x-y let x++ echo $result # 输出 5
使用 $(( ))
进行运算:
- 推荐的方法,支持复杂表达式和嵌套。
-
a=5 b=3 sum=$((a + b)) # 加法 diff=$((a - b)) # 减法 product=$((a * b)) # 乘法 quotient=$((a / b)) # 除法 remainder=$((a % b)) # 取余 echo "Sum: $sum" # 输出 Sum: 8 echo "Difference: $diff" # 输出 Difference: 2 echo "Product: $product" # 输出 Product: 15 echo "Quotient: $quotient" # 输出 Quotient: 1 echo "Remainder: $remainder" # 输出 Remainder: 2
使用 expr
命令:
- 一种较旧的方法,适合简单运算。
-
a=5 b=3 sum=$(expr $a + $b) # 加法 echo "Sum: $sum" # 输出 Sum: 8
使用 bc
命令:(要安装)
- 用于浮点运算。
-
a=5.5 b=3.2 result=$(echo "$a + $b" | bc) # 加法 echo "Result: $result" # 输出 Result: 8.7
++与--{分为前后置,前:先自加后赋值。后:先赋值在自加。}
自增(++
):
- 可以用于变量前或后,前置自增会先增加值再使用,后置自增先使用值再增加。
-
num=5 ((num++)) # 后置自增 echo $num # 输出 6 ((++num)) # 前置自增 echo $num # 输出 7
自减(--
):
- 用法类似于自增。
-
num=5 ((num--)) # 后置自减 echo $num # 输出 4 ((--num)) # 前置自减 echo $num # 输出 3
七,扩展
redis:软件缓存
想象一个聪明的小朋友,叫做 Redis,他有一个超大的书柜。这个书柜里面存放了很多书(数据),他能快速帮你找到你需要的书。下面是 Redis 如何工作的:
放书:当你有新书想放进书柜时,你会告诉 Redis 书的名字(键)和书的内容(值),比如“故事书”和“这是一本好玩的故事”。Redis 会把书放进书柜,并记住书的名字和内容。
找书:如果你想看某本书,比如“故事书”,你只需要告诉 Redis:“我想看故事书!”Redis 会立刻从书柜里找到这本书,把它拿给你。这个过程非常快,因为书柜里的书都是整齐排列的!
时间管理:如果有些书你暂时不想看,可以告诉 Redis 设定一个时间,比如“过五分钟后就收起来”。五分钟一到,Redis 会自动把这本书收回书柜,确保书柜里不会放着你不需要的东西。
查找效率:Redis 的书柜非常特别,它可以记住很多书,并且能够在短时间内找到它们。这就像书柜的书都是按名字排好的一样,让你能够快速找到。
共享书籍:书柜可以和其他小朋友的书柜连接。当你的朋友想借你的书时,他们只需告诉 Redis 书的名字,Redis 就能快速找到并把书借给他们。
缓存击穿(看看概念与原理就行了)
- 概念:缓存击穿指的是某个热点数据在缓存中失效(过期)后,有大量请求同时查询该数据,导致所有请求瞬间到达数据库,给数据库造成极大压力。
- 原因:
- 热点数据的缓存设置了过期时间,数据失效后,短时间内的大量请求直接访问数据库,形成击穿。
- 解决方案:
- 互斥锁:在缓存失效时对该数据加锁,确保只有一个线程可以请求数据库并重建缓存,其余线程等待缓存重建完成。
- 永久缓存:对于热点数据可以不设置过期时间,通过后台任务定期更新缓存,避免因过期导致的缓存击穿。
- 分布式锁:在分布式系统中,利用 Redis 自带的分布式锁来实现单线程对数据库的访问和缓存更新。
缓存穿透(看看概念与原理就行了)
- 概念:缓存穿透是指对缓存和数据库中都不存在的数据的请求直接到达数据库,并且由于查询的内容无效,这种请求无法被缓存,每次都会穿过缓存直接到数据库。
- 原因:
- 用户请求的数据在缓存和数据库中都不存在,且没有被缓存,导致每次请求都查询数据库。
- 可能是恶意攻击,或是请求中包含错误的查询条件(如随机数据、错误 ID 等)。
- 解决方案:
- 缓存空值:当查询的结果为空时,也将其缓存在 Redis 中设定较短的过期时间,以防止无效请求重复查询数据库。
- 布隆过滤器:在缓存层前增加一个布隆过滤器(Bloom Filter),能有效判断数据是否存在,过滤掉不合法或无效的请求。
- 参数校验:对请求的参数进行合法性校验,避免恶意用户通过伪造请求访问数据库中的不存在数据。
缓存雪崩(看看概念与原理就行了)
- 概念:缓存雪崩指的是大面积缓存集中失效,导致大量请求瞬间涌入数据库,数据库可能因为承载不了如此大的流量而崩溃。
- 原因:
- 大量缓存设置了相同的过期时间,导致在某一时间点集中失效。
- 缓存服务突然宕机(如 Redis 崩溃),所有请求都直接访问数据库。
- 解决方案:
- 缓存过期时间分散:为缓存的过期时间增加随机值,避免在同一时间大规模失效。
- 二级缓存:使用本地缓存(如 Guava)作为 Redis 的辅助缓存,即使 Redis 突发故障也能保证部分数据的快速访问。
- 多层缓存架构:可以在 Redis 之上添加一层本地缓存,或将热点数据转移到多节点 Redis 集群,减小单点压力。
- 限流与降级:在大量请求到达数据库时,启用限流措施或服务降级策略,限制流量或仅返回默认值,以保护数据库。
别名设置alias
alias 别名=“命令”(可以临时设置)
unalias 别名(取消别名)
永久别名
当前用户就修改对应用户的.bashrc文件,改完执行一下,用于刷新配置
全局就修改/etc/bashrc文件,改完操作一样