本文最后更新于 259 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com
Redis的持久化配置
一.Redis持久化概述
Redis持久化:
指的是将内存数据保存到磁盘。Redis给我们提供了两种持久化的功能,分比为RDB和AOF。
RDB持久化:
可以在执行的时间间隔内生成数据集的时间点快照(point-in-time snapshot),新快照会覆盖老快照。
优点:
速度快,适合于用于做备份,主从复制也是基于RDB持久化功能实现的。
缺点:
会有数据丢失。
AOF持久化:
记录服务执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。
AOF文件中的命令全部以Redis协议的格式来保存,新命令会被追加到文件的末尾(append-only log file)。
优点:
可以最大程度保证数据不丢失。其类似于MySQL的binlog日志功能。
缺点:
日志记录量级比较大,持久化时间较长。
二.配置RDB持久化功能
1.手动触发持久化
如下所示的配置文件中,并不会自动进行持久化操作,但我们可以通过"SAVE"命令来手动触发持久化。
[root@redis201.oldboyedu.com ~]# cat /oldboyedu/softwares/redis/conf/redis.conf
daemonize yes
port 6379
logfile "/oldboyedu/logs/redis/redis.log"
dir "/oldboyedu/data/redis"
dbfilename "mydump.rdb"
bind 172.200.1.201 127.0.0.1
requirepass "oldboyedu2021"
# Generated by CONFIG REWRITE
maxmemory 27343750kb
[root@redis201.oldboyedu.com ~]#
(1)当修改数据后,并不会立即发生持久化:
[root@redis201.oldboyedu.com ~]# ll /oldboyedu/data/redis/
总用量 0
[root@redis201.oldboyedu.com ~]#
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -h 172.200.1.201 -p 6379
172.200.1.201:6379> SET name "JasonYin"
OK
172.200.1.201:6379>
172.200.1.201:6379> GET name
"JasonYin"
172.200.1.201:6379>
172.200.1.201:6379> QUIT
[root@redis201.oldboyedu.com ~]#
[root@redis201.oldboyedu.com ~]# ll /oldboyedu/data/redis/
总用量 0
[root@redis201.oldboyedu.com ~]#
(2)但是我们可以通过"SAVE"命令来手动触发持久化:
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 -h 172.200.1.201 -p 6379
172.200.1.201:6379> GET name
"JasonYin"
172.200.1.201:6379>
172.200.1.201:6379> SAVE # 调用该命令后,会记录将内存中的数据同步到磁盘上。
OK
172.200.1.201:6379>
172.200.1.201:6379> QUIT
[root@redis201.oldboyedu.com ~]#
[root@redis201.oldboyedu.com ~]# ll /oldboyedu/data/redis/
总用量 4
-rw-r--r-- 1 root root 97 2月 26 09:59 mydump.rdb
[root@redis201.oldboyedu.com ~]#
[root@redis201.oldboyedu.com ~]# file /oldboyedu/data/redis/mydump.rdb # 很明显,该文件还不是文本类型的文件。
/oldboyedu/data/redis/mydump.rdb: data
[root@redis201.oldboyedu.com ~]#
(3)当然,我们也可以不进入redis-cli命令的交互式字符界面就能进行持久化操作:
[root@redis201.oldboyedu.com ~]# ll /oldboyedu/data/redis/
总用量 4
-rw-r--r-- 1 root root 97 2月 26 09:59 mydump.rdb
[root@redis201.oldboyedu.com ~]#
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 set age 18
OK
[root@redis201.oldboyedu.com ~]#
[root@redis201.oldboyedu.com ~]# redis-cli -a oldboyedu2021 save # 直接进行持久化
OK
[root@redis201.oldboyedu.com ~]#
[root@redis201.oldboyedu.com ~]# ll /oldboyedu/data/redis/ # 注意观察调用命令前后文件的访问时间哟~
总用量 4
-rw-r--r-- 1 root root 104 2月 26 10:04 mydump.rdb
[root@redis201.oldboyedu.com ~]#
2.配置RDB自动持久化相关参数
配置RDB持久化:
[root@redis201.oldboyedu.com ~]# vim /oldboyedu/softwares/redis/conf/redis.conf
[root@redis201.oldboyedu.com ~]#
[root@redis201.oldboyedu.com ~]# tail -6 /oldboyedu/softwares/redis/conf/redis.conf
# RDB持久化配置
dir "/oldboyedu/data/redis"
dbfilename "mydump.rdb"
save 900 1
save 300 10
save 60 10000
[root@redis201.oldboyedu.com ~]#
参数说明:
dir:
指定数据目录的存储路径,尤其是我们将Redis当做数据库用时,需要用到数据的持久化功能。
dbfilename:
指定RDB持久化数据文件的名称。
save 900 1:
900秒(15分钟)内有1个更改就会进行持久化。
save 300 10:
300秒(5分钟)内有10个更改就会进行持久化。
save 60 10000:
60秒(1分钟)内有10000个更改就会进行持久化。
温馨提示:
(1)上述的save参数是用于定义自动持久化的参数,上面我们定义了3种策略,但凡满足其中任意一种策略均能实现自动持久化。
(2)测试可以使用“kill -9”指令杀死redis-server进程,如果使用官方提供的shutdown脚本会在关掉redis实例之前可能会自动进行一次持久化哟~
三.配置AOF持久化功能
如下所示,配置AOF持久化通常只需指定两个参数即可:
[root@redis201.oldboyedu.com ~]# vim /oldboyedu/softwares/redis/conf/redis.conf
[root@redis201.oldboyedu.com ~]#
[root@redis201.oldboyedu.com ~]# tail -3 /oldboyedu/softwares/redis/conf/redis.conf
# 配置AOF持久化
appendonly yes
appendfsync everysec
[root@redis201.oldboyedu.com ~]#
参数说明:
appendonly:
如果其值为"yes",表示开启AOF持久化的功能。
appendfsync:
指定AOF的触发条件,有3个值如下所示:
always:
表示每次操作成功都会记录。 但如果刚刚好Redis内存中操作成功了,正要持久化时突然断电的话,这意味着本次记录可能会丢失,但仅丢失一次的话估计多数情况下是可以容忍的。
everysec:
每秒钟进行持久化功能,理想情况下可能会丢失1秒内的数据。
no:
表示不指定触发AOF机制。
四.持久化相关的面试题
1.Redis持久化方式有哪些?有什么区别?
RDB:
基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于RDB持久化功能。
AOF:
以追加的方式记录Redis操作日志的文件,可以最大程度的保证Redis数据安全,类似于mysql的binlog功能。
2.save和bgsave区别
共同点:
都能实现RDB持久化功能。
不同点:
SAVE:
前台进行持久化,会阻塞redis正常写入,直到持久化完成。
BGSAVE:
后台进行持久化,会开启子线程进行异步的持久化功能,不会阻塞redis正常写入。