# Redis 入门到精通(五)-- redis 持久化(2)

Redis 入门到精通(五)-- redis 持久化(2)

一、redis 持久化–save 配置与工作原理

1、RDB 启动方式:反复执行保存指令,忘记了怎么办?不知道数据产生了多少变化,何时保存?

采用 redis 自动执行。

  • 谁:redis服务器发起指令(基于条件)。
  • 什么时间:满足条件。
  • 干什么事情:保存数据。

2、RDB 启动方式 ——save 配置

  • 1)配置: save second changes

  • 2)作用:满足限定时间范围内key的变化数量达到指定数量即进行持久化。

  • 3)参数:

    second:监控时间范围。
    changes:监控key的变化量。

  • 4)位置:在 conf 文件中进行配置。

  • 5)范例:

    save 900 1
    save 300 10
    save 60 10000

3、修改 /conf/redis-6379.conf 配置文件,添加 redis 自动执行 save 指令相关配置。指定配置文件,启动 redis 服务,


# 切换到 redis 安装目录 
cd /usr/local/redis/redis-4.0.0/

# 查看 redis 服务是否后台启动成功:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ps -ef | grep redis-
root     24153     1  0 01:03 ?        00:00:21 redis-server *:6379
root     24402  1538  0 08:41 pts/3    00:00:00 grep --color=auto redis-
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 

# 杀死 redis 服务进程 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# kill -s 9 24153
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ps -ef | grep redis-
root     24404  1538  0 08:42 pts/3    00:00:00 grep --color=auto redis-
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 

# 修改 conf/redis-6379.conf 配置文件,添加 redis 自动执行 save 指令相关配置。
vim conf/redis-6379.conf 

# 添加如下配置(每102个变化就自动保存):
save 10 2

# 删除 data 目录下的其他 dump.rdb 文件 
rm -rf data/dump*

# 指定配置文件,启动 redis 服务:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-server conf/redis-6379.conf


# 客户端执行 save 后,再次查看 dump-6379.rdb 文件内容:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data

root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# cat data/dump-6379.rdb 
REDIs0008dis-ver4.0.0edis-bitsctimefed-memf-preamblerepl-id(3807de8be5a58a80693a6a91fb91d33a68ce217ap1-offsetlname
redis-6379age 0;root@WIN-20240529B1A: /usr/local/redis/redis-4.0.0root@wIN-20240529BJA:/usr/1ocal/redis/redis-4.0.0#

# 当客户端 创建1个数据时,查询 data 下,只有日志文件。
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 20
drwxr-xr-x 2 root root 4096 Jul 16 08:43 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 6899 Jul 16 08:45 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 

# 当客户端 创建2个数据时,再次查询data 下,多了一个 dump-6379.rdb 文件。
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 24
drwxr-xr-x 2 root root 4096 Jul 16 08:51 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 7224 Jul 16 08:51 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root  186 Jul 16 08:51 dump-6379.rdb
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 

# 执行2次get,数据无变化,也不会自动保存
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 24
drwxr-xr-x 2 root root 4096 Jul 16 08:51 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 7224 Jul 16 08:51 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root  186 Jul 16 08:51 dump-6379.rdb
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 

# 执行2次 get,数据无变化,也不会自动保存
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 24
drwxr-xr-x 2 root root 4096 Jul 16 08:51 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 7224 Jul 16 08:51 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root  186 Jul 16 08:51 dump-6379.rdb

# 执行2次 del 和 set,数据有变化,自动保存
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 24
drwxr-xr-x 2 root root 4096 Jul 16 09:01 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 7549 Jul 16 09:01 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root  169 Jul 16 09:01 dump-6379.rdb
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 

4、打开另一终端,连接 redis 客户端,创建的数据,测试是否自动保存。


# 启动另一客户端:

# 切换到 redis 安装目录 
cd /usr/local/redis/redis-4.0.0/

# 指定端口号,启动 redis 客户端:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-cli -p 6379

# 查看所有 key 
127.0.0.1:6379> keys *

# 创建一个数据,查看服务端,不会自动保存
127.0.0.1:6379> set name redis-6379
OK

# 创建第2个数据,查看服务端,已经自动保存
127.0.0.1:6379> set age 38
OK 

# 执行2次 get,数据无变化,也不会自动保存
127.0.0.1:6379> get name
"redis-6379"
127.0.0.1:6379> get age
"38"

# 执行2次 del 和 set,数据有变化,自动保存
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> set age 33
OK
127.0.0.1:6379> 

在这里插入图片描述

5、RDB启动方式 ——save 配置原理

38-RDB启动方式save配置原理.png

6、注意事项:

  • save 配置要根据实际业务情况进行设置,频度过高或过低都会出现性能问题,结果可能是灾难性的。
  • save 配置中对于 second 与 changes 设置通常具有互补对应关系,尽量不要设置成包含性关系。
  • save 配置启动后执行的是 bgsave 操作。

二、redis 持久化–RDB 三种启动方式对比与优缺点分析

1、RDB 三种启动方式对比

方式save指令bgsave指令
读写同步异步
阻塞客户端指令
额外内存消耗
启动新进程

2、rdb 特殊启动形式

  • 全量复制: 在主从复制中详细讲解。
  • 服务器运行过程中重启: debug reload。
  • 关闭服务器时指定保存数据:shutdown save。

默认情况下执行shutdown命令时,自动执行 bgsave(如果没有开启AOF持久化功能)。

3、RDB 优点:

  • RDB 是一个紧凑压缩的二进制文件,存储效率较高。
  • RDB 内部存储的是 redis 在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景。
  • RDB 恢复数据的速度要比 AOF 快很多。
  • 应用:服务器中每X小时执行 bgsave 备份,并将 RDB 文件拷贝到远程机器中,用于灾难恢复。

4、RDB 缺点:

  • RDB 方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据。
  • bgsave 指令每次运行要执行fork操作创建子进程,要牺牲掉一些性能。
  • Redis 的众多版本中未进行RDB文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象。

三、redis 持久化–AOF 简介

1、RDB 存储的弊端

 存储数据量较大,效率较低,基于快照思想,每次读写都是全部数据,当数据量巨大时,效率非常低。
 大数据量下的IO性能较低。
 基于fork创建子进程,内存产生额外消耗。
 宕机带来的数据丢失风险。

2、解决思路

 不写全数据,仅记录部分数据。
 降低区分数据是否改变的难度,改记录数据为记录操作过程。
 对所有操作均进行记录,排除丢失数据的风险。

3、AOF概念

 AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令
达到恢复数据的目的。与RDB相比可以简单描述为改记录数据为记录数据产生的过程。

 AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。

四、redis 持久化–AOF 持久化策略基本操作

1、AOF 写数据过程

40-AOF写数据过程.png

2、AOF 写数据三种策略 (appendfsync)

  • always(每次)
    每次写入操作均同步到AOF文件中,数据零误差,性能较低,不建议使用。
  • everysec(每秒)
    每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高,性能较高,建议使用,也是默认配置。
    在系统突然宕机的情况下丢失1秒内的数据。
  • no(系统控制)
    由操作系统控制每次同步到AOF文件的周期,整体过程不可控。

3、AOF 功能开启


- 配置:
	appendonly yes|no

- 作用:
	是否开启AOF持久化功能,默认为不开启状态。
	
- 配置
	appendfsync always|everysec|no
	
- 作用:
	AOF 写数据策略。
	
- 配置
	appendfilename filename。
	
- 作用
	AOF持久化文件名,默认文件名未appendonly.aof,建议配置为 appendonly-端口号.aof。
	
- 配置
	dir 
	
- 作用
	AOF持久化文件保存路径,与RDB持久化文件保持一致即可。	

4、修改 /conf/redis-6379.conf 配置文件,添加 AOF持久化策略。指定配置文件,启动 redis 服务,


# 切换到 redis 安装目录 
cd /usr/local/redis/redis-4.0.0/

# 查看 redis 服务是否后台启动成功:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ps -ef | grep redis-
root     24408     1  0 08:45 ?        00:00:04 redis-server *:6379
root     24426  1538  0 10:16 pts/3    00:00:00 grep --color=auto redis-

# 杀死 redis 服务进程 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# kill -s 9 24408
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ps -ef | grep redis-
root     24428  1538  0 10:16 pts/3    00:00:00 grep --color=auto redis-

# 修改 conf/redis-6379.conf 配置文件,添加 AOF持久化策略。
vim conf/redis-6379.conf 

# 添加如下配置
appendonly yes
appendfsync always
# appendfsync everysec
# appendfsync no

# 删除 data 目录下的其他 dump.rdb 文件 
rm -rf data/dump*

# 指定配置文件,启动 redis 服务:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-server conf/redis-6379.conf

# 查看 data 文件夹下文件列表,多出一个 appendonly.aof 文件,容量0:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 28
drwxr-xr-x 2 root root 4096 Jul 16 10:21 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 8754 Jul 16 10:21 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root    0 Jul 16 10:21 appendonly.aof
-rw-r--r-- 1 root root  169 Jul 16 09:01 dump-6379.rdb

# 客户端创建数据后,再次查看 data 文件夹下文件列表,appendonly.aof 文件,容量增大:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 32
drwxr-xr-x 2 root root 4096 Jul 16 10:21 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 8754 Jul 16 10:21 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root   63 Jul 16 10:26 appendonly.aof
-rw-r--r-- 1 root root  169 Jul 16 09:01 dump-6379.rdb
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 32
drwxr-xr-x 2 root root 4096 Jul 16 10:40 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 9079 Jul 16 10:40 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root   93 Jul 16 10:40 appendonly.aof
-rw-r--r-- 1 root root  186 Jul 16 10:40 dump-6379.rdb


# 执行2次 get,数据无变化,appendonly.aof 文件大小无变化
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 32
drwxr-xr-x 2 root root 4096 Jul 16 10:40 ./
drwxrwxr-x 8 root root 4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 9079 Jul 16 10:40 6379.log
-rw-r--r-- 1 root root 1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root   93 Jul 16 10:40 appendonly.aof
-rw-r--r-- 1 root root  186 Jul 16 10:40 dump-6379.rdb

# 查看 appendonly.aof 文件内容 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# cat data/appendonly.aof 
*2
$6
SELECT
$1
0
*3
$3
set
$4
name
$10
redis-6379
*3
$3
set
$3
age
$2
38


# 再次修改 conf/redis-6379.conf 配置文件,添加 AOF 持久化策略。重新测试。
vim conf/redis-6379.conf 

# 保存以下内容即可:
port 6379
daemonize yes
logfile "6379.log"

# redis 持久化 -- RDB 相关配置
# data 目录为新建目录(设置存储.rdb文件的路径)
dir /usr/local/redis/redis-4.0.0/data

# 设置本地数据库文件名:
dbfilename dump-6379.rdb
# 设置存储至本地数据库时是否压缩数据
rdbcompression yes
# 设置是否进行 RDB 文件格式校验
rdbchecksum yes

# save配置(每10秒有2次数据变化就自动保存)
save 10 2

# 添加如下配置(AOF存储功能)
# 开启AOF持久化功能
appendonly yes
# AOF写数据策略(每秒)
appendfsync everysec


5、打开另一终端,连接 redis 客户端,创建的数据,测试AOF持久化策略基本操作。


# 启动另一客户端:

# 切换到 redis 安装目录 
cd /usr/local/redis/redis-4.0.0/

# 指定端口号,启动 redis 客户端:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-cli -p 6379

# 查看所有 key 
127.0.0.1:6379> keys *

# 创建一个数据,查看服务端,appendonly.aof 有数据
127.0.0.1:6379> set name redis-6379
OK

# 创建第2个数据,查看服务端,appendonly.aof 文件大小增加了
127.0.0.1:6379> set age 38
OK 

# 执行2次 get,数据无变化,appendonly.aof 文件大小无变化
127.0.0.1:6379> get name
"redis-6379"
127.0.0.1:6379> get age
"38"

# 执行2次 del 和 set,数据有变化,自动保存
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> set age 33
OK
127.0.0.1:6379> 

41-AOF持久化策略基本操作.png

五、redis 持久化–AOF 重写概念与命令执行

1、AOF 写数据遇到的问题

42-AOF写数据遇到的问题.png

2、AOF 重写

随着命令不断写入 AOF,文件会越来越大,为了解决这个问题,Redis 引入了AOF重写机制压缩文件体积。AOF 文件重
写是将 Redis 进程内的数据转化为写命令同步到新AOF文件的过程。简单说就是将对同一个数据的若干个条命令执行结
果转化成最终结果数据对应的指令进行记录。

3、AOF重写作用

  • 降低磁盘占用量,提高磁盘利用率。
  • 提高持久化效率,降低持久化写时间,提高IO性能。
  • 降低数据恢复用时,提高数据恢复效率。

4、AOF 重写规则

  • 进程内已超时的数据不再写入文件
  • 忽略无效指令,重写时使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令。
    如 del key1、 hdel key2、srem key3、set key4 111、set key4 222 等。
  • 对同一数据的多条写命令合并为一条命令、
    如lpush list1 a、lpush list1 b、 lpush list1 c 可以转化为:lpush list1 a b c。 为防止数据量过大造成客户端缓冲区溢出,对list、set、hash、zset等类型,每条指令最多写入64个元素。

5、AOF 重写方式

  • 手动重写:
    bgrewriteaof
  • 自动重写:
    auto-aof-rewrite-min-size size
    auto-aof-rewrite-percentage percentage

6、redis 持久化操作–AOF 重写概念与命令执行

修改 /conf/redis-6379.conf 配置文件,添加 AOF持久化策略。指定配置文件,启动 redis 服务,


# 切换到 redis 安装目录 
cd /usr/local/redis/redis-4.0.0/

# 查看 redis 服务是否后台启动成功:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ps -ef | grep redis-
root     24436     1  0 10:21 ?        00:00:10 redis-server *:6379
root     25004  1538  0 14:14 pts/3    00:00:00 grep --color=auto redis-

# 杀死 redis 服务进程 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# kill -s 9 24436
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ps -ef | grep redis-
root     25006  1538  0 14:15 pts/3    00:00:00 grep --color=auto redis-

# 修改 conf/redis-6379.conf 配置文件,添加 AOF持久化策略。
vim conf/redis-6379.conf 

# 保存以下内容即可:
port 6379
daemonize yes
logfile "6379.log"

# redis 持久化 -- RDB 相关配置
# data 目录为新建目录(设置存储.rdb文件的路径)
dir /usr/local/redis/redis-4.0.0/data

# 设置本地数据库文件名:
dbfilename dump-6379.rdb
# 设置存储至本地数据库时是否压缩数据
rdbcompression yes
# 设置是否进行 RDB 文件格式校验
rdbchecksum yes

# save配置(每10秒有2次数据变化就自动保存)
save 10 2

# 添加如下配置(AOF存储功能)
# 开启AOF持久化功能
appendonly yes
# AOF写数据策略(每次)
appendfsync always
# 设置文件名
appendfilename appendonly-6379.aof


# 删除 data 目录下的其他文件 
rm -rf data/dump*
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# rm -rf data/appendonly.aof

# 指定配置文件,启动 redis 服务:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0#  redis-server conf/redis-6379.conf
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ps -ef | grep redis-    
root     25017     1  1 14:23 ?        00:00:00 redis-server *:6379
root     25022  1538  0 14:23 pts/3    00:00:00 grep --color=auto redis-

# 查看 data 文件夹下文件列表,多出一个 appendonly-6379.aof 文件,容量0:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data             
total 24
drwxr-xr-x 2 root root  4096 Jul 16 14:23 ./
drwxrwxr-x 8 root root  4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 10284 Jul 16 14:23 6379.log
-rw-r--r-- 1 root root  1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root     0 Jul 16 14:23 appendonly-6379.aof

# 客户端创建数据后,再次查看 data 文件夹下文件列表,appendonly.aof 文件,容量增大:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 32
drwxr-xr-x 2 root root  4096 Jul 16 14:30 ./
drwxrwxr-x 8 root root  4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 10609 Jul 16 14:30 6379.log
-rw-r--r-- 1 root root  1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root    95 Jul 16 14:30 appendonly-6379.aof
-rw-r--r-- 1 root root   176 Jul 16 14:30 dump-6379.rdb
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# 
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 32
drwxr-xr-x 2 root root  4096 Jul 16 14:30 ./
drwxrwxr-x 8 root root  4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 10609 Jul 16 14:30 6379.log
-rw-r--r-- 1 root root  1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root   131 Jul 16 14:30 appendonly-6379.aof
-rw-r--r-- 1 root root   176 Jul 16 14:30 dump-6379.rdb

# 客户端执行重写操作后,查看服务端,appendonly-6379.aof 文件大小,发现减小了。
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ll data
total 32
drwxr-xr-x 2 root root  4096 Jul 16 14:32 ./
drwxrwxr-x 8 root root  4096 Jul 15 22:28 ../
-rw-r--r-- 1 root root 11350 Jul 16 14:32 6379.log
-rw-r--r-- 1 root root  1754 Jul 15 23:26 6380.log
-rw-r--r-- 1 root root    59 Jul 16 14:32 appendonly-6379.aof
-rw-r--r-- 1 root root   176 Jul 16 14:30 dump-6379.rdb

7、打开另一终端,连接 redis 客户端,创建的数据,测试AOF持久化策略基本操作。


# 启动另一客户端:

# 切换到 redis 安装目录 
cd /usr/local/redis/redis-4.0.0/

# 指定端口号,启动 redis 客户端:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-cli -p 6379

# 查看所有 key 
127.0.0.1:6379> keys *
(empty list or set)

# 创建一个数据,查看服务端,appendonly-6379.aof 有数据
127.0.0.1:6379> set name redis-1
OK

# 更改name值,查看服务端,appendonly-6379.aof 文件大小增加了
127.0.0.1:6379> set name redis-2
OK 

# 更改name值,查看服务端,appendonly-6379.aof 文件大小增加了
127.0.0.1:6379> set name redis-3

# 执行重写操作,查看服务端,appendonly-6379.aof 文件大小,发现减小了。
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started

43-AOF持久化策略基本操作-重写操作.png

8、AOF手动重写 —— bgrewriteaof指令工作原理

 41-AOF持久化策略基本操作.png

上一节关联链接请点击:
# Redis 入门到精通(五)-- redis 持久化(1)

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

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

相关文章

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【获取密钥属性(ArkTS)】

获取密钥属性(ArkTS) HUKS提供了接口供业务获取指定密钥的相关属性。在获取指定密钥属性前,需要确保已在HUKS中生成或导入持久化存储的密钥。 开发步骤 指定待查询的密钥别名keyAlias,密钥别名最大长度为64字节。调用接口[getKeyItemProperties]&…

Linux下的C++编程(2)——动态库

为什么要使用动态库? 在实际工作工作,常常需要给予其他人自己的库文件,但是,我们只想让其他人使用我们的库文件,而不想让其他人知道我们具体代码,所以就引入了动态库的概念,使用动态库可以让使…

2.10、matlab中字符、数字、矩阵、字符串和元胞合并为字符串并将字符串以不同格式写入读出excel

1、前言 在 MATLAB 中,可以使用不同的数据类型(字符、数字、矩阵、字符串和元胞)合并为字符串,然后将字符串以不同格式写入 Excel 文件。 以下是一个示例代码,展示如何将不同数据类型合并为字符串,并以不…

AQS源码解析(ReentrantLock)

什么是AQS:Juc中的大多数同步器都是围绕着一些相同的基础行为,比如等待队列,条件队列,共享,独占获取变量这些行为,抽象出来就是基于AQS(AbstractQueuedSynchronizer)实现的。所以可以把AQS看成这…

windows qt编译报错 无法打开包括文件: “EGL/egl.h”: No such file or directory

windows mingw32 qt creator QtAV 推荐ffmpeg依赖包 QT5.14.2 如果出现:无法打开包括文件: “EGL/egl.h”: No such file or directory 可能是Qt6的问题.在QT5上安装。 编译步骤: git clone https://github.com/wang-bin/QtAV.git cd QtAV &&…

Mysql-错误处理: Found option without preceding group in config file

1、问题描述 安装MYSQL时,在cmd中“初始化”数据库时,输入命令: mysqld --initialize --consolecmd报错: D:\mysql-5.7.36-winx64\bin>mysql --initialize --console mysql: [ERROR] Found option without preceding group …

Qt基础 | Qt全局定义 | qglobal头文件中的数据类型、函数、宏定义

文章目录 一、数据类型定义二、函数三、宏定义 QtGlobal头文件包含了 Qt 类库的一些全局定义 ,包括基本数据类型、函数和宏,一般的Qt类的头文件都会包含该文件。 详细内容可参考:https://doc.qt.io/qt-5/qtglobal.html 一、数据类型定义 为了…

【扩散模型(五)】IP-Adapter 源码详解3-推理代码

系列文章目录 【扩散模型(一)】中介绍了 Stable Diffusion 可以被理解为重建分支(reconstruction branch)和条件分支(condition branch)【扩散模型(二)】IP-Adapter 从条件分支的视…

花几千上万学习Java,真没必要!(十一)

1、跳转控制语句&#xff1a; 测试代码1&#xff1a; package com.continuetest; public class ControlFlowDemo { // break语句 public void demonstrateBreak() { for (int i 0; i < 10; i) { if (i 5) { break; // 当i等于5时&#xff0c;跳出循环 } System.o…

【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+TensorFlow

一、项目介绍 眼疾识别系统&#xff0c;使用Python作为主要编程语言进行开发&#xff0c;基于深度学习等技术使用TensorFlow搭建ResNet50卷积神经网络算法&#xff0c;通过对眼疾图片4种数据集进行训练&#xff08;‘白内障’, ‘糖尿病性视网膜病变’, ‘青光眼’, ‘正常’&…

项目管理进阶之RACI矩阵

前言 项目管理进阶系列续新篇。 RACI&#xff1f;这个是什么矩阵&#xff0c;有什么用途&#xff1f; 在项目管理过程中&#xff0c;如Team规模超5以上时&#xff0c;则有必要采用科学的管理方式&#xff0c;满足工作需要。否则可能事倍功半。 Q&#xff1a;什么是RACI矩阵 …

SongComposer:让大模型像人类一样具有音乐创作力

人工智能咨询培训老师叶梓 转载标明出处 大模型在翻译、复杂语言环境中的推理等任务中展现出了人类级别的能力。这引发了一个问题&#xff1a;这些模型能否在更具情感、抽象性以及需要专业技能的领域中&#xff0c;如音乐创作&#xff0c;展现出人类的创造力呢&#xff1f;香港…

一招轻松解决猫毛 最值得买的浮毛空气净化器排名

作为一名6年资深铲屎官&#xff0c;我常常被朋友问到关于宠物空气净化器的各种问题。有的人认为这是个神器&#xff0c;而有的人则认为这完全是花钱买智商税。其实我刚开始对购买宠物空气净化器也持怀疑态度&#xff0c;心想这么多钱花下去真的有效吗&#xff1f;但使用后&…

Linux文本工具之-Vim(二)

一、编辑 快捷键功能描述i在当前光标所在位置插入&#xff0c;光标后的文本相应向右移动I在光标所在行的行首插入&#xff0c;行首是该行的第一个非空白字符&#xff0c;相当于光标移动到行首执行 i 命令o在光标所在行的下插入新的一行。光标停在空行首&#xff0c;等待输入文…

王牌站士Ⅶ--理解大型语言模型LLM的参数

模型的大小并不一定决定其成功 在学习任何大型语言模型 (LLM) 时&#xff0c;您首先会听到的事情之一就是给定模型有多少个参数。如果您查看下面的图表&#xff0c;您会注意到参数大小范围很广 - 一个模型可能有 10 亿或 20 亿个参数&#xff0c;也可能有超过 1.75 万亿个参数。…

MongoDB综合实战篇(超容易)

一、题目引入 在MongoDB的gk集合里插入以下数据&#xff1a; 用语句完成如下功能&#xff1a; &#xff08;1&#xff09;查询张三同学的成绩信息 &#xff08;2&#xff09;查询李四同学的语文成绩 &#xff08;3&#xff09;查询没有选化学的同学 &#xff08;4&#xf…

EasyPhoto - 一键训练并生成人像写真,支持参考图生成 独立版 本地一键整合包下载

EasyPhoto最早是作为AI绘画软件StableDiffusion的一款插件备受大家喜爱&#xff0c;今天分享的是 EasyPhoto 的独立版本一键整合包&#xff0c;无需安装StableDiffusion即可解压即用。 和之前分享的腾讯开源的 PhotoMaker 和 阿里开源的 FaceChain 类似&#xff0c;EasyPhoto操…

ArkUI组件——循环控制/List

循环控制 class Item{name: stringprice:number}private items:Array<Item> [new Item("A0",2399),new Item("BE",1999),new Item("Ro",2799)] ForEach(this.items,(item:Item) > {})List组件 列表List是一种复杂的容器&#xff0c;…

C++动态内存的管理

今天来分享C动态内存管理相关知识&#xff0c;闲言勿谈&#xff0c;直接上干货。 1. 动态内存的开辟和销毁(new和delete) (1)前置知识&#xff1a;我们知道c语言有malloc和calloc和realloc三个函数可以进行动态的开辟内存&#xff0c;那么它们有什么区别呢&#xff1f;首先是…

乘积量化pq:将高维向量压缩 97%

向量相似性搜索在处理大规模数据集时&#xff0c;往往面临着内存消耗的挑战。例如&#xff0c;即使是一个包含100万个密集向量的小数据集&#xff0c;其索引也可能需要数GB的内存。随着数据集规模的增长&#xff0c;尤其是高维数据&#xff0c;内存使用量会迅速增加&#xff0c…