什么是持久化:所谓的持久化 就是将内存的数据 保存到硬盘 Redis中的数据持久化实际上为了进一步保证数据不被丢失 这个就是咋们的Redis的持久化
明白一个问题:即使引入了Redis的持久化 数据还是保证不了 完全不丢失
1、RDB模式的持久化
Redis默认支持的是 RDB模式
RDB模式默认保存的数据是 二进制 二进制大家都知道 速度快
那么这个数据在什么情况下会将内存中的数据同步到硬盘呢?
save 900 1 //在900秒钟的时候内 如果有 1个key发生改变 那么将触发 内存和硬盘同步
save 300 10 //如果在300秒的时间内 如果有10个key发生改变 那么将触发内存和硬盘同步
save 60 10000 //如果在60秒钟的时间内有10000个key发生改变 那么也将触发 内存和硬盘同步
这种赤裸裸的策略 很有可能丢掉数据
60时间内 只有 9999个key发生改变 但是断电了 一旦断电了 那么 内存就清空了 数据也就丢失了
RDB模式 是怎样进行数据同步的呢?
RDB在进行数据同步的时候 实际上是先删除硬盘上的 rdb文件,然后再向rdb文件中重新写入数据,也就是说每一次写入数据都是整个内存的所有数据,而不是什么增量数据
大家有没有想过这个问题呢?
假设在进行数据同步的时候,刚好清除完所有硬盘上的数据,这个时候断电了,那么就会导致整个数据的丢失。但是你说这种模式有没有啥好处呢?
有:那就是他在保存数据的时候是保存的是内存中的所有数据,而不是增量数据,这个就导致了这种模式最适合的场景就是内存数据的备份,因为备份的内容写成了 二进制内容,所以速度快,也适合做数据的恢复
2、AOF模式的持久化
如果要打开 aof模式?
appendonly yes 开启AOF持久化
aof-use-rdb-preamble no 关闭混合持久化
举个例子,set li 123这个命令,在我们的aof文件中是这样存储的
3 星号:代表的是 array 3代表的意思是 命令离一共三项 set,li和123
$3 美元符号 $:表示每个项的开始 3代表的是 下面的set由三个字符构成
set
$8
li
$3
123
使用AOF持久化时,aof文件会将每一个命令都依次存储在文件中,极其的浪费资源,我们可以使用bgrewriteaof手动重写AOF文件内容,对其进行优化,如果每一次都进行手动重写,那就实在是太麻烦了,Redis中会自动进行重写,只是有两个条件:
auto-aof-rewrite-percentage 100 //必须在原来的配置上 百分百的增长才会重写 64M+64M=128M
auto-aof-rewrite-min-size 64mb //我们的aof文件必须达到 64M才重写
大家有没有疑问:
我们开启了 AOF模式,系统本身又开启了 RDB模式,那么这个时候系统会以谁优先呢?
如果是同时开启了 AOF和RDB,没有开启混合持久化的话,那么系统会以 AOF模式优先
在AOF模式下 什么时候 内存的数据才会和硬盘同步呢?
AOF在同步的时候并不会删除原来的内容,而是在原来内容的基础上进行追加,这种相当于是做增量更新,而不是全量更新,这个就是同步策略 ---->同步的效率要高一些
3、混合持久化
混合持久化开启命令aof-use-rdb-preamble yes
混合持久化就是每一次AOF文件在进行重写优化之后,那么原来的AOF的部分除了被优化之后,还要翻译成二进制进行存储
如果翻译之后 你还要操作redis,那么后面的操作依然会记录成AOF的样式