redis 持久化(5)

*

什么是持久化:*

redis的数据是保存在内存中的,持久化就是将数据异步保存到硬盘当中。

持久化方式:

快照:某时某点将数据完整的备份例如:MySql的Dump redis的RDB;
写日志:将数据的更新放入日志文件中,例如:redis 的 AOF

RDB:

什么是RDB:在某时某刻从reids内存中生成一个RDB文件(二进制)到硬盘中;也可以将该文件的数据恢复到redis;

触发条件:
save(同步)命令:当执行该命令时其他命令都为该命令让步,直到执行完成,如存在老的文件,那新生成的文件会替换老的文件;

bgsave(异步)命令:异步执行,命令执行后,redis会通过fast()函数生成一个redis子进程,这个子进程会去生成一个RDB文件,然后返回给主进程 bgsave successfully;
redis 持久化(5)

自动:在达到某种条件的时候,比如我们配置在60秒内如果改变了10000条命令,生成一个RDB文件,redis内部通过bgsave生成,但是有个缺陷就是我们无法控制生成频率;

配置:
1. 不使用自动配置
2. 默认文件名 dump加端口名称
3. 当bgsave出现问题的时候是否停止写入
4. 是否采用压缩
redis 持久化(5)

缺陷:耗时,耗性能;不可控,容易丢失数据;

AOF

每次客户端写入redis服务端的命令都会写入日志文件中,当reids发生宕机 我们就可以使用AOF完整的将数据恢复;

AOF三种写入策略:
redis为了提高效率先将将命令写入缓冲区,然后缓冲区再根据某种策略写入硬盘:
always:写每条命令都会执行fack到硬盘;不会丢失数据但是io开销大,因为每次都会写入。
everysec:每秒刷新缓冲区的数据到硬盘;只允许丢失一秒数据是优点也是缺点。默认配置,一般使用这个。
no:根据操作系统进行刷新;优点是不用管,缺点是不可控。

AOF 可以重写,可以将无用的,多余的命令进行优化,这样做的作用可以加快恢复速度,减少磁盘占用量。
AOF 重写命令:bgrewriteaof–客户端发送命令后,reids服务器fork一个子进程,然后重写到AOF文件;
配置:
redis 持久化(5)

redis 持久化(5)
redis 持久化(5)

RDB和AOF的抉择

redis 持久化(5)

RDB最佳策略
“关”:因为如果有主从复制中会有全量复制,这个时候是需要从主复制一份rdb文件到从的 所以是关不掉的;
集中管理:如果是大的备份,比如一天一周备份那么可以用rdb因为rdb文件是比较小的;

AOF最佳策略
“开”:缓存和存储,会存储数据 丢也是丢一秒,也有的把这个当缓存 如果缓存也只是起到一定缓存作用可以关掉,毕竟也是有开销的;
AOF重写集中管理

最佳策略
小分片
缓存或者存储
监控(硬盘,内存,负载,网络)
要有足够的内存