跳转至

50. redis数据持久化

#持久化的作用:
    可以有效防止在redis宕机后,缓存失效的问题

1. RDB持久化

1.1 概念

#可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)

#类似虚拟机的快照功能

1.2 优缺点

#优点:
    速度快,适合用作备份,主从复制也是基于RDB持久化功能实现的
#缺点:
    可能会有数据丢失

1.3 开启RDB持久化的参数

#修改配置文件
vim /data/6379/redis.conf

#添加如下参数
dir /data/6379
dbfilename dump.rdb

1.4 自动保存

vim /data/6379/redis.conf

save 900 1
save 300 10
save 60 10000

#配置说明:
    1.900秒内有1个更改
    2.300秒内有10个更改
    3.60秒内有10000个更改
[root@152 redis]# redis-cli shutdown
(error) NOAUTH Authentication required.
[root@152 redis]# redis-cli shutdown -a 123
(error) NOAUTH Authentication required.
[root@152 redis]# redis-cli shutdown -a 123456
(error) NOAUTH Authentication required.

#设置密码后,必须加上密码才能关闭redis
[root@152 redis]# redis-cli -a 123 shutdown
[root@152 redis]# netstat -tunlp |grep 6379

[root@152 redis]# redis-server /data/6379/redis.conf
[root@152 redis]# netstat -tunlp |grep 6379
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      68801/redis-server
tcp        0      0 192.168.178.152:6379    0.0.0.0:*               LISTEN      68801/redis-server

1.5 手动保存

redis-cli
    set num 10
    save
#1.没save时查看是否有rdb文件
[root@152 redis]# cd /data/6379/
[root@152 6379]# ls
redis.conf  redis.log

#2.登录redis客户端(-a与密码之间必须要有空格!!!),手动save
[root@152 6379]# redis-cli -a123456
Unrecognized option or bad number of args for: '-a123456'
[root@152 6379]# redis-cli -a 123456
127.0.0.1:6379> set chupeng 31
OK
127.0.0.1:6379> get chupeng
"31"
127.0.0.1:6379> save
OK
127.0.0.1:6379> quit

#3.再次查看是否有rdb文件,发现已经有了,可以手动保存此文件来达到备份效果
[root@152 6379]# ls
dump.rdb  redis.conf  redis.log

1.6 面试问题

#问:介绍一下redis的持久化功能
    1.RDB是基于时间点的快照,类似于虚拟机的快照,只能恢复到历史的某个时间点,可能有数据丢失

1.7 测试RDB数据持久化

#1.写入数据
redis-cli -a 123
    set a 1
    set b 2
    set c 3
    save
#2.移动rdb文件
mv /data/6379/dump.rdb  /tmp

#3.重启redis
redis-cli shutdown      #不加密码不能关闭吗?(待测试)
redis-server /data/6379/redis.conf

#4.查看数据
redis-cli -a 123
    get a
    get b
    get c 
    keys *

#5.拷贝回rdb文件
mv /tmp/dump.rdb  /data/6379

#6.重启redis
redis-cil -a 123 shutdown
redis-server /data/6379/redis.conf

#7.再次查看数据
redis-cil -a 123
    keys *
#有问题

[root@152 6379]# redis-cli -a 123456
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> set b 2
OK
127.0.0.1:6379> set c 3
OK
127.0.0.1:6379> save
OK
127.0.0.1:6379> quit
[root@152 6379]# ls
dump.rdb  redis.conf  redis.log
[root@152 6379]# mv dump.rdb /tmp
[root@152 6379]# ls
redis.conf  redis.log

#移走rdb文件后,重启redis
[root@152 6379]# redis-cli -a 123456 shutdown
[root@152 6379]# redis-server /data/6379/redis.conf

#问题出现,发现重启后又有了rdb文件。。。为什么?
[root@152 6379]# ls
dump.rdb  redis.conf  redis.log

#而且发现其中也有保存数据。
[root@152 6379]# redis-cli -a 123456
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> get b
"2"
127.0.0.1:6379> get c
"3"
127.0.0.1:6379> quit

2. AOF持久化

2.1 概念

#记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集
#AOF文件中的命令全部以redis协议的格式来保存,新命令会被追加到文件的末尾
相当于mysql的binlog功能

2.2 优缺点

#优点:
    可以最大程度保证数据不丢失
#缺点:
    日志记录量级比较大

2.3 AOF持久化配置

#1.参数说明
appendonly yes          #是否打开aof日志
appendfsync always      #每个命令都立即同步到aof
appendfsync everysec    #每秒写一次(常用)
appendfsync no          #写入工作交给操作系统,由操作系统判断缓冲区大小,同一写到aof

#2.配置文件
vim /data/6379/redis.conf

appendonly yes  
appendfsync everysec

#3.一般来说,要么开启rdb,要么开启aof,基本不会都开启
[root@152 6379]# vim /data/6379/redis.conf
[root@152 6379]# cat /data/6379/redis.conf
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename dump.rdb
bind 192.168.178.152 127.0.0.1
requirepass 123456
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec

[root@152 6379]# 
[root@152 6379]# 
[root@152 6379]# ls
dump.rdb  redis.conf  redis.log
[root@152 6379]# redis-cli -a 123456 shutdown
[root@152 6379]# redis-server /data/6379/redis.conf
[root@152 6379]# ls
appendonly.aof  dump.rdb  redis.conf  redis.log

#发现出现aof文件

2.4 面试题

redis持久化方式有哪些?有什么区别?
    rdb:基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能
    aof:以追加的方式记录redis操作日志的文件。可以最大程度的保证redis数据安全,类似于mysql的binlog

最后更新: 2022-02-20 08:44:07