redis的数据高可用存储机制是将数据存到内存中去,但是为了使redis在重启后数据的不丢失,需要将数据通过某种形式存到硬盘中去。
它支持两种持久化的机制,Rdb和aop,这两可以单独使用一种,也可以同时使用两种。
RDB
这种方式是通过快照完成的,当符合一定条件时,redis会自动将内存中的数据保存到硬盘上去,
redis的默认存储方式就是RDB.。
数据恢复
Redis启动时,会读取快照的文件,将数据存入内存中,一般情况下,1G的快照载入内存的时间为20~30秒。
快照的过程
1、Resdis使用fork函数复制当前的一份进程的副本,
2、当前的进程会继续执行并处理客户端发过来的请求,而副本进程将内存的中的数据存入到硬盘的临时文件中去。
3、当副本进程写完所有的数据的时候,会用该临时文件替换掉旧的RDB文件
手动快照
如果没有自动触发快照,可以执行手动快照,save和bgsave都是执行手动快照,但是两者区别,前者是主进程进行快照,会阻塞其他的请求,后者通过复制主进程的副本进程快照(注意:复制主进程是需要内存代价的,比如,如果主进程的内存是4G,那么副本进程也应该4G,所以说内存要求就挺高了)
RDB文件压缩
可以通过设置配置设置是否压缩
# 是否对数据进行压缩
rdbcompression yes
AOF
此持久化的策略是将发送到Redis服务器的每一条命令都记录下来,并保存到硬盘的AOF文件中,aof的文件存储位置和RDB位置相同
优化AOF文件
可能出现命令重复的问题,例如,set a qw,过了会又设置了set a ee,虽然aof文件会把这些命令都会记录先来,但是这不是最优的。所以要调用bgwriteaof命令在重写文件即可清除重复的文件。
重写策略
重写策略的参数设置:
auto-aof-rewrite-percentage 100
当前AOF文件超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写。
auto-aof-rewrite-min-size 64mb
限制允许AOF文件重写的最小大小。通常AOF文件在很小的时候,即使有些冗余也是可以忽略的。
文件同步策略
文件写入默认情况下,先写到系统的缓存中,系统没30秒同步一次数据,才是真正写入到硬盘里面。如果在这个30秒内服务器宕机,拿数据也会丢失,Redis通过配置来修改策略。
# appendfsync always 每次都同步,但是最慢
appendfsync everysec 每秒同步(默认的同步)
# appendfsync no 不主动同步,由操作系统决定(最快但不安全)