day15:shell基础

一,编程语法分类(了解)

  • 编程范式

    • 面向过程:程序通过按步骤执行函数或过程完成任务,强调流程控制和函数调用,适合流程明确的任务,如 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 脚本格式有一定规范,以提高可读性和执行效率:

  1. 脚本文件:以 .sh 为扩展名(可选),便于区分。
  2. 开头声明:第一行通常使用 #!/bin/bash,指定使用的 Shell。
  3. 注释:使用 # 开头,增加注释说明,提高可读性。
  4. 代码风格:统一的缩进和格式,便于阅读和维护。
#!/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 可保证即使关闭终端也继续运行,适合长时间任务,避免进程中断

详细说明补充:

  1. 直接执行脚本:执行前确保脚本有执行权限,权限命令:chmod +x script.sh。此方式会启动一个新 Shell 会话,与当前会话隔离,脚本中的变量和设置不会影响当前会话。

  2. 使用特定 Shell 解释器运行:无执行权限时此方法可直接运行,且能选择不同解释器测试兼容性(例如,某些功能在 bash 下兼容而在 sh 下不兼容)。适合需要测试脚本在不同解释器中的行为差异

  3. 在当前 Shell 中运行脚本:用 source. 可使脚本直接在当前 Shell 运行,使脚本的所有变量、函数和配置直接影响当前环境,适合配置环境变量等。

  4. 在交互式 Shell 中逐行运行:逐行测试是调试和试验的好方法。适合调试特定命令、部分代码段,不适合长脚本。

  5. 作为系统命令运行:适合脚本文件反复使用,将脚本移至 $PATH 路径如 /usr/local/bin/ 可在任何位置直接执行,简化调用。可通过 echo $PATH 查看 $PATH 路径。

  6. 通过 Cron 定时执行脚本:适合周期性任务。编辑 crontab 时指定时间格式,如 0 0 * * * 表示每天午夜运行一次脚本。需确保脚本路径正确且具备执行权限。可通过 crontab -l 查看当前任务。

  7. 通过后台运行和作业控制& 符号将任务后台运行,适合长时间任务。使用 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.txtfile2.txt 等。
  • [...]:匹配括号内的任意一个字符。例如,file[1-3].txt 可以匹配 file1.txtfile2.txtfile3.txt
  • !:用于表示不匹配。例如,file[!1].txt 匹配所有不包含 1 的文件。
  • {x,x,xx,…………}:会生成所有的组合,并在命令运行前替换为多个值。进行匹配。

bash中的引号

  • 单引号 ('):会原样输出引号内的内容,不会进行任何变量替换或转义。例如,echo '$USER' 会输出 $USER
  • 双引号 ("):会保留引号内的内容,但允许变量替换和转义字符。例如,echo "$USER" 会输出当前用户的用户名。
  • 反引号(`:用于命令替换,用反引号将命令包裹起来,Shell 将执行该命令并用其输出替换整个表达式。比如:echo "Today is `date`"

四,变量的分类

概述

变量:就是系统中可以改变的量。

定义:使用等号(=)将变量名与值连接,等号两边不可以有等号,变量名=值

分类

  • 本地变量:当前用户自定义的变量,只可以在当前进程中有效,在其他进程或者子进程都无效,对于其它用户也无效。
  • 环境变量:当前进程有效,而且可以被子进程调用,其他进程和用户无效
    • 查看当前用户的环境变量:env
    • 查看当前用户的所有变量(临时【本地】和环境)(硬盘中):set
    • 将当前的本地变量变为环境变量:export
  • 系统变量(内置到bash的变量):shell本身就已经固定好了的变量,一般有固定的名字和作用

本地变量

  • 定义:本地变量是在当前 Shell 会话中定义的变量,只在该会话内有效。
  • 作用域:本地变量的作用域仅限于定义它的 Shell 脚本或会话,退出该脚本或会话后,该变量会消失。

环境变量(全局变量)

  • 定义:环境变量是可以被所有子进程访问的变量。通过将本地变量导出为环境变量,可以使其在所有子进程中可用。
  • 作用域:环境变量可以在当前 Shell 会话及其所有子进程中使用。

系统变量

  • 定义:系统变量是由操作系统定义并维护的变量,包含有关系统和用户的信息,通常是全局可用的。
  • 使用:系统变量通常用作环境变量的一部分,在Shell和应用程序中广泛使用。
  • 常见和常用的系统变量如下:

    变量名功能描述
    $PATH系统查找可执行文件的路径列表,用冒号分隔多个路径。
    $HOME当前用户的主目录路径。
    $USER当前登录的用户名。
    $SHELL当前使用的 Shell 程序的路径(例如 /bin/bash/bin/zsh)。
    $PWD当前工作目录的路径。
    $OLDPWD上一次所在的工作目录路径,可以用 cd - 快速切换到上一个目录。
    $HOSTNAME当前主机的名称,用于标识机器。
    $UID当前用户的用户 ID,用于标识不同用户的权限。
    $LANG系统的默认语言和编码设置,控制应用程序的语言显示。
    $TERM终端类型,用于指定终端仿真器的类型,如 xtermvt100 等。
    $RANDOM返回一个 0-32767 之间的随机数,用于生成简单的随机数。
    $PS1主提示符变量,用于定义命令行提示符的外观(通常是 $ 表示普通用户,# 表示管理员)。
    $PS2次提示符变量,用于定义多行命令时的提示符(默认是 >)。
    $MAIL当前用户的邮件存放路径。
    $EDITOR默认的文本编辑器程序,用于指定编辑器(如 vimnano 等)。
    $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 变量是区分大小写的,如 VARvar 是两个不同的变量。
    • 无空格赋值:定义变量时,= 两侧不能有空格,否则会被识别为语法错误。例如,var=10 是正确的,而 var = 10 是错误的。
    • 避免保留字:变量名不要与 Shell 的关键字(如 ifwhile 等)重名,以避免冲突。
  • 命名规范
    • 习惯上,用户自定义的变量使用小写字母,如 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 如何工作的:

  1. 放书:当你有新书想放进书柜时,你会告诉 Redis 书的名字(键)和书的内容(值),比如“故事书”和“这是一本好玩的故事”。Redis 会把书放进书柜,并记住书的名字和内容。

  2. 找书:如果你想看某本书,比如“故事书”,你只需要告诉 Redis:“我想看故事书!”Redis 会立刻从书柜里找到这本书,把它拿给你。这个过程非常快,因为书柜里的书都是整齐排列的!

  3. 时间管理:如果有些书你暂时不想看,可以告诉 Redis 设定一个时间,比如“过五分钟后就收起来”。五分钟一到,Redis 会自动把这本书收回书柜,确保书柜里不会放着你不需要的东西。

  4. 查找效率:Redis 的书柜非常特别,它可以记住很多书,并且能够在短时间内找到它们。这就像书柜的书都是按名字排好的一样,让你能够快速找到。

  5. 共享书籍:书柜可以和其他小朋友的书柜连接。当你的朋友想借你的书时,他们只需告诉 Redis 书的名字,Redis 就能快速找到并把书借给他们。

缓存击穿(看看概念与原理就行了)

  • 概念:缓存击穿指的是某个热点数据在缓存中失效(过期)后,有大量请求同时查询该数据,导致所有请求瞬间到达数据库,给数据库造成极大压力。
  • 原因
    • 热点数据的缓存设置了过期时间,数据失效后,短时间内的大量请求直接访问数据库,形成击穿。
  • 解决方案
    • 互斥锁:在缓存失效时对该数据加锁,确保只有一个线程可以请求数据库并重建缓存,其余线程等待缓存重建完成。
    • 永久缓存:对于热点数据可以不设置过期时间,通过后台任务定期更新缓存,避免因过期导致的缓存击穿。
    • 分布式锁:在分布式系统中,利用 Redis 自带的分布式锁来实现单线程对数据库的访问和缓存更新。

缓存穿透(看看概念与原理就行了)

  • 概念:缓存穿透是指对缓存和数据库中都不存在的数据的请求直接到达数据库,并且由于查询的内容无效,这种请求无法被缓存,每次都会穿过缓存直接到数据库。
  • 原因
    • 用户请求的数据在缓存和数据库中都不存在,且没有被缓存,导致每次请求都查询数据库。
    • 可能是恶意攻击,或是请求中包含错误的查询条件(如随机数据、错误 ID 等)。
  • 解决方案
    • 缓存空值:当查询的结果为空时,也将其缓存在 Redis 中设定较短的过期时间,以防止无效请求重复查询数据库。
    • 布隆过滤器:在缓存层前增加一个布隆过滤器(Bloom Filter),能有效判断数据是否存在,过滤掉不合法或无效的请求。
    • 参数校验:对请求的参数进行合法性校验,避免恶意用户通过伪造请求访问数据库中的不存在数据。

缓存雪崩(看看概念与原理就行了)

  • 概念:缓存雪崩指的是大面积缓存集中失效,导致大量请求瞬间涌入数据库,数据库可能因为承载不了如此大的流量而崩溃。
  • 原因
    • 大量缓存设置了相同的过期时间,导致在某一时间点集中失效。
    • 缓存服务突然宕机(如 Redis 崩溃),所有请求都直接访问数据库。
  • 解决方案
    • 缓存过期时间分散:为缓存的过期时间增加随机值,避免在同一时间大规模失效。
    • 二级缓存:使用本地缓存(如 Guava)作为 Redis 的辅助缓存,即使 Redis 突发故障也能保证部分数据的快速访问。
    • 多层缓存架构:可以在 Redis 之上添加一层本地缓存,或将热点数据转移到多节点 Redis 集群,减小单点压力。
    • 限流与降级:在大量请求到达数据库时,启用限流措施或服务降级策略,限制流量或仅返回默认值,以保护数据库。

别名设置alias

alias 别名=“命令”(可以临时设置)

unalias 别名(取消别名)

永久别名

当前用户就修改对应用户的.bashrc文件,改完执行一下,用于刷新配置

全局就修改/etc/bashrc文件,改完操作一样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/905852.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无人机测绘遥感技术算法概述!

一、数据采集算法 航线规划算法 根据测绘任务需求,利用地理信息系统(GIS)和遥感技术,对无人机进行航线规划。 考虑地形、气候、障碍物等因素,优化飞行路径,确保数据采集的完整性和准确性。 传感器控制算…

Pytest-Bdd-Playwright 系列教程(6):在测试步骤函数中设置别名数据共享

Pytest-Bdd-Playwright 系列教程(6):在测试步骤函数中设置别名&数据共享 前言一、步骤别名二、特性文件三、测试脚本四、运行测试五、小测验总结 前言 有的时候,为了提高可读性,我们需要使用不同的名称来声明相同的…

HTML 分组标签与语义化应用:合理使用 <div>、<span> 和基础语义容器

文章目录 1. `<div>` 标签特点用途示例2. `<span>` 标签特点用途示例3. `<fieldset>` 标签特点用途示例4. `<section>` 标签特点用途示例5. `<article>` 标签特点用途示例总结HTML中的分组(容器)标签用于结构化内容,将页面元素组织成逻辑区域…

关于武汉芯景科技有限公司的马达驱动芯片AT6237开发指南(兼容DRV8837)

一、芯片引脚介绍 1.芯片引脚 二、系统结构图 三、功能描述 逻辑功能

Android View

前面我们了解了Android四大组件的工作流程&#xff0c;Android中还存在一个和四大组件地位相同的概念&#xff1a;View&#xff0c;用于向用户页面展示内容。我们经常使用的TextView、Button、ImageView控件等都继承于它&#xff0c;也会自定义View实现自定义效果。View类源码内…

谷歌插件开发学习指南

什么是谷歌插件 谷歌插件&#xff08;Chrome Extension&#xff09;是为谷歌浏览器&#xff08;Chrome&#xff09;开发的小程序&#xff0c;旨在增强浏览器的功能或用户体验。它们可以通过添加工具栏按钮、修改网页内容、集成其他服务等方式&#xff0c;实现各种功能&#xf…

linux命令行的艺术

文章目录 前言基础日常使用文件及数据处理系统调试单行脚本冷门但有用仅限 OS X 系统仅限 Windows 系统在 Windows 下获取 Unix 工具实用 Windows 命令行工具Cygwin 技巧 更多资源免责声明 熟练使用命令行是一种常常被忽视&#xff0c;或被认为难以掌握的技能&#xff0c;但实际…

Puppeteer 与浏览器版本兼容性:自动化测试的最佳实践

Puppeteer 支持的浏览器版本映射&#xff1a;从 v20.0.0 到 v23.6.0 自 Puppeteer v20.0.0 起&#xff0c;这个强大的自动化库开始支持与 Chrome 浏览器的无头模式和有头模式共享相同代码路径&#xff0c;为自动化测试带来了更多便利。从 v23.0.0 开始&#xff0c;Puppeteer 进…

知识管理新选择!本地大模型助手“知我AI”全功能解析

抖知书老师推荐&#xff1a; 随着人工智能技术的飞速发展&#xff0c;本地大模型知识管理工具逐渐成为提高工作效率的利器。今天&#xff0c;我要向大家介绍一款名为**“知我AI”**的本地知识管理助手&#xff0c;它以其独特的功能和优势&#xff0c;正在成为众多专业人士的新…

Banana Pi BPI-R3路由器开发板运行 OrayOS物联网系统

近日&#xff0c;Banana PI开发板宣布与贝锐达成战略合作&#xff0c;贝锐OrayOS现已成功适配Banana PI的BPI-R3型号&#xff0c;并计划进一步扩展硬件支持&#xff0c;包括目前Banana PI热销的BPI-R4、BPI-R3 Mini等更多型号。这一合作为用户提供了更广泛的开发板选择&#xf…

No.24 笔记 | WEB安全 - 任意文件包含漏洞 part 6

在 Web 安全领域中&#xff0c;任意文件包含漏洞是一种较为常见且具有潜在危险性的漏洞类型。本文将详细介绍任意文件包含漏洞的概念、原理、分类、利用方法以及防护措施&#xff0c;帮助新手小白更好地理解和防范这一漏洞。&#x1f603; 一、概念 包含的定义 开发人员为了提…

森利威尔SL2516D 耐压60V内置5V功率MOS 支持PWM LED恒流驱动器芯片

一、基本特性 型号&#xff1a;SL2516D封装&#xff1a;ESOP8工作频率&#xff1a;140kHz驱动MOS管&#xff1a;内置 二、电气特性 输入电压范围&#xff1a;8V~100V&#xff08;注意&#xff0c;虽然问题中提到耐压60V&#xff0c;但根据官方信息&#xff0c;其实际耐压范围…

Vscode配置CC++编程环境的使用体验优化和补充说明

文章目录 快速编译运行&#x1f47a;code runner插件方案Code Runner Configuration 直接配置 相关指令和快捷键默认task配置和取消默认 配置文件补充介绍(可选 推荐阅读)&#x1f60a;使用vscode预置变量和环境变量环境变量的使用使用环境变量的好处环境变量可能引起的问题 检…

Linux中rpm包和yum仓库介绍及入门配置

rpm包概述 RPM Package Manager,RPM包管理器 由红帽公司提出&#xff0c;适用于Rocky Linux、Redhat、SUSE等系列操作系统 建立集中数据库&#xff0c;记录软件包安装/卸载等变化信息&#xff0c;分析软件包依赖关系 RPM包 文件名特征 软件名-版本信息.操作系统.硬件架/构.r…

L 波段射频信号采集回放系统

L 波段采集回放系统是一套便携式模拟数字采集系统&#xff0c;该系统主要由射频输入模块、中频接收回放模块、FPGA 信号处理单元、服务器系统和存储单元等组成。 L 波段采集回放系统的功能主要用于对 950MHz〜2150MHz 模拟量射频信号的采集、存储记录与回放&#xff1b;采集与…

百度如何打造AI原生研发新范式?

&#x1f449;点击即可下载《百度AI原生研发新范式实践》资料 2024年10月23-25日&#xff0c;2024 NJSD技术盛典暨第十届NJSD软件开发者大会、第八届IAS互联网架构大会在南京召开。本届大会邀请了工业界和学术界的专家&#xff0c;优秀的工程师和产品经理&#xff0c;以及其它行…

Unity3D 开发教程:从入门到精通

Unity3D 开发教程&#xff1a;从入门到精通 Unity3D 是一款强大的跨平台游戏引擎&#xff0c;广泛应用于游戏开发、虚拟现实、增强现实等领域。本文将详细介绍 Unity3D 的基本概念、开发流程以及一些高级技巧&#xff0c;帮助你从零基础到掌握 Unity3D 开发。 目录 Unity3D…

Vue3和Springboot前后端简单部署

一、Vue3Springboot 的前后端简单部署 (在win下面部署) 1、前端实现部署 思想: 前端打包项目后、放到nginx中进行部署 1、nginx 安装 和 解压 1、下载 nginx.zip win版本 解压就可以 2、解压后、启动程序 3、访问 nginx 欢迎页面 http://localhost/ 80 端口 可以省略 直接访…

中仕公考:2025四川省考今日报名!

2025年四川省考今日开始报名啦&#xff01;准备参加考试的广大考生们不要错过报名时间哦&#xff01; 报名时间&#xff1a; 2024年11月1日至7日上午8:00 资格审查&#xff1a; 2024年11月1日至8日上午8:00 确认缴费&#xff1a; 2024年11月9日上午8:00 准考证打印&#xff…

css 同时实现渐变色和文字阴影(Vue 3 + TypeScript)

UI效果 渐变效果 直接添加text-shadow属性&#xff0c;发现阴影覆盖在了字体之上 解决&#xff1a; 利用::after伪类&#xff0c;将字体的阴影加在伪类之上。 <template><div class"app"><h1 ref"h1Ref">{{ title }}</h1></d…