持久化模式
什么是持久化? Redis本身的数据 是写到 内存中 假设断电的情况下 数据会发生丢失 那么假设我们希望的是 数据不丢失 或者 只是丢失 很少的一部分 那么这种情况应该怎么办呢? 持久化这个概念 就在这种情况下 应运而生了
# 1、rdb 模式
rdb模式 又称为 快照模式 :在rdb中保存的都是二进制的数据 因为存的是二进制数据 所以这种模式在读取数据的时候 会 非常快 也是 Redis默认的持久化方式
默认情况下 硬盘保存的数据的名字 dump.rdb
持久化:简单的说就是把原来写在内存的数据 同步到硬盘上进行保存
默认的数据的持久化模式是 rdb、那么这个数据在什么时候进行同步呢?
所以一定得有 触发的条件
查看默认的持久化文件

查看 redis.conf 的 rdb 配置如下
save 900 1
save 300 10
save 60 10000
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
2
3
4
5
6
7
这种模式 一般情况下 不用来做开发
这种模式最经典的使用地方:数据的备份 而且是在某一时刻 所有内存数据的备份
rdb模式到底是怎么进行备份的?
当我们触发的条件 满足要求的时候 这个时候首先将硬盘上的这个文内( dump.rdb)容给删除
删除之后 将 我们的内存里面所有的数据 从新写入到 硬盘 这就有一个很大的缺陷 如果删除文件之后 断电了 那么所有的数据 全部就丢失了
# 2、aof 模式
这种模式和上面模式最大的不同点是:这种模式在保存数据的时候 保存的是 操作的命令 因为保存的是命令所以在速度上来说就要比 rdb模式要略逊一筹
疑问:前面我们说 rdb是默认是持久化方式 现在又开启了 aof 那么你们觉得 这两种模式中 会以谁优先呢?
这两种模式同时存在的时候 会以
aof模式优先
# 2.1、打开aof模式
编辑 redis.conf 文件
appendonly yes # 打开aof模式
# 更改aof模式下文件的名字
# 默认存储数据的文件的名字 `appendonly.aof`
appendfilename "appendonly.aof"
2
3
4
打开之后会生成一个文件如下
# 2.2、aof 数据同步规则
- aof 触发内存数据和硬盘数据 有三种同步的规则
# 表示永远不同步,不保存。当你需要的时候,使用操作系统刷新数据
# no: don't fsync, just let the OS flush the data when it wants. Faster.
# 每次key改变的时候都同步 效率慢
# always: fsync after every write to the append only log. Slow, Safest.
# 每秒触发一次同步
# everysec: fsync only one time every second. Compromise.
# appendfsync always
appendfsync everysec
# appendfsync no
2
3
4
5
6
7
8
9
10
注意:在开发中 一般情况下 都会使用 aof模式 (低版本中) 而且一般情况下 要考虑效率 和同步数据丢失的问题 一般情况下 会选择 everysec 作为我们同步策略
玩下 aof 往redis里面放入数据,再查看 appendonly.aof 文件内容
# 2.3、aof 保存的数据的含义
研究下保存数据的含义
*3 * :表示的是命令的开始(暂时这么认为 严格意义上来说 *代表的是 array) 3:代表的是这个命令有三部分 set
xff 123
$3 $:当成一个语法规则记住 3:下面这个命令的字符的长度
set
$8
xff
$3
123
2
3
4
5
6
7
8
9
10
11
12
# 2.4、重写问题
当执行多个相同的命令的时候,aof文件里面就会存在很多相同的记录,可以使用手动重写对aof文件进行优化
插入几条相同的命令如下
incr xff
incr xff
2
查看aof文件如下
*2
$4
incr
$3
xff
*2
$4
incr
$3
xff
2
3
4
5
6
7
8
9
10
① 手动重写
修改 redis.conf 关闭混合持久化,修改后记得重启redis服务
# 先在 redis.conf 文件 关闭混合持久化
# aof-use-rdb-preamble 默认是 yes
aof-use-rdb-preamble no
2
3
进入redis客户端,手动执行命令
./redis-cli
bgrewriteaof # 这个命令表示的是手动的进行重写
[root@localhost bin]# ./redis-cli
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started
127.0.0.1:6379>
2
3
4
5
6
7
查看重写后的aof文件
*3
$3
SET
$3
xff
$1
2
2
3
4
5
6
7
可以看见incr优化了
② 自动重写
# 下面表示的意思是自动的重写的条件
# 只有达到100%的增长那么才会触发aof文件进行重写
auto-aof-rewrite-percentage 100
# 表示的是 aof文件最小的重写的大小
# 至少 aof文件的大小 达到 64M+64M=128M的时候(100%的增长) 这个aof文件就会自动被重写
auto-aof-rewrite-min-size 64mb
2
3
4
5
6
7
# 3、混合持久化
# 3.1、开启混合持久化
aof-use-rdb-preamble yes
怎么玩呢,先打开 混合持久化 再往redis里面存入数据,然后 bgrewriteaof 手动重写 aof 文件 ,在打开 aof 文件 可以看到 文件里面的命令已经变成 二进制文件了
# 3.2、混合持久化截图
当手动重写后,可以看见命令全部变成二进制文件了
这个时候我们继续往redis里面插入数据,可以看见aof文件下面存储的是命令,这个就是混合持久化