虚拟化容器,大数据,DBA,中间件,监控。

一文搞明白Redis中两种持久化机制RDB和AOF

11 11月
作者:admin|分类:DBA运维

redis两种持久化类型

1.redis两种持久化操作

redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式,这两种方式可以单独使用其中一种,也可以混合使用

如果不使用持久化,那么当redis重启后,所有的数据会全部消失

redis重启前是有很多key的
在这里插入图片描述

当redis重启后,所有key全部消失
在这里插入图片描述

1.1.RDB方式

RDB方式就类似于快照,当符合一定条件的数据,Redis会自动将内存中的所有数据打一个快照,并存储到磁盘上,主要有两个参数构成,时间和改动,比如在1分钟内如果产生了1000个key,那么就打一个快照,RDB是redis的默认持久化方式

redis启动后会读取RDB快照文件,将数据从硬盘载入到内存,一般情况下1G的快照文件载入到内存的时间大约是20-30s

RDB持久化优缺点:

可以在指定的时间间隔内生成数据集的时间点快照

优点:速度快,适合用作备份,主从复制也是基于RDB持久化功能实现的

缺点:会有数据丢失

RDB持久化原理:

1.当rdb条件满足时,redis会调用系统函数fork(),创建一个子进程进行持久化

2.子进程将数据集写入到一个临时的rdb文件中,当子进程完成对临时rdb文件的写入时,redis用新的rdb文件替换原来旧的rdb文件,并将旧的rdb文件删除

在执行fork的时候操作系统会使用写时复制策略,即函数发送的一刻,父子进程共享同一个内存数据,当父进程要更改其中某片数据时,操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的rdb文件存储的是执行for那一刻的内存数据

Redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的。这使得我们可以通过定时备份RDB文件来实 现Redis数据库备份。RDB文件是经过压缩(可以配置rdbcompression参数以禁用压缩节省CPU占用)的二进制格式,所以占用的空间会小于内存中的数据大小,更加利于传输

除了自动快照,还可以手动发送SAVE或BGSAVE命令让Redis执行快照,两个命令的区别在于,前者是由主进程进行快照操作,会阻塞住其他请求,后者会通过fork子进程进行快照操作。

1.2.AOF方式

AOF会记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集

AOF的特点就是记录服务器运行过程中产生的所有命令,如果有del命令,当aof文件的大小达到限制时,会触发内部的一个压缩命令,将del命令删除以及del之前创建的key一并从文件中删除,当服务器再次启动时,重新执行这些命令来还原数据

AOF文件中的命令全部以redis协议的格式来保存,新命令会被追加到文件的末尾

优点:可以最大程度保证数据不丢失

缺点:日志记录量级比较大

RDB持久化有时候不生效,生成环境中建议使用AOF来做持久化,两者也可以并存

2.redis持久化配置操作

2.1.RDB持久化操作

RDB持久化不是实时保存redis数据的,也是需要一个过程

2.1.1.配置RDB持久化

注意:redis配置文件不能在参数后面加任何注释,否则会不生效

1.配置rdb持久化
[root@redis-1 ~]# vim /data/redis_cluster/redis_6379/conf/redis_6379.conf 
dbfilename redis_6379.rdb				#指定本地持久化文件的文件名,默认dump.rdb
dir /data/redis_cluster/redis_6379/data		#本地数据库的目录,rdb文件路径
save 900 1              //900秒(15分钟)内有1个更改
save 300 100            //300秒(5分钟)内有100个更改
save 60 10000           //60秒(1分钟)内有10000个更改

2.重启redis
[root@redis-1 ~]# redis-cli 
127.0.0.1:6379> shutdown
[root@redis-1 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf

2.1.2.批量创建key并观察rdb文件是否创建

批量创建key
[root@redis-1 ~]# for i in {1..15000}
do
redis-cli set k_${i} v_${i}
echo "k_${i} is ok"


观察rdb文件是否产生
[root@redis-1 ~]# ll /data/redis_cluster/redis_6379/data/redis_6379.rdb 
-rw-r--r--. 1 root root 148006 1月  28 14:39 /data/redis_cluster/redis_6379/data/redis_6379.rdb

2.1.3.关闭redis验证持久化是否生效

1.查看key并关闭redis,关闭redis的时候一定要大于缓存设定的数据,否则会不生效,
[root@redis-1 ~]# redis-cli 
127.0.0.1:6379> DBSIZE
(integer) 15000
127.0.0.1:6379> 
127.0.0.1:6379> shutdown

2.再次启动redis查看key,数据还是存在的
[root@redis-1 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf 
[root@redis-1 ~]# redis-cli dbsize
(integer) 16000

3.rdb有时会生成不了持久化文件,我们可以使用bgsave命令手动持久化
[root@redis-1 ~]# redis-cli 
127.0.0.1:6379> BGSAVE
Background saving started
127.0.0.1:6379> SHUTDOWN
not connected> exit
.再次启动redis查看数据有没有丢失
[root@redis-1 ~]# redis-cli 
127.0.0.1:6379> DBSIZE
(integer) 16000				

2.2.AOF持久化操作

2.2.1.配置AOF持久化

注意:配置AOF时不能有注释存在

1.配置aof
[root@redis-1 ~]# vim /data/redis_cluster/redis_6379/conf/redis_6379.conf 
dir /data/redis_cluster/redis_6379/data/		//持久化文件路径
appendonly yes        					//是否打开aof日志功能
appendfilename "appendonly.aof"        	//aof文件名称
appendfsync always                      //每执行一个命令都立即同步到aof持久化文件
appendfsync everysec                    //每秒写入1次
appendfsync no                          //写入功能交给操作系统,由操作系统判断缓冲区大小,统一写到aof
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb           //aof文件大小,当超过设定的值就执行aof压缩命令
aof-load-truncated yes

2.启动redis

2.2.批量创建key并观察aof文件变化

1.批量生产key
[root@redis-1 ~]# for i in {1..15000}
do
redis-cli set k_${i} v_${i}
echo "k_${i} is ok"
done

2.观察aof文件的,会持续增长,redis每执行一个命令都会记录到aof中
[root@redis-1 ~]# cd /data/redis_cluster/redis_6379/data
[root@redis-1 /data/redis_cluster/redis_6379/data]# ll appendonly.aof 
-rw-r--r--. 1 root root 257031 1月  28 14:02 appendonly.aof
[root@redis-1 /data/redis_cluster/redis_6379/data]# ll appendonly.aof 
-rw-r--r--. 1 root root 266836 1月  28 14:02 appendonly.aof
[root@redis-1 /data/redis_cluster/redis_6379/data]# ll appendonly.aof 
-rw-r--r--. 1 root root 272571 1月  28 14:02 appendonly.aof
[root@redis-1 /data/redis_cluster/redis_6379/data]# ll appendonly.aof 
-rw-r--r--. 1 root root 277566 1月  28 14:02 appendonly.aof

2.2.3.重启redis查看数据是否会丢失

1.关闭redis
[root@redis-1 ~]# redis-cli 
127.0.0.1:6379> SHUTDOWN 

2.启动redis
[root@redis-1 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf 

3.查看数据是否丢失,还是15000个key,数据全部都在
[root@redis-1 ~]# redis-cli 
127.0.0.1:6379> DBSIZE
(integer) 15000

2.2.4.观察aof持久化文件

aof文件会记录redis的所有更改命令

删除、新增key都会记录在aof文件中,当redis重启后,会将aof文件中的命令还原到redis中,从而保证数据的持久化,我们配置的aof文件大小为64m,默认就是64m,当文件超过64m时,redis有自己的压缩策略,会把aof中的删除命令全部删掉,保证文件的大小,也可以根据实际生产把文件大小给大

在这里插入图片描述

3.redis持久化隐藏技能

3.1.redis支持热更新配置

redis中某些配置也是支持热更新的,只需要在命令行执行命令即可加载配置

查看配置:config get *

配置参数:config set 配置

查看当前redis的所有配置
127.0.0.1:6379> CONFIG GET *
  1) "dbfilename"
  2) "redis_6379.rdb"
  3) "requirepass"
  4) ""
  5) "masterauth"
  6) ""
  7) "unixsocket"
  8) ""
  9) "logfile"
 10) "/data/redis_cluster/redis_6379/logs/redis_6379.log"
 11) "pidfile"
··························

查看redis的rdb配置
127.0.0.1:6379> CONFIG GET save
1) "save"
2) "900 1 300 100 60 10000"

rdb配置时支持热更新的
1.将rdb的配置取消
127.0.0.1:6379> CONFIG SET save ""
OK
127.0.0.1:6379> CONFIG GET save 
1) "save"
2) ""

2.配置rdb
127.0.0.1:6379> CONFIG SET save "60 10000 300 100 900 1"
OK
127.0.0.1:6379> CONFIG GET save 
1) "save"
2) "60 10000 300 100 900 1"

3.2.rdb和aof同时使用

结论:rdb和aof同时存在,redis每次启动读取的是aof持久化文件而不是rdb持久化文件

1.将rdb文件清空
[root@redis-1 ~]# > /data/redis_cluster/redis_6379/data/redis_6379.rdb 
2.重启redis
[root@redis-1 ~]# redis-cli shutdown
[root@redis-1 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf 
3.redis还是有数据的
[root@redis-1 ~]# redis-cli dbsize
(integer) 16000


1.将aof文件清空,rdb文件保存
[root@redis-1 ~]# ll /data/redis_cluster/redis_6379/data/redis_6379.rdb 
-rw-r--r--. 1 root root 249870 1月  28 14:53 /data/redis_cluster/redis_6379/data/redis_6379.rdb
[root@redis-1 ~]# > /data/redis_cluster/redis_6379/data/appendonly.aof 
[root@redis-1 ~]# ll /data/redis_cluster/redis_6379/data/appendonly.aof
-rw-r--r--. 1 root root 0 1月  28 14:53 /data/redis_cluster/redis_6379/data/appendonly.aof
2.重启redis
[root@redis-1 ~]# redis-cli shutdown
[root@redis-1 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf 
3.查看数据发现已经清空
[root@redis-1 ~]# redis-cli dbsize
(integer) 0

3.3.redis shutdown命令

redis配置了rdb持久化之后,使用shutdown关闭redis时,系统首先执行bgsave,将数据保存到持久化文件,再执行shutdown,这样就做到了数据的持久化

浏览596 评论0
返回
目录
返回
首页
Redis五种常用字符串类型的KEY基本操作操作(二) Redis缓存数据库应用概念以及Redis基本操作(一)