redis持久化
RDB
RBD持久化是把当前进程数据生成快照保存到硬盘的过程,处罚RDB持久化过程分为手动触发和自动触发
触发机制
手动触发分为save和bgsava命令
save命令
save会阻塞当前redis服务器,直到RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,不建议使用
bgsave命令
redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束,阻塞只发生在fork阶段,一般时间很短,运行bgsave命令对应的redis日志如下
编写插入数据脚本
[root@db01 ~]# cat redis.sh
#!/bin/bash
for i in {1..10000}
do
redis-cli -h db01 set k_${i} v_${i}
done
[root@db01 ~]# bash redis.sh 执行脚本
保存数据
[root@db01 ~]# redis-cli -h db01
db01:6379> BGSAVE
Background saving started
查看数据文件
[root@db01 ~]# ll /data/redis_cluster/redis_6379/redis_6379.rdb ##执行完bgsave后会自动生成一个数据文件,做到持久化
-rw-r--r-- 1 root root 147891 6月 11 09:46 /data/redis_cluster/redis_6379/redis_6379.rdb
流程说明


RDB的优缺点
优点:
1.RDB是一个紧凑压缩的二进制文件,代表redis在某个时间点上的数据快照,非常适用于备份,全量复制等场景,比如每6个小时执行bgsave备份,并把RBD文件拷贝到远程机器,用于灾难恢复
2.redis加载RDB恢复数据远远快于AOF的方式
缺点:
1.RDB方式数据没办法做到实时持久化/秒级持久化,因为bgsave每次运行都要执行fork操作创建子进程,属于重量级操作,执行频繁成本过高
2.RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式的RDB版本,存在老版本redis不兼容RDB格式的问题
自动触发
1.更改配置文件
[root@db01 ~]# vim /opt/redis_cluser/redis_6379/conf/redis_6379.conf
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 172.16.210.53
### 监听端口
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_cluser/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluser/redis_6379/logs/redis_6379.log
### 设置数据库的数量,默认数据库为0
databases 16
### 指定本地持久化文件的文件名,默认是dump,rdb
##15分钟内,有1个key发生改变,就会执行bgasave命令
save 900 1
#5分钟内,有10个key发生改变,就会执行bgasave命令
save 300 10
#1分钟内,有10000个key发生改变,就会执行bgasave命令
save 60 10000
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /data/redis_cluster/redis_6379
2.重启redis
[root@db01 ~]# redis-cli -h db01 shutdown
[root@db01 ~]# redis-server /opt/redis_cluser/redis_6379/conf/redis_6379.conf
3.再次编写插入脚本并执行
[root@db01 ~]# cat redis.sh
#!/bin/bash
for i in {10000..12000}
do
redis-cli -h db01 set k_${i} v_${i}
done
[root@db01 ~]# bash redis.sh 执行脚本
4.测试
[root@db01 ~]# redis-cli -h db01 shutdown ##关闭redis
[root@db01 ~]# redis-server /opt/redis_cluser/redis_6379/conf/redis_6379.conf ##启动redis
[root@db01 ~]# redis-cli -h db01 ##连接redis
db01:6379> keys *
--
--
11998) "k_5800"
11999) "k_5636"
12000) "k_8435" ##最后正好有12000条key,所以自动持久化保存成功
AOF
开启AOF功能需要设置配置:appedonly yes默认不开启AOF文件名通过appendfilename配置设置,默认文件名是appendonly aof. 保存路径通RDB吃就话方式一致,通过dir配置指定
工作流程

1.所有写入命令会追加到aof buf(缓冲区)中
2.AOF缓冲区根据对于的策略向硬盘做同步操作
3.随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目地
4.当redis服务重启时,可以加载AOF文件进行数据恢复
编辑配置文件
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /data/redis_cluster/redis_6379
#是否打开aof日志功能
appendonly yes
#每一个命令,都立即同步到aof
appendfsync always
#每秒写1次
appendfsync everysec
#写入工作交给操作系统,由操作系统判断缓冲区大小,统一写到aof
appendfsync no
##定义aof的文件名
appendfilename "appendonly.aof"
启动redis
[root@db01 ~]# redis-server /opt/redis_cluser/redis_6379/conf/redis_6379.conf
编写脚本插入一些数据
root@db01 ~]# cat redis.sh
#!/bin/bash
for i in {1..1000}
do
redis-cli -h db01 set k_${i} v_${i}
done
[root@db01 ~]# bash redis.sh
关闭redis
[root@db01 ~]# redis-cli -h db01
db01:6379> SHUTDOWN
查看数据存放目录
[root@db01 ~]# ll /data/redis_cluster/redis_6379/ ##
总用量 52
-rw-r--r-- 1 root root 34809 6月 11 11:33 appendonly.aof ##会生成一个.aof的文件
-rw-r--r-- 1 root root 12868 6月 11 11:36 redis_6379.rdb
回到数据库查看数据是否存在
[root@db01 ~]# redis-cli -h db01
db01:6379> KEYS *
---
---
997) "k_955"
998) "k_139"
999) "k_355"
1000) "k_461"
补充:当rdb文件和aof文件都存在时,会默认存储aof的数据
网友评论