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 # 添加如下配置(每10秒2个变化就自动保存):
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 dataroot@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 配置原理
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 写数据过程
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>
五、redis 持久化–AOF 重写概念与命令执行
1、AOF 写数据遇到的问题
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
8、AOF手动重写 —— bgrewriteaof指令工作原理
上一节关联链接请点击:
# Redis 入门到精通(五)-- redis 持久化(1)