redis持久化

作者: 南南宫问天 | 来源:发表于2020-06-12 11:09 被阅读0次

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

流程说明

image.png image.png

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配置指定

工作流程

image.png

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的数据

相关文章

网友评论

    本文标题:redis持久化

    本文链接:https://www.haomeiwen.com/subject/vvrgtktx.html