【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(持久化功能分析)

news2024/10/9 2:29:01

探究Redis服务启动的过程机制的技术原理和流程分析的指南(持久化功能分析)

  • Redis提供的持久化机制
    • Redis持久化如何工作
    • Redis持久化的故障分析
      • 持久化频率操作分析
        • 数据库多久调用一次write,将数据写入内核缓冲区?
        • 内核多久将系统缓冲区中的数据写入磁盘控制器?
        • 磁盘控制器何时将缓存中的数据写入物理介质上?
    • 数据损坏
    • Redis提供了RDB持久化和AOF持久化
      • RDB机制的优势和用法
        • RDB机制的优势
        • RDB持久化的略施
      • RDB文件保存过程
        • RDB文件保存指令
          • 持久化操作所引发的性能问题
        • 优势
        • 劣势
      • AOF文件保存过程
        • Redis指令分析介绍
        • AOF日志文件效果
        • AOF的压缩重写机制
          • AOF重写执行流程
        • AOF的优势
        • AOF的劣势
        • 扩展讨论
  • Redis数据的迁移操作
    • aof导入方式
    • RDB文件迁移
    • redis-dump方式
      • redis-load导入

Redis提供的持久化机制

Redis是一种面向"key-value"类型数据的分布式NoSQL数据库系统,具有高性能、持久存储和适应高并发应用场景等诸多优势。尽管Redis的发展起步较晚,但它的发展速度迅猛。

探究Redis持久化的工作原理以及实现方式。通过深入理解Redis持久化,用户可以更好地了解Redis数据的持久化和可靠性,进而更加有效地使用和管理Redis数据库。

本篇文章对于解决关于Redis持久化的误解非常有帮助,可以为用户提供更为清晰和准确的理解。

Redis持久化如何工作

Redis持久化是指将数据存储到在断电后数据不会丢失的设备中,通常指的是硬盘。简单来说,持久化就是将数据持久保存的过程。

现在我们来详细了解一下数据库在进行写操作时的具体过程,主要包括以下五个步骤:
在这里插入图片描述

  1. 客户端向服务端发送写操作请求(数据存储在客户端内存中)。
  2. 数据库服务端接收到写请求的数据(数据存储在服务端内存中)。
  3. 服务端调用write系统调用,将数据写入系统内存中的缓冲区(数据存储在缓冲区)。
  4. 操作系统将缓冲区中的数据转移到磁盘控制器(数据存储在磁盘缓存中)。
  5. 磁盘控制器将数据写入磁盘的物理介质中(数据真正保存在磁盘上)。

以上就是数据库进行写操作时的基本流程。通过持久化机制,数据可以在断电情况下得到有效保护,从而保证数据的可靠性和持久性。

Redis持久化的故障分析

让我们来对故障进行分析。写操作经过了上述提到的五个步骤,下面我们结合这些步骤,分析不同级别的故障可能导致的影响:
在这里插入图片描述

  1. 当数据库系统发生故障时,系统内核仍然正常运行。在这种情况下,只要执行完第三步,数据就是安全的,因为后续的操作系统会完成后面的步骤,确保数据最终存储在磁盘上。

  2. 当系统断电时,上述五个步骤中提到的所有缓存都会失效,数据库和操作系统也会停止工作。因此,只有在完成第五步之后,才能确保在断电后数据不会丢失。

通过以上分析,我们可以看出,在数据库的写操作中,如果完成了第三步和第五步,数据就会得到保证。在故障发生时,正确的执行和处理这些步骤是确保数据安全和避免数据丢失的关键。

持久化频率操作分析

通过上述的五个步骤,我们可能会产生以下几个问题的疑惑:

数据库多久调用一次write,将数据写入内核缓冲区?

对于这个问题,数据库通常会对此进行完全的控制。

内核多久将系统缓冲区中的数据写入磁盘控制器?

操作系统会有默认的策略,但是我们也可以通过POSIX API提供的fsync系列命令来强制操作系统将数据从内核区写入磁盘控制器。

磁盘控制器何时将缓存中的数据写入物理介质上?

尽管看起来数据库无法直接触及,但实际上,在大多数情况下磁盘缓存会被关闭,或者仅用于读取缓存,也就是说,写操作直接写入磁盘而不进行缓存。建议的做法是,只有在磁盘设备具备备用电池的情况下才开启写缓存。

数据损坏

数据损坏是指数据无法恢复。在上面我们讨论了如何确保数据被写入磁盘,但是写入磁盘并不意味着数据不会损坏。举个例子,当发生意外时,可能只有一次写操作成功完成,而另一次写操作尚未完成。此时,如果数据库的数据文件结构组织不合理,可能导致数据无法完全恢复。

为了防止数据文件损坏且无法恢复,通常有三种策略来组织数据:
在这里插入图片描述

  1. 第一种策略是最基本的方法,即通过配置数据同步备份来保证数据的可恢复性。即使数据文件损坏,也可以通过数据备份来进行恢复。实际上,MongoDB在不开启操作日志的情况下,通过配置 Replica Sets 就是采用了这种策略。

  2. 另一种策略是在前面的基础上增加一个操作日志,每次操作都会记录操作的行为。通过操作日志,我们可以进行数据恢复。由于操作日志是按顺序追加的方式写入的,因此不会发生操作日志也无法恢复数据的情况。这也类似于MongoDB开启了操作日志的情况。

  3. 更加安全的做法是数据库不直接修改旧数据,而是以追加的方式进行写操作。这样数据本身就是一种日志,从而永远不会出现无法恢复数据的情况。实际上,CouchDB就是这种做法的一个优秀例子。

Redis提供了RDB持久化和AOF持久化

Redis有两种持久化策略:RDB快照和AOF日志。

  • RDB快照:Redis可以将当前数据生成一个数据文件作为持久化机制。为了生成快照,Redis使用了fork命令的copy on write机制。生成快照时,Redis会fork出一个子进程,并在子进程中循环遍历所有数据,然后将数据写入RDB文件。

  • AOF日志:AOF日志的全称是Append Only File,它是一个追加写入的日志文件。与一般数据库不同,AOF文件是一个可识别的纯文本文件,其中包含了一系列的Redis标准命令。通过启用AOF功能,Redis会将每个写操作都追加到AOF文件末尾,从而记录了数据库的完整操作历史。

RDB机制的优势和用法

RDB持久化是指将内存中的数据集以快照的方式写入磁盘,它是Redis的默认持久化方式。持久化文件的默认名称是"dump.rdb"。

在RDB机制中,可以通过配置来设置自动执行快照持久化的方式。我们可以配置Redis,在一定的时间间隔内,当有一定数量的键被修改时,自动执行快照持久化。以下是默认的快照保存配置示例:

   save 900 1     # 在900秒内,如果有1个或更多键被修改,则执行快照保存
   save 300 10    # 在300秒内,如果有10个或更多键被修改,则执行快照保存
   save 60 10000  # 在60秒内,如果有10000个或更多键被修改,则执行快照保存

RDB机制的优势

  • 性能:RDB持久化采用了快照的方式,将整个数据集写入磁盘。相比于AOF(Append-Only File)持久化方式,RDB在恢复数据时的速度更快,因为只需加载一次文件即可

  • 占用空间较小:RDB持久化生成的快照文件是二进制文件,相比于AOF持久化生成的文本文件,占用的空间更小

  • 简单和灵活:RDB机制配置简单,适用于定期备份数据或将数据迁移到其他环境

RDB持久化的略施

  1. 配置合理的保存策略:根据实际需求,可以调整保存策略的时间间隔和键的修改数量,以平衡数据可靠性和性能效率。

  2. 定期监测和验证RDB文件的完整性:定期检查RDB文件是否完整,以确保在恢复数据时不会出现问题。

  3. 定期备份RDB文件:为了防止意外情况下的数据丢失,定期将RDB文件备份到其他位置。

RDB文件保存过程

在这里插入图片描述

  1. Redis调用fork命令后,会生成一个子进程和一个父进程。

  2. 父进程继续处理客户端请求,而子进程负责将内存中的数据写入临时文件。

由于操作系统的写时复制机制(copy on write),父进程和子进程会共享相同的物理数据页。当父进程要修改数据页时,操作系统会为其创建一个副本,而不是直接写入共享的页面。因此,子进程的地址空间中的数据是fork时刻整个数据库的一个快照

  1. 当子进程将快照写入临时文件完成后,会用临时文件替换原来的快照文件,然后子进程退出

RDB文件保存指令

客户端也可以使用save或者bgsave命令通知Redis执行快照持久化操作。

持久化操作所引发的性能问题

每次快照持久化都会将内存数据完整地写入磁盘,并非增量同步脏数据。如果数据量较大且有大量写操作,将会引发大量的磁盘IO操作,可能严重影响性能。因此,在性能敏感的情况下,需要考虑其他持久化方式或配置适当的快照保存策略,以减少对性能的影响。

注意,save操作是在主线程中执行的,而Redis使用单线程来处理所有客户端请求。这种方式会阻塞所有客户端请求,因此不推荐使用。

优势

  • 方便备份:采用RDB方式后,整个Redis数据库只包含一个文件,非常方便进行备份。例如,可以每天归档一些数据,只需移动一个RDB文件到其他存储介质即可

  • 快速恢复:RDB在恢复大数据集时的速度比AOF恢复速度更快,能够迅速还原数据库状态。

  • 最大化性能:RDB可以最大化Redis的性能。父进程在保存RDB文件时只需fork出一个子进程,然后子进程负责处理接下来的保存工作,父进程无需执行磁盘IO操作,减少了性能开销。

劣势

  • 数据丢失风险:如果需要尽量避免在服务器故障时丢失数据,RDB并不适合。由于RDB文件需要保存整个数据集的状态,保存频率较低,可能导致在故障停机时丢失几分钟的数据。

  • 高耗时:每次保存RDB时,Redis都会fork出一个子进程来进行实际的持久化工作。当数据集较大时,fork操作可能耗时较长,导致服务器在某段时间内停止处理客户端请求。如果数据集非常巨大且CPU资源紧张,这种停止时间甚至可能长达整整一秒。相比之下,AOF重写也需要fork操作,但不论执行间隔长短,数据的耐久性都不会受到任何损失。

AOF文件保存过程

Redis会将每个收到的写命令通过write函数追加到文件中(默认为appendonly.aof)。当Redis重启时,它会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。

./redis-server --appendonly yes

注意,由于操作系统会在内核中缓存write所做的修改,因此并不是立即写入磁盘。

AOF方式的持久化可能会丢失部分修改。但是,我们可以通过配置文件告诉Redis在何时通过fsync函数强制将数据写入磁盘。有三种可选方式如下(默认为每秒fsync一次):

appendonly yes              //启用aof持久化方式
# appendfsync always      //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec     //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
# appendfsync no    //完全依赖os,性能最好,持久化没保证

Redis指令分析介绍

redis 127.0.0.1:6379> set key1 Hello
OK
redis 127.0.0.1:6379> append key1 " World!"
(integer) 12
redis 127.0.0.1:6379> del key1
(integer) 1
redis 127.0.0.1:6379> del non_existing_key
(integer) 0

AOF日志文件效果

$ cat appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
set
$4
key1
$5
Hello
*3
$6
append
$4
key1
$7
 World!
*2
$3
del
$4
key1

AOF的压缩重写机制

AOF方式也带来了另一个问题,即持久化文件的大小逐渐增大。例如,我们调用了100次incr test命令,文件中将保存全部的100条命令,而实际上有99条是多余的。因为为了恢复数据库的状态,只需要保存一条set test 100命令就足够了。

为了压缩AOF持久化文件,Redis提供了bgrewriteaof命令。当收到该命令时,Redis将以与快照相似的方式将内存中的数据以命令的形式保存到临时文件中,最后替换原来的文件。

AOF重写执行流程

在这里插入图片描述1. Redis调用fork创建父子两个进程。
2. 子进程根据内存中的数据库快照,将重建数据库状态所需的命令写入临时文件。
3. 父进程继续处理客户端请求,将写命令写入原始的AOF文件,并将接收到的写命令缓存起来。这样即使子进程的重写操作失败,也不会出现问题。
4. 当子进程将快照内容以命令的方式写入临时文件后,子进程发送信号通知父进程。然后父进程将缓存的写命令也写入临时文件。
5. 现在父进程可以用临时文件替换旧的AOF文件,并将其重命名。之后,后续接收到的写命令将追加到新的AOF文件中。

注意,重写AOF文件的操作并不涉及读取旧的AOF文件,而是通过将整个内存中的数据库内容用命令的方式重写一个新的AOF文件。这一点类似于快照操作

AOF的优势

  • AOF持久化可以让Redis变得非常耐久:可以设置不同的fsync策略来控制写入频率,保证数据的持久性。默认的每秒fsync一次的策略可以保持良好的性能,即使发生故障停机,最多只会丢失一秒钟的数据。

  • AOF文件是一个只进行追加操作的日志文件,不需要进行seek操作,即使AOF文件中包含未完整写入的命令,使用redis-check-aof工具可以轻松修复。

  • Redis可以在AOF文件体积过大时,在后台自动进行AOF重写,生成包含恢复当前数据集所需的最小命令集合的新AOF文件。重写操作是安全的,在创建新AOF文件的过程中,仍然会将命令追加到旧的AOF文件中,即使重写过程中发生停机,旧的AOF文件也不会丢失。

  • AOF文件有序地保存了所有写入操作,格式简单易懂,方便人工阅读和文件分析。导出AOF文件也很简单,例如当执行了FLUSHALL命令后,只要AOF文件未被重写,可以通过去除AOF文件末尾的FLUSHALL命令,然后重新启动Redis来恢复数据集到执行FLUSHALL之前的状态。

AOF的劣势

  • 对于相同的数据集来说,AOF文件通常比RDB文件更大。

  • 根据所使用的fsync策略,AOF的速度可能比RDB慢。一般情况下,每秒fsync的性能依然非常高,而关闭fsync可以让AOF的速度和RDB一样快,即使在高负载下也是如此。然而,处理大量的写入负载时,RDB可以提供更可靠的最大延迟时间。

  • AOF在过去曾遇到过一些bug,特定命令导致AOF文件在重新载入时无法恢复数据集到原始状态。虽然这种bug较为罕见,但与RDB相比,几乎不会出现这种情况。测试套件已经添加了针对这种情况的检测,通过重新载入随机、复杂的数据集来确保恢复正常。

扩展讨论

写操作都会生成相应的命令作为AOF日志,但需要注意的是,最后一个del命令不会被记录在AOF日志中,因为Redis判断该命令不会修改当前数据集,所以无需记录无用的写命令。

此外,AOF日志的生成并不完全按照客户端请求,例如命令INCRBYFLOAT会被记录为一条SET记录,因为浮点数操作在不同系统上可能会有不同结果。为了避免在不同系统上生成不同的数据集,这里只记录操作后的结果通过SET命令来记录。

Redis数据的迁移操作

aof导入方式

如何将源实例的AOF数据文件导入到目标实例中。首先在目标实例上清空数据,然后在源实例上开启AOF功能并生成AOF数据文件。接下来,通过使用--pipe参数和输入重定向符号将AOF数据文件导入到目标实例。最后,关闭源实例的AOF功能。这个过程可以用于在不同的Redis实例之间迁移数据或复制数据。

  1. 清空目标实例数据:通过执行redis-cli命令,连接到目标实例(xxx.xxx.xxx.xxx),并使用密码进行身份验证。然后,使用flushall命令清空目标实例中的所有数据。
[root~]# redis-cli -h xxx.xxx.xxx.xxx -a password flushall
OK
  1. 源实例开启AOF功能:通过执行redis-cli命令,连接到源实例(xxx.xxx.xxx.xxx),并使用密码进行身份验证。然后,使用config set appendonly yes命令将AOF功能设置为开启状态。
[root~]# redis-cli -h xxx.xxx.xxx.xxx -a password config set appendonly yes
  1. 生成AOF文件:开启AOF功能后,Redis会将所有写入操作追加到AOF文件(名为appendonly.aof)中。该文件会存储源实例的数据变更操作。

  2. 导入AOF数据到目标实例:假设appendonly.aof文件与当前路径相同。使用redis-cli命令,连接到目标实例(xxx.xxx.xxx.xxx),并使用密码进行身份验证。然后,使用--pipe参数和输入重定向(<)符号将appendonly.aof文件的内容导入到目标实例。

[root ~]# redis-cli -h xxx.xxx.xxx.xxx -a password --pipe < appendonly.aof
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 5
  1. 检查导入结果:在导入期间,redis-cli将显示传输进度。当最后一个回复接收到时,显示发送错误数量和回复数量。如果没有错误并且回复数量正确,那么导入操作成功。

  2. 关闭源实例的AOF功能:通过执行redis-cli命令,连接到源实例(xxx.xxx.xxx.xxx),并使用密码进行身份验证。然后,使用config set appendonly no命令将AOF功能设置为关闭状态。

[root~]# redis-cli -h xxx.xxx.xxx.xxx -a password config set appendonly no
OK

RDB文件迁移

  1. 复制当前Redis的RDB文件:将要迁移的Redis的RDB文件名设置为与当前Redis的RDB文件名相同(在本例中,要迁移的Redis的文件名为/var/rdb/dump6380.rdb),确保在继续操作之前,杀掉当前Redis进程,并关闭要迁移的服务器的AOF功能(如果未关闭AOF功能,默认使用AOF文件来恢复数据)。

  2. 启动Redis实例6380:启动Redis实例6380后,您会注意到6380中多了数据。这个数据就是从6379固化到RDB文件中的数据。

redis-dump方式

redis-dump是一个用于导出Redis数据的工具。它可以帮助你将Redis数据库中的数据导出为文本文件,以便进行备份、迁移或分析。以下是redis-dump工具的使用步骤:

  1. 安装redis-dump工具:你可以使用npm包管理器全局安装redis-dump,运行如下命令:

    npm install -g redis-dump
    
  2. 运行redis-dump命令:运行下面的命令导出Redis数据库中的数据:

    redis-dump -u <redis服务器地址> -p <redis服务器端口> -o <输出文件路径>
    

    替换 <redis服务器地址><redis服务器端口><输出文件路径> 分别为你的Redis服务器的地址、端口和导出数据的输出文件路径。

    例如,如果Redis服务器的地址是 127.0.0.1,端口是 6379,输出文件路径是 /path/to/output.txt,则命令如下:

    redis-dump -u 127.0.0.1 -p 6379 -o /path/to/output.txt
    
  3. 导入导出的数据:得到导出的数据文件后,你可以使用Redis的redis-cli命令行工具,通过RESTORE命令将数据导入到另一个Redis实例中。例如:

    cat /path/to/output.txt | redis-cli -h <目标redis地址> -p <目标redis端口> --pipe
    

    替换 <目标redis地址><目标redis端口> 为你要导入数据的Redis实例的地址和端口。

这样就完成了使用redis-dump工具导出和导入Redis数据的操作。请确保你已经在操作前备份好数据,以免误操作导致数据丢失。

redis-load导入

[root ~]# cat xxx.xxx.xxx.xx.txt | redis-load -u :password@xxx.xxx.xxx.xxx:6379

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法空间复杂度详解

如果您觉得文章不错&#xff0c;期待你的一键三连哦&#xff0c;你的鼓励是我创作的动力之源&#xff0c;让我们一起加油&#xff0c;一起奔跑&#xff0c;让我们顶峰相见&#xff01;&#xff01;&#xff01; 前言 避免在处理大规模问题时出现效率低下&#xff0c;耗费较多…

STM32 Flash学习(一)

STM32 FLASH简介 不同型号的STM32&#xff0c;其Flash容量也不同。 MiniSTM32开发板选择的STM32F103RCT6的FLASH容量为256K字节&#xff0c;属于大容量产品。 STM32的闪存模块由&#xff1a;主存储器、信息块和闪存存储器接口寄存器等3部分组成。 主存储器&#xff0c;该部分…

服务器被爬虫恶意攻击怎么办?

在有预算的情况可以采购第三方服务防火墙&#xff0c;没钱就使用开源的WAF进行防护。 # WAF防火墙的基本防护原理 WAF&#xff08;Web 应用防火墙&#xff09;可以使用多种技术来防止恶意爬虫攻击&#xff0c;例如&#xff1a; 1. 黑名单&#xff1a;WAF 可以使用黑名单技术来…

会点C++还需要再学Python吗?

提到的C、数据结构与算法、操作系统、计算机网络和数据库技术等确实是计算机科学中非常重要的基础知识领域&#xff0c;对于软件开发和计算机工程师来说&#xff0c;它们是必备的核心知识。掌握这些知识对于开发高性能、可靠和安全的应用程序非常重要。Python作为一种脚本语言&…

Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台免费搭建

Java版知识付费-轻松拥有知识付费平台 多种直播形式&#xff0c;全面满足直播场景需求 公开课、小班课、独立直播间等类型&#xff0c;满足讲师个性化直播场景需求&#xff1b;低延迟、双向视频&#xff0c;亲密互动&#xff0c;无论是互动、答疑&#xff0c;还是打赏、带货、…

【C++初阶】介绍stack_queue及OJ题

介绍stack_queue及OJ题 前言一、简单了解1、stack2、queue 二、OJ题&#xff08;前三个栈&#xff0c;第四、五个队列&#xff09;1、最小栈&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;解题思路&#xff08;3&#xff09;解题代码 2、栈的压入、弹出序列&…

【C#】并行编程实战:异步流

本来这章该讲的是 ASP .NET Core 中的 IIS 和 Kestrel &#xff0c;但是我看了下这个是给服务器用的。而我只是个 Unity 客户端程序&#xff0c;对于服务器的了解趋近于零。 鉴于我对服务器知识和需求的匮乏&#xff0c;这里就不讲原书&#xff08;大部分&#xff09;内容了。本…

基于RPA的自动化流程治理方案探索及应用实践

编者荐语&#xff1a; 随着企业数字化转型进程加快&#xff0c;信息系统大量上线&#xff0c;但流程运营管理问题逐渐显现出来。为提升企业流程运营能力&#xff0c;亚信科技联合某省运营商推出智能化流程治理运营模式&#xff0c;尝试基于RPA&#xff08;机器人流程自动化&am…

IRIS搭建docker

之前把web实现了docker&#xff0c;开发或测试环境可能需要开发自己搭数据库&#xff0c;为了方便使用&#xff0c;把数据库也做一个docker。 由于原生的CentOS我还有改yum仓库&#xff0c;所以这次从之前lis搞的改好yum的镜像开始&#xff08;从改好yum的lisnew的镜像创建lis…

SaaS到底是什么,如何做?这份笔记讲明白了

阅读本篇文章&#xff0c;您将可以了解&#xff1a;1、什么是SaaS&#xff1b;2、SaaS的商业模式&#xff1b;3、SaaS的技术架构&#xff1b;4、国内比较好的SaaS平台。 一、什么是SaaS SaaS即软件即服务&#xff08;Software as a Service&#xff09;&#xff0c;是一种通过…

【数据结构】AVL树/红黑树

目录 1.AVL树&#xff08;高度平衡二叉搜索树&#xff09; 10.1.基本概念 10.2.实现 10.2.1.AVL树节点的定义 10.2.2.AVL树的插入 10.2.3.AVL树的旋转 1.新节点插入较高左子树的左侧---左左&#xff1a;右单旋 2.新节点插入较高右子树的右侧---右右&#xff1a;左单旋 3.新节点…

Python Flask构建微信小程序订餐系统 (十二)

🔥 创建切换商品分类状态的JS文件 🔥 ; var food_act_ops={init:function(){this.eventBind();},eventBind:function(){//表示作用域var that = this;$(".wrap_search select[name=status]").change(function(){$(".wrap_search").submit();});$(&qu…

对ai绘画二次元生成器你有多少了解?

在一个小镇上&#xff0c;有一位年轻的艺术家名叫艾米莉。她是个富有创意的女孩&#xff0c;总是追求着新奇和美妙的艺术体验。然而&#xff0c;她最近遇到了一些创作上的障碍&#xff0c;感觉自己的绘画已经陷入了瓶颈。在艾米莉寻找灵感的过程中&#xff0c;她听说了神秘的ai…

SQL语句(三十二)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、SQL语句类型 二、数据库操作 ​三、数据表操作 1. 数据类型 2. 查看 3. 创建 4. 删除 5. 更改 5.1 表 5.2 列 四、数据操作 4.1 增 4.2 删 4.3 改 4.4 查…

13.5.4 【Linux】常用模块简介

登陆所需要的PAM流程&#xff1a; 上面这个表格当中使用到非常多的 PAM 模块&#xff0c;每个模块的功能都不太相同&#xff0c;详细的模块情报可以在你的系统中找到&#xff1a; /etc/pam.d/*&#xff1a;每个程序个别的 PAM 配置文件&#xff1b; /lib64/security/*&#x…

网络:HCIA 1

1. 通信系统的组成&#xff1a; 终端设备&#xff1a;电脑 中间设备&#xff1a;交换机、路由器、防火墙。 传输介质&#xff1a;网线&#xff08;双绞线&#xff09;传输距离一般为100米&#xff0c;传输的是电信号。 光纤传输的是光信号。 光纤接口类型&#xff0c;方形接口…

前端(九)——探索微信小程序、Vue、React和Uniapp生命周期

&#x1f642;博主&#xff1a;小猫娃来啦 &#x1f642;文章核心&#xff1a;探索微信小程序、Vue、React和Uniapp生命周期 文章目录 微信小程序、Vue、React和Uniapp的基本定义和应用领域微信小程序生命周期生命周期概述页面生命周期应用生命周期组件和API的生命周期钩子 Vu…

看完这篇,别再说不会Spring 分库分表了

多数据源&#xff0c;读写分离&#xff0c;分库分表&#xff0c;基本上已经是现在任何一个项目的基本配置了&#xff0c;在之前的文章Spring多数据源实现https://blog.csdn.net/wangerrong/article/details/131910740 里讲了多数据源的实现&#xff0c;其实已经包含了读写分离…

广东省《5A物理抗菌纺织品》团体标准颁布

近日&#xff0c;经广东省标准化协会批准发布由广东人仁康科技有限公司主导制定的《5A物理抗菌纺织品》&#xff08;T/GDBX 073—2023&#xff09;团体标准&#xff0c;于2023年7月21日发布并实施。 根据标准制修订工作流程&#xff0c;该项标准2022年由人仁康和广检集团组织起…

【【51单片机AD/DA的分析】】

51单片机AD/DA的分析 看似单片机实验&#xff0c;其实是要学好数电 模数转换 与 数模转换 运算放大器 DA的转换就是利用运算放大器实现的 输出电压v0-(D7~D0)/256 x (VrefxRfb)/R D7~D0 就是我们控制的按键看输入多少 然后再划分256份 Vref是我们设置的一个基准电压 PWM 这种…