redis两种持久化类型 #yyds干货盘点#

眼前多少难甘事,自古男儿当自强。这篇文章主要讲述redis两种持久化类型 #yyds干货盘点#相关的知识,希望能为你提供帮助。
redis两种持久化类型 1.redis两种持久化操作redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式,这两种方式可以单独使用其中一种,也可以混合使用
如果不使用持久化,那么当redis重启后,所有的数据会全部消失
redis重启前是有很多key的

redis两种持久化类型 #yyds干货盘点#

文章图片

当redis重启后,所有key全部消失
redis两种持久化类型 #yyds干货盘点#

文章图片

1.1.RDB方式
RDB方式就类似于快照,当符合一定条件的数据,Redis会自动将内存中的所有数据打一个快照,并存储到磁盘上,主要有两个参数构成,时间和改动,比如在1分钟内如果产生了1000个key,那么就打一个快照,RDB是redis的默认持久化方式
【redis两种持久化类型 #yyds干货盘点#】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> shutdown2.再次启动redis查看key,数据还是存在的 [root@redis-1 ~]# redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf [root@redis-1 ~]# redis-cli dbsize (integer) 160003.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 yes2.启动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" done2.观察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中的删除命令全部删掉,保证文件的大小,也可以根据实际生产把文件大小给大
redis两种持久化类型 #yyds干货盘点#

文章图片

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) 160001.将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,这样就做到了数据的持久化

    推荐阅读