05、Redis持久化
Redis是在内存中操作的,我们服器关闭重启机器后,正常是之前在redis中操作的数据都不存在了,但是实际上我们开机后重新启动redis服务,一样可以看到之前操作的数据。这是为什么呢?
我们在redis的安装目录下可以看到有一个dump.rdb,其实这里面就写有之前的数据。
这就相当于Redis其实是把数据持久化保存到了磁盘文件中了,具有了持久化的能力。
Redis其会按照设置以快照或操作日志的形式把数据持久化到磁盘,根据持久化使用的技术不同,Redis的持久化又分为两种:RDB与AOF
一、持久化原理
Redis持久化也称为钝化,把内存中数据库的状态描述信息保存到磁盘当中,只不过不同的持久化技术,对数据的状态描述信息是不同的,生成的持久化文件也是不同的。
钝化可以通过手动的方式或者是自动的方式(全自动或者条件触发后自动),把内存中的数据信息写到持久化文件中,当系统重新启动时,自动加载持久化文件,并根据文件中数据库状态描述信息把数据恢复到内存中,这个恢复的过程也称为激活。
从上面看实际上如果用手动的方式或者是定时方式或者条件触发方式进行钝化都有数据丢失的可能。比如,redis中进行了一些操作,但是还没有及时进行钝化操作这个时候redis宕机了。那么上次保存到宕机期间的数据就会丢失。
对于不同的持久化方式,其数据的丢失率也是不一样的。我们定时执行的频率越高则丢失率越小,但频率过高又会影响性能。
Redis中默认的持久化方式是:RDB,Redis当中也可以让RDB与AOF同时存在,此时系统会使用AOF的方式做持久化。在redis服务启动时,如果它既有RDB的持久化文件又有AOF的持久化文件那么优先加载AOF持久化文件。
二、RDB持久化
RDB,Redis DataBase,是指的把内存中的某一时刻的数据快照全量写入到指定的rdb文件当中。RDB是默认开启的。当Redis启动时会自己动读取RDB快照文件,把数据从硬盘载入内存,以恢复Redis关机前的数据库状态。
持久化的执行
手动save命令
通过在redis-cli客户端中执行save命令即可立即进行一次持久化保存。
save命令在执行期间会阻塞redis-server进程,直到持久化过程完毕。在redis-server进程阻塞期间,Redis不可以处理任何读写请求,无法对外提供服务。
手动bgsave命令
通过在redis-cli客户端中执行bgsave命令可立即进行一次持久化保存。不同于save命令的是,bgsave命令会使用服务器进程redis-server生成一个子进程,由这个子进程负责完成保存过程,这时子进程进行保存过程中不会阻塞redis-server进程对客户端读写请求的处理。
自动触发条件
它本质上还是bgsave命令的执行,只是这个时候不是主动去执行命令,而是在配置文件中做相应的配置,redis会根据设置信息自动调用bgsave命令执行。
查看最近一次持久化时间
通过命令lastsave命令可以查看最近一次执行持久化的时间,其返回的是一个Unix的时间戳。
RDB优化配置
RDB的相关配置在redis.conf文件的SNAPSHOTTING部分。
save
上面那个save配置注释掉也是默认的,默认的save命令其实就等价于下面的三条配置
- save 3600 1 在3600秒内发生1次写操作
- save 300 100 在300秒内发生100次写操作
- save 60 10000 在60秒内发生10000次写操作
在上在三个条件中任意条件满足时会执特自动保存bgsave
注意:它是一个条件逐步放宽的递进判断,先看60秒是否执行10000次,如果没有到10000次则等到5分种的时候看是否达到了100次,达到则保存没有达到再看1小时同有没有发生过一次写操作,有则保存否则不保存。
注意:如果save后的置配置”“ 那么说明一个保存点都没有就不会启用RDB持久化
stop-write-on-bgsave-error
默认情况下,如果RDB快照已启用(至少一个保存点),并且最近的bgsave命令失败,Redis会停止接受写入。这样设置是为了让用户意识到数据没有正确保存到磁盘上,防止发生一些后续灾难性问题,如果后面bgsave命令可以正常工作了,Redis会自己动允许再次写入。
rdbcompression
当进行持久化时启用LZF压缩算法压缩字符串对象,它对性能会有一定的影响但是它可以大幅度地降低文件大小,加速主从节点间的数据同步。
rdbchecksum
从RDB5开始,RDB文件的CRC64检验和就会被放在文件末尾。这可以防止RDB文件的损坏,但是这对于保存与加载RDB文件会大约有10%的性能损耗
dbfilename
指定RDB文件的默认名称,默认值为dump.rdb
rdb-del-sync-files
主从复制时,是否删除用于同步的从机上的RDB文件,默认是no(不删除)不过注意,只有当从机的RDB和AOF持久化功能都没有开启时才生效
dir
指定RDB与AOF文件的生成目录,默认在Redis的安装根目录
RDB文件结构
dump.rdb文件整体分为五个部分:
SOF
它是一个常量,表示开始,是一个字符串REDIS,仅仅包含这五个字符
rdb_version
这是一个整数,长度是4个字节,用来表示RDB语言件的版本号
databases
它是RDB文件中最重要的数据部分它可以包含任意多个非空数据库。而每个database又是由三部分构成的
- SODB:是一个常理,占1个字节,用于标识一个数据库的开始
- db_number:数据库编号
- key_value_pairs:当前数据库中的键值对数据
关于key_value_parirs又由很多的用于描述键值对的数据构成:
- VALUE_TYPE:一个常量,占1个字节,标识键值对中的value类型
- EXPIRETIME_UNIT:一个常量,占1个字节,用于标识过期时间的单位是秒还是毫秒
- time:当前key-value的过期时间
- key
- value
EOF
它是一个常量,占一个字节,用于表示RDB数据的结束,校验和的开始
check_sum
校验和check_sum用于判断RDB文件中的内容是否出现数据异常,它采用的是CRC校验算法
关于CRC校验算法简单说明:
在持久化时,先把SOF,rdb_version及内存数据库快照这三者的二进制数据拼接起来,形成一个二进制数(假定为a),然后再用这个a除以校验和check_sum,此时可以得到一个余数b,然后再把b拼接到a后面,形成databases。在加载时,需要先使用check_sum对RDB文件进行数据损坏验证。验证的过程是:只需要RDB文件中除EOF与check_sum外的数据除以check_sum。只要除得的余 数不是0,就说明文件发生损坏。
注意:余数是0也不能肯定文件有没有损坏,这种校验只能校验数据是损坏的而不是校验数据没有损坏。
RDB持久化过程
对于Redis默认的RDB持久化,在进行bgsave持久化时,redis-server进程会fork出一个bgsave子进程,这个子进程以异步的方式负责完成持久化,而在持久化的过程中,redis-server进程不会阻塞,其会继续接收并处理用户的请写请求。
bgsave子进程的工作原理:
由于子进程可以继承父进程的所有资源,且父进程不能拒绝子进程的继承权。所以bgsave子进程有权读取到redis-server进程写入到内存中的用户数据,使得把内存数据持久化到dump.rdb成为可能。
bgsave子进程在持久化时首先会把内存中的全量数据copy到磁盘中的一个RDB临时文件,copy结束后,再把这个文件rename为dump.rdb,替换掉原来的同名文件。
在进行持久化过程中,如果redis-server进程接收到了用户写请求,则系统会把内存中发生数据修改的物理块copy出一个副本,等内存中的全量数据copy结束后,会再把这个副本中的数据copy到RDB临时文件。这个副本的生成是由于linux系统的写时复制技术(Copy-On-Write)实现的
关于写时复制技术说明:
它是linux系统的一种进程管理技术。
原来在Unix系统中,当一个主进程fork()出一个子进程后,内核进程会复制出主进程的整个内存空间中的数据,然后分配给到子进程,这种方式存在以下问题:
- 这个过程非常耗时
- 这个过程降低了系统性能
- 如果主进程修改了其内存数据,子进程副本中的数据是没有修改的,数据一致性没有办法保证
现代的Linux使用了更有效的方式:写时复制。子进制会继承父进程的所有资源其中就包含了主进程的内存空间。也就是子进程与父进程共享内存。只要是内存被共享,那么内存就是只读的(有写保护)。而写时复制则是在任何一方需要写入数据到共享内存时都会出现异常,此时内核进程就会把需要写入的数据copy出一个副本写入到另一块非共享内存区域。
三、AOF持久化
AOF,Append Only File,是指Redis把每一次的写操作都以日志的形式记录到一个AOF文件中的持久化技术,当需要恢复内存数据时,把这些写操作重新执行一次,便会恢复到之前的内存数据状态。
前面我们说的RDB的持久化是可能会有数据丢失的问题,在生产上如果丢失数据可能会丢失近30s的数据,这在高并发的场景下还是比较麻烦的,而对于现在我们说的AOF持久化,我们只要配置合适则我们只会丢失最后一秒或者说最后一次的写操作数据。
AOF的安全性相对于RDB更好一些。
基础配置
开启AOF
配置文件中修改参数:appendonly yes
默认的情况下它的配置值是no,表示不开启的,当把它改为yes后则表示开启AOF
查看当前appendonly的参数配置,使用命令:config get appendonly
修改appendonly的参数值命令:config set appendonly yes
执行完上面这个命令后则在缓存中修改了配置,需要进行rewrite一下,命令:config rewrite
文件名配置
Redis 7在文件配置这块有了比较大的变化,之前的版本中aof只有一个文件appendonly.aof,现在有三类多个文件:
- 基本文件:可以是RDB格式也可以是AOF格式。其存放的内容是由RDB转为AOF当时内存的快照数据,这个文件可以有多个
- 增量文件:以操作日志形式记录转为AOF后的写入操作,这个文件可以有多个
- 清单文件:用于维护AOF文件的创建顺序,保证在激活时的应用顺序,这个文件只有一个
appendfilename参数配置:"appendonly.aof"
因为有多类,所以这里这个配置是多类文件的前缀。如下所示:
基础文件:appendonly.aof.1.base.rdb (有可能存在多个,所以这里有序号)
增量文件:appendonly.aof.1.incr.aof,appendonly.aof.2.incr.aof(随着写入的命令增加这里会有多个文件)
清单文件:appendonly.aof.manifest (这个文件只有一个)
混合式持久化开启
对于基本文件可以是RDB格式也可以使用AOF格式,通过aof-use-rdb-preamble属性可以选择,其默认值 为yes,也就是说默认AOF持久化基本文件为rdb格式文件,也就默认采用混合式持久化。
AOF文件目录配置
为了方便管理 ,可以专门为AOF持久化文件指定存放目录,目录名由appenddirname属性指定,这个目录存放在redis.conf配置文件dir属性指定的目录,默认就是Redis的安装目录。
AOF文件格式
AOF文件有三类:基本文件、增量文件与清单文件,其中基本文件一般是rdb格式,下面我们看一下增量文件与清单文件的内容格式。
在介绍AOF文件格式前我们先看看Redis的协议
增量文件的扩展名为.aof,使用的是AOF格式。AOF格式其实就是Redis通讯协议格式,AOF持久化文件的本质就是基于Redis通讯协议的文本,把命令以纯文本的方式写入到文件中。
Rdedis协议规定,Redis文本是以行划分的,每行以\r\n结束,每一行都有一个消息头,用来表示消息的类型。消息头由六种不同的符号表示,其意义如下:
- + 表示一个正确的状态信息
- - 表示一个错误信息
- * 表示消息体总共有多少行,不包含当前行
- $ 表示下一行消息的长度,不包含\r\n
- 空 表示一个消息数据
- : 表示返回一个数值
AOF文件
我们打开AOF文件其内容如下:
上面这个文件总共有四条命令:
# 第一条命令
*2
$6
SELECT
$1
0
第一条命令说明:
*2表示这个命令包含两个参数
$6表示第一个参数包含6个字符
SELECT这6个字符是第一个参数的值
$1表示第3个参数包含1个字符
0表示第二个参数的值
# 第二条命令
*3
$3
set
$1
a
$10
aaaaaaaaaa
第二条命令说明:
*3表示当前命令包含三个参数
$3表示第一个参数包含3个字符
set表示第一个参数的值
$1表示第二个参数包含1个字符
a表示第二个参数的值
$10表示第三个参数包含10个字符
aaaaaaaaaa表示第三个参数的值
后面的两个命令与处二个命令是类似的不再说明!
清单文件
打开清单文件查看其内容如下:
这个文件首先会按seq列举出所有基本文件,基本文件type类型为b,然后再按序号列举出所有增量文件,增量文件的类型是i。redis在启动时数据恢复也是按这个文件由上到下依次加载它们中的数据的。
Rewrite机制
随着使用时间的推移,AOF文件会越来越大。为了防止AOF文件太大而占用大量的磁盘空间,降低性能。redis引入了Rewrite机制来对AOF文件进行压缩。
什么是Rewrite?
rewrire就是对AOF文件进行重写整理。当Rewrite开启后,主进程redis-server创建出一个子进程bgrewriteaof,由这个子进程来完成rewrite过程。其首先对现有aof文件进行rewrite计算,把计算结果写到一个临时文件,写入完毕后,再rename这个临时文件为原aof文件名,覆盖原有文件。
Rewrite计算
rewrite计算也称为rewrite策略,rewrite计算遵循以下策略:
- 读操作不写入文件
- 无效命令不写入文件
- 过期数据不写入文件
- 多条命令合并写入文件
手动开启Rewrite
客户端执行命令bgrewriteaof
这个命令会使主进程redis-server创建出一个子进程bgrewriteaof,由这个子进程来完成rewrite过程,在rewrite期间,redis-server依然是可以对外提供读写服务的。
自动开启Rewrite
前边的手动开启需要人为执行命令bgrewriteaof。一般来说不会使用手动的方式而是采用自动的方式。由于rewrite过程是一个计算的过程,需要消耗大量的系统资源,所以rewrite过程并不是随时随地任意开启的,而是通过设置一些条件,当满足条件后才会启动。
配置文件中有两个配置:
auto-aof-rewrite-percentage:开启rewrite的增大比例,默认是100%。指定为0,表示禁用自动rewrite
auto-aof-rewrite-min-size:开启rewrite的AOF文件最小值,默认是64M。这个值的作用是防止过小的AOF文件进行rewrite,从而导致性能下降
自动重写AOF文件,当AOF日志文件大小增长到指定的百分比时。Redis主进程redis-server会fork出一个子进程bgwriteaof来完成rewrite过程。
其原理如下:
Redis会记住最新的rewrite后的AOF文件大小作为基本大小,如果从主机启动后就没有发生过重写,那么这个基本大小就是启动时的AOF大小。如果当前AOF文件大于基本大小的配置文件指定的百分比阈值时且当前AOF文件大于配置文件中指定的最小阈值时,会触发自动rewrite
AOF优化配置
appendfsync
当客户端提交写操作命令后,这个命令就会写入到aof_buf中,从aof_buf中的数据持久化到磁盘AOF文件的过程称为数据同步。
什么时候进行同步呢?这个配置就是指定这个同步的策略,其策略有三种:
1、always:立即同步,命令写到aof_buf后立即追加到AOF文件当中,效率低下,安全高
2、no:由操作系统来负责同步,Linux默认同步周期是30秒,效率高
3、everysec:默认策略,每秒种同步一次,这种方案兼顾性能与安全是一种折中的方案
no-appendfsync-on-rewrite
这个属性用来指定,当aof fsync策略设置为always或everysec,当主进程创建的子进程正在进行bgsave或者bgrewriteaof时,主进程是否不做数据同步,如果设置为no表示还是要同步,如果这里配置为yes则表示这个时候不同步。
注意:如果同步的时候存在大量的数据需要同步,会阻塞主进程对外提供服务,有延迟问题。如果这时不同步则会存在更新的数据等待同步,如果丢失数据会导致更多的数据丢失风险。
aof-rewrite-incremental-fsync
当bgrewriteaof在执行过程也是先把rewrite计算的结果写入到aof_rewrite_buf缓存中,然后当缓存中的数据达到一定量后会进行数据同步(把数据写入到临时文件)这个属性用于控制每次写入的数据量不超过4MB,避免单次写入数据过大引起长时间阻塞,默认是yes
aof-load-truncated
在进行aof持久化的过程中可能会出现系统突然宕机的情况,此时写入到AOF文件中的最后一条数据可能不完整,当主机启动后,redis在AOF文件不完整的情况下是否可以启动,这就取决于这个配置
yes:不完整的情况下直接从AOF文件中截断,不影响redis的启动
no:不完整的情况下不可以被截断删除,Redis无法启动
aof-timestamp-enabled
这个属性设置为yes则会开启在AOF文人年中增加时间戳的显示功能,可方便按时间对数据进行恢复。但是这个方式可能与AOF解析器不兼容,所以默认为no,不开启。
AOF持久化过程
持久化过程如下:
-
Redis接收到的写操作并不直接追加到磁盘的AOF文件中,而是把每一条命令按Redis的通讯协议格式暂时存到AOF缓冲区aof_buf
-
根据设置的数据同步策略,当同步条件满足时,把缓冲区中的数据一次性写入到AOF文件,一次性的写入减少磁盘IO次数
-
当磁盘的AOF文件大小达到rewrite条件时,redis-server主进程会fork出一个子进行bgrewriteaof,由这个子进行完成rewrite操作
-
子进程bgrewriteaof首先会对磁盘AOF文件进行rewrite计算,把计算的结果写到一个临时文件,全部写入完毕后,再rename这个临时文件为磁盘的原文件名,覆盖原文件
-
如果在rewrite过程中又有写操作命令追加,那么这些写操作会暂时写入到aof_rewrite_buf缓冲区。等把全部rewrite计算结果写入到临时文件后,会先把aof_rewrite_buf缓冲区中的数据写入临时文件,然后再rename为磁盘文件的名称进行文件覆盖
四、RDB与AOF对比
RDB的优势与不足
优势:文件较小,数据恢复快
不足:数据安全性较差,写时复制会降低性能,RDB文件的可读性差
AOF的优势与不足
优势:数据安全性高,AOF文件可读性强
不足:AOF文件大,写操作会影响性能,数据恢复慢
持久化技术选型
-
官方是推荐使用RDB与AOF的混合持久化的
-
若对数据安全性要求不高,则推荐使用纯RDB持久化方式
-
不推荐使用纯AOF持久化方式
-
如果Redis仅用于缓存,则无需使用任何持久化技术
相关文章:
05、Redis持久化
Redis是在内存中操作的,我们服器关闭重启机器后,正常是之前在redis中操作的数据都不存在了,但是实际上我们开机后重新启动redis服务,一样可以看到之前操作的数据。这是为什么呢? 我们在redis的安装目录下可以看到有一…...
Python爬虫基础——selenium模块进阶(模拟鼠标操作)
主要内容包括:模拟鼠标操作。常用的鼠标操作有单击、双击、右击、长按、拖动、移动等,模拟这些操作需要用到selenium模块中的ActionChains类。该类的基本使用方法是将实例化好的WebDriver对象作参数传到该类中,实例化成一个ActionChains对象&…...
C++ macro: The # operator
C macro: The # operator 1. The # operator2. Stringizing (字符串化)References 1. The # operator The # operator converts a parameter of a function-like macro into a character string literal. #define STR(x) #xAll subsequent invocations of the macro STR woul…...
一学就废|Python基础碎片,文件读写
文件处理是指通过编程接口对文件执行诸如创建、打开、读取、写入和关闭等操作的过程。它涉及管理程序与存储设备上的文件系统之间的数据流,确保数据得到安全高效的处理。 Python 中的文件模式 打开文件时,我们必须指定我们想要的模式,该模式…...
使用MATLAB正则表达式从文本文件中提取数据
使用MATLAB正则表达式从文本文件中提取数据 使用Python正则表达式从文本文件中提取数据的代码请看这篇文章使用正则表达式读取文本数据【Python】-CSDN博客 文本数据格式 需要提取 V 后面的数据, 并绘制出曲线. index 1V 0.000000W 0.000000E_theta 0.000000UINV 0.0…...
Java基于SSM框架的在线视频教育系统小程序【附源码、文档】
博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇dz…...
Git文件夹提交错了,怎么撤销?
最近提交了一些不应该提交的文件夹到git中,现在需要移除它们,现在简单记录一下操作日志: 情况一 文件夹已经被添加到 Git,但未提交 如果文件夹已经被 git add 添加到暂存区中,但尚未提交,你可以使用以下命令将其从暂存区中移除: git rm -r …...
Unity TextMesh Pro入门
概述 TextMesh Pro是Unity提供的一组工具,用于创建2D和3D文本。与Unity的UI文本和Text Mesh系统相比,TextMesh Pro提供了更好的文本格式控制和布局管理功能。 本文介绍了TMP_Text组件和Tmp字体资产(如何创建字体资产和如何解决缺字问题),还有一些高级功…...
大疆C++开发面试题及参考答案
虚函数的作用是什么?虚函数机制是如何实现的?虚表指针在内存中的存放位置在哪里? 虚函数主要用于实现多态性。多态是面向对象编程中的一个重要概念,它允许通过基类指针或引用调用派生类中重写的函数。这样可以在运行时根据对象的实…...
极品飞车6里的赛道简介
极品飞车里有很多赛道,赛道分为前向赛道Forward、后向赛道Backward。前向赛道Forward是从A点到B点;后向赛道Backward是前向赛道的逆过程,即从B点到A点。这里介绍极品飞车6的赛道长度、中英文名称翻译、难度等级。 序号赛道英文名赛道中文名总长(km)急弯难度等级1Alpine Trai…...
Swagger学习⑰——@Link注解
介绍 Link 是 Swagger/OpenAPI 3.0 注解库中的一个注解,用于在 OpenAPI 文档中定义链接(Link)。链接是一种在 API 响应中提供相关操作或资源引用的机制,通常用于描述操作之间的关系或提供额外的操作提示。 Link 注解的作用 Link…...
Cline(原Claude Dev)开源的IDE AI插件,如何搭配OpenRouter实现cursor功能,Cline怎么使用
Cline(原Claude Dev)是一个开源的IDE AI插件,可以使用你的命令行界面和编辑器的人工智能助手。 你可以直接在VS Code编辑器进行安装。如果你使用过Cursor AI IDE的话,可以尝试最新发布的Cline3.1版本。 在OpenRouter上࿰…...
WEB前端-3.1
目录 CSS部分 什么是CSS CSS的书写方式 网页引入CSS的方式 css的颜色、大小、边线 文本和字体样式 CSS选择器 属性选择器 伪类选择器 伪元素选择器 文本样式 display属性 背景样式 精灵图、雪碧图 元素定位 绝对定位 相对定位 浮动定位 浮动 CSS部分 什么是…...
灌区闸门自动化控制系统-精准渠道量测水-灌区现代化建设
项目背景 本项目聚焦于黑龙江某一灌区的现代化改造工程,该灌区覆盖广阔,灌溉面积高达7.5万亩,地域上跨越6个乡镇及涵盖17个村庄。项目核心在于通过全面的信息化建设,强力推动节水灌溉措施的实施,旨在显著提升农业用水的…...
QT中引入OpenCV库总结(qmake方式和cmake方式)
文章目录 前言opencv环境配置一、opencv库获取的两种方式二、qmake和cmake配置2.1、 qmake2.2、cmake2.2.1、引入opencv示例 三、qt与opencv对应关系四、问题 前言 我的软件环境,写在前面 Windows10QT5.12.12VS2017OpenCV4.5.4 opencv环境配置 一、opencv库获取…...
【DAPM杂谈之三】DAPM的初始化流程
本文主要分析DAPM的设计与实现 内核的版本是:linux-5.15.164,下载链接:Linux内核下载 主要讲解有关于DAPM相关的知识,会给出一些例程并分析内核如何去实现的 /**************************************************************…...
消息队列架构、选型、专有名词解释
私人博客传送门 消息队列专有名词解释 | 魔筝炼药师 MQ选型 | 魔筝炼药师 MQ架构 | 魔筝炼药师 MQ顺序消息 | 魔筝炼药师...
Scala语言的计算机基础
Scala语言的计算机基础 Scala是一种现代的编程语言,兼具面向对象和函数式编程的特性,广泛应用于大数据处理、后端开发和分布式系统等领域。本文将围绕Scala语言的基础知识,包括其语法特点、数据结构、函数式编程思想、与Java的关系以及在实际…...
爬虫基础之爬取歌曲宝歌曲批量下载
声明:本案列仅供学习交流使用 任何用于非法用途均与本作者无关 需求分析: 网站:邓紫棋-mp3在线免费下载-歌曲宝-找歌就用歌曲宝-MP3音乐高品质在线免费下载 (gequbao.com) 爬取 歌曲名 歌曲 实现歌手名称下载所有歌曲 本案列所使用的模块 requests (发送…...
书说 MySQL 的悲观锁和乐观锁
什么是乐观锁?什么是悲观锁? 悲观锁: 悲观锁是一种基于悲观态度的控制机制(最坏的程度想,每次并发一定会造成阻塞),用于防止数据冲突。它采取预防性措施,在修改数据之前将其锁定&a…...
Linux WEB漏洞
定义:Linux Web 漏洞是指在基于 Linux 操作系统的 Web 应用程序、Web 服务器软件或者相关的网络服务配置中存在的安全弱点。这些漏洞可能导致攻击者未经授权访问敏感信息、篡改网页内容、执行恶意代码,甚至完全控制服务器。 常见类型及原理 SQL 注入漏…...
AIDD - 人工智能药物设计 -深度学习赋能脂质纳米颗粒设计,实现高效肺部基因递送
Nat. Biotechnol. | 深度学习赋能脂质纳米颗粒设计,实现高效肺部基因递送 今天为大家介绍的是来自美国麻省理工和爱荷华大学卡弗医学院团队的一篇论文。可离子化脂质(ionizable lipids)是脂质纳米颗粒(lipid nanoparticles&#…...
Selenium 进行网页自动化操作的一个示例,绕过一些网站的自动化检测。python编程
初级教程 selenium 教程和视频教程s原理与安装 - 白月黑羽 https://www.byhy.net/auto/selenium/01/#chrome%201 Selenium 自动化环境安装_哔哩哔哩_bilibili Selenium 自动化环境安装是Python Selenium Web自动化 2024版 - 自动化测试 爬虫的第2集视频,该合集共…...
力扣 岛屿数量
从某个点找,不断找相邻位置。 题目 岛屿中被“0”隔开后 ,是每一小块状的“1”,本题在问有多少块。可以用dfs进行搜索,遍历每一个点,把每一个点的上下左右做搜索检测,当检测到就标记为“0”表示已访问过&a…...
【前端动效】HTML + CSS 实现打字机效果
目录 1. 效果展示 2. 思路分析 2.1 难点 2.2 实现思路 3. 代码实现 3.1 html部分 3.2 css部分 3.3 完整代码 4. 总结 1. 效果展示 如图所示,这次带来的是一个有趣的“擦除”效果,也可以叫做打字机效果,其中一段文本从左到右逐渐从…...
期刊(中英),期刊分区,期刊所在数据库(中英),出版商区别和联系
目录 对期刊、分区、数据库、出版商整体了解期刊(中英)期刊分区期刊所在数据库总结 出版商 对期刊、分区、数据库、出版商整体了解 下图是我对这四部分的一个理解,其中期刊根据论文使用语言分为中英两种,期刊分区是用来评判论文质…...
LLM中temperature参数设置为0
LLM中 temperature参数设置为0 当模型的temperature参数设置为0时,通常有以下含义: 解码策略角度 意味着采用贪婪解码(greedy decoding)策略。在每一步生成文本时,模型会选择概率最高的词元,从而使输出具…...
Javase 基础复习 函数式接口 lambda表达式 方法应用
目录 案例1 案例2 1. 函数式接口 (Functional Interface) 特点: 示例: Java 8 引入了几个常用的函数式接口: 2. Lambda 表达式 语法解析: 示例: 3. 方法引用 (Method References) 示例: 4. 方法…...
【39. 组合总和 中等】
题目: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限…...
UE小白学习日记
Level UE中的Level(关卡)和Unity中的Scene(场景)在概念和用途上非常相似,都是用来组织和管理3D环境的基本单位。让我为您详细对比一下: 相似之处: 它们都是游戏世界的容器,可以包含游戏对象、光照、地形等元素都支持场景/关卡的切换和加载都可以用来划分游戏内容,比如不同关…...
补充之前的一篇 MySQL 的索引为什么能加快查询速度
在之前的一篇文章中写了 MySQL 的索引为什么能加快查询速度,结合这两篇文章,相信你会对 MySQL 的索引有更深一步的了解 首先我们要理解一件事,无论什么数据库,它的数据一定都是存储在硬盘中的,而硬盘和内存之间的读…...
GoLand下载安装教程
一、goland环境配置 1.下载地址 https://golang.google.cn/dl/ 2.下载安装 3.添加环境变量 4.测试环境变量 输出Hello,World! 说明环境配置成功 二、goland安装 1.下载安装 https://www.jetbrains.com/go/download/download-thanks.html 2.激活使用 SFXUSA86FM-eyJsaWNlbnNl…...
GAN的应用
5、GAN的应用 GANs是一个强大的生成模型,它可以使用随机向量生成逼真的样本。我们既不需要知道明确的真实数据分布,也不需要任何数学假设。这些优点使得GANs被广泛应用于图像处理、计算机视觉、序列数据等领域。上图是基于GANs的实际应用场景对不同G…...
[石榴翻译] 维吾尔语音识别 + TTS语音合成
API网址 丝路AI平台 获取 Access token 接口地址:https://open.xjguoyu.cn/api/auth/oauth/token,请求方式:GET,POST Access token是调用服务API的凭证,调用服务API之前需要获取 token。每次成功获取 token 以后只有…...
PHP Filesystem:深入解析与实战应用
PHP Filesystem:深入解析与实战应用 引言 PHP作为一种流行的服务器端编程语言,提供了强大的文件系统操作功能。本文将深入探讨PHP的Filesystem函数,这些函数允许开发者访问和操作服务器上的文件系统。无论是进行基本的文件操作,还是实现复杂的文件管理系统,PHP的Filesys…...
仓颉笔记——写一个简易的web服务并用浏览器打开
创建一个web服务端,同时创建一个客户端去读取这个服务端。 也满足浏览器打开web的需求。 直接上代码。 import net.http.* import std.time.* import std.sync.* import std.log.LogLevel// 1. 构建 Server 实例 let server ServerBuilder().addr("127.0.0.1&…...
yolov5+colab跑起来
教程1.先上传网盘再run 教程2.直接上传解压run 本人过程...
Windows下安装最新版的OpenSSL,并解决OpenSSL不是当前版本的问题,或者安装不正确的问题
文章目录 1. 文章引言1.1 需求描述1.2 简单介绍1.3 支持平台1.4 源码地址1.5 组件介绍2. 下载OpenSSL3. 安装OpenSSL5. 查看安装目录6. 解决OpenSSL的错误1. 文章引言 1.1 需求描述 今天接到一需求,解密php加密后的数据,由于php使用 openssl_encrypt的方式加密,java也需要使…...
HTML5 网站模板
HTML5 网站模板 参考 HTML5 Website Templates...
代码随想录算法训练营第三十二天|509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯
目录 509.斐波那契数 动态规划五部曲: 1.确定dp数组(dp table)以及下标的含义 2.确定递推公式 3.dp数组如何初始化 4.确定遍历顺序 5.举例推导dp数组 70.爬楼梯 动态规划五部曲: 1.确定dp数组(dp table)…...
<C++学习>C++ Boost 数学与科学计算教程
C Boost 数学与科学计算教程 Boost 提供了强大的数学与科学计算功能模块,包括常用数学函数、特殊函数、矩阵运算、随机数生成器、统计分析工具等。这些工具覆盖了从基本数学操作到复杂科学计算的广泛场景。 1. Boost.Math 简介 Boost.Math 提供了丰富的数学功能&a…...
Spring Framework 5.3.x源码构建 (jdk-1.8, gradle 7.5.1, idea2024.3)
1、下载jdk安装并配置环境变量(自行百度) https://www.oracle.com/java/technologies/downloads/#java8 2、下载spring-framework源码,切换分支到5.3.x https://github.com/spring-projects/spring-framework.git 备用地址 https://gitco…...
有心力场的两体问题
有心力场中的两体问题是经典力学中的重要研究对象,中心力场问题通常涉及两个相互作用的物体(例如行星与恒星、电子与原子核等)。为了简化分析,问题往往可以转化为一个等效的单体问题。这种方法大大提高了问题的可解性,是解决两体和多体问题的基础步骤之一。将两体问题简化…...
【Pandas】pandas Series rdiv
Pandas2.2 Series Binary operator functions 方法描述Series.add()用于对两个 Series 进行逐元素加法运算Series.sub()用于对两个 Series 进行逐元素减法运算Series.mul()用于对两个 Series 进行逐元素乘法运算Series.div()用于对两个 Series 进行逐元素除法运算Series.true…...
Openstack持久存储-Swift,Cinder,Manila三者之间的区别
总结不易,给个三连吧!!! 补充: 文件共享存储服务Manila 在OpenStack生态系统中,Cinder和Manila分别提供了两种不同类型的存储服务,类似于传统的SAN(存储区域网络)和NAS&…...
单片机(MCU)-简单认识
简介: 内部集成了CPU,RAM,ROM,定时器,中断系统,通讯接口等一系列电脑的常用硬件功能。 单片机的任务是信息采集(依靠传感器),处理(依靠CPU)&…...
Redis常见知识点
1、什么是缓存穿透? 缓存穿透是指查询一定某个key是否存在,每次不存在都查询DB会把DB压垮。 解决方案的话,我们通常都会用布隆过滤器来解决。 布隆过滤器:在查找一个数是否在一个集合中使用的,通过对数组长度取模&a…...
SQL进阶实战技巧:统计相同时刻多地登陆的用户?
目录 0 问题描述 1 数据准备 2 代码实现 3 问题拓展 3.1 查询每个用户登录日期的最大空档期...
【数据库初阶】表的增删改语句
🎉博主首页: 有趣的中国人 🎉专栏首页: 数据库初阶 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 亲爱的小伙伴们,大家好!在这篇文章中,我们将深入浅出地为大家讲解 MySQL…...
水水水水水水
为了拿推广卷,但不想把我原本完整的文章拆成零散的多篇,只能出此下策随便发一篇,认真写的都笔记专栏里 网络技术:数字时代的基础设施 在当今社会,网络技术无疑是推动现代生活和经济发展的核心动力之一。从简单的信息传…...