Redis的持久化

一、介绍

Redis可以当做缓存和数据库来使用。

(1)作缓存:数据可以丢,要求速度快。

(2)作数据库:数据绝对不能丢,不仅要速度+更重要的是数据持久化。而内存里的数据掉电易失

从存储层Redis数据持久化来看,分为两块:

快照/副本——RDB

日志——AOF

二、RDB

RDB最重要的就是时点,它会在每次时点到的时候将数据存储到磁盘。触发RDB存储数据有以下两种方式:

  1. save:前台触发,同时阻塞。(比如关机维护时使用)

  2. bgsave:后端异步非阻塞的方式把数据落到磁盘;会调用fork创建子进程。

  3. Redis的配置文件中可以设置bgsave的规则(使用的是save标识,但触发的是bgsave)。

配置文件:/etc/redis/6379.conf

============SNAPSHOTTING============
save 900 1
save 300 10
save 60 10000

dbfilename dump.rdb(RDB文件名)
dir /var/lib/redis/6379(RDB文件存储位置)

  1. RDB方式存储数据有以下弊端:

(1)不支持拉链(永远只有一个dump.rdb文件)

(2)丢数据相对多一些(时点与时点之间的数据容易丢失)

  1. 优点:类似于java中的序列化,恢复速度相对快

为了解决RDB的弊端,产生了AOF。

fork:内核机制,速度快,空间小。采用copy on write机制(创建子进程并不发生复制)往磁盘写数据时才发生复制。

三、AOF(append only file)

AOF:将Redis的写操作记录到文件中。

  1. 丢数据少

  2. RDB和AOF可以同时开启(如果开启了AOF只会用AOF恢复数据)。4.0以后AOF中包含了RDB全量,也就是AOF中前面部分是RDB,然后再追加增量(追加新的写操作)。

  3. 弊端:体量无限变大,导致恢复变慢

  4. 优点:丢数据少

  5. 那么如何设计一个方案,让AOF足够小

4.0以前:重写,删除抵消的命令,合并重复的命令,最终也是一个纯指令的日志文件。恢复成本还是相对较高。

4.0以后:重写,先将老的数据RDB到AOF文件中,将增量的以指令的方式Append到AOF中(也就是AOF里包含RDB和增量的日志信息)。此时AOF是混合体,利用了RDB的快和AOF的丢数据少。混合体的AOF文件以REDIS开头。aof-use-rdb-preamble yes

  1. 在AOF写操作会触发IO时,有三个级别可以调

    appendfsync no

    appendfsync always

    appendfsync everysec

# appendfsync always(每一次操作都把buffer的数据写到磁盘,此时数据肯定是最可靠的,最多丢失一条数据)

appendfsync everysec(Redis每秒调用一次flush,即每秒执行一次从buffer到磁盘的写操作;丢失的数据最大比一个buffer小一丢丢,但这是一种最坏的概率。所以是always和no的一个折中)

# appendfsync no(Linux kernel fd的buffer满了,自动往磁盘刷数据,不手动执行,此时可能会丢失一个buffer大小的数据)

相关的配置:

============APPEND ONLY MODE============

appendonly no(默认是关闭AOF)

appendfilename “appendonly.aof”(AOF文件名称,路径和RDB相同)

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

四、实操

vi /etc/redis/6381.conf

1、修改 daemonize yes 为 daemonize no(让Redis在前台阻塞执行)

2、注释掉 logfile /var/log/redis_6381.log(将日志输出到前台)

3、修改 appendonly no 为 appendonly yes(追加aof文件)

4、aof-use-rdb-preamble yes 改为 no(验证老版本AOF文件内容)

5、启动redis:redis-server /etc/redis/6381.conf,此时可以把/var/lib/redis/6381里面的日志信息清空rm -rf ./*

6、redis-cli -p 6381:做一些操作set k1 hello

7、查看/var/lib/redis/6381下的AOF文件信息

在这里插入图片描述

8、bgsave 把数据落到磁盘,产生rdb文件

9、redis-check-rdb dump.rdb 如果rdb文件出错,会告诉出错信息

10、set k1 a set k1 b set k1 c

11、BGREWRITEAOF 会删除抵消的命令,合并重复的命令

验证新版Redis的AOF文件

1、Ctrl+c 停掉启动的6381Redis

2、rm -rf ./* 删除/var/lib/redis/6381下的文件

3、vi /etc/redis/6381.conf 修改aof-use-rdb-preamble no为yes

4、redis-server /etc/redis/6381.conf 启动Redis

5、redis-cli -p 6381 set k1 a set k1 b set k1 c

6、BGREWRITEAOF 将老的数据RDB移到AOF文件中,将增量的以指令的方式Append到AOF中,会删除抵消的命令,合并重复的命令

7、var/lib/redis/6381 vi appendonly.aof 此时AOF文件前面会有REDIS标识

8、set k1 w set k1 m

9、var/lib/redis/6381 vi appendonly.aof 此时前一步的操作会以明文的方式追加到AOF文件后面

在这里插入图片描述

10、bgsave (把数据落到磁盘,产生rdb文件)

11、BGREWRITEAOF (将老的数据RDB移到AOF文件中,将增量的以指令的方式Append到AOF中,删除抵消的命令,合并重复的命令)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值