redis是一个高级的key-value数据库,跟memcached类似,不过数据可以持久化,而且支持的数据类型也非常丰富。redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上,称为半持久化模式,也可以把每一次数据变化都写入到一个append only file里面,称为全持久化模式
RDB的持久化配置?
#时间策略
save 900 1 :表示900秒类如果有一条写入命令,就触发产生一次快照
save 300 10
save 60 10000
#文件名称
dbfilename dump.rdb
#文件保存路径
dir /home/work/redis/data
#如果持久化出错,主进程是否停止写入
stop-writes-on-bgsave-error yes :当备份进程出错的时候,主进程就停止接受新得写入操作,保护数据一致性的问题
#是否压缩
rdbcompression yes
#导入时是否检查
rdbchecksum yes
AOF的相关配置?
#是否开启aof
appendonly yes
#文件名称
appendfilename "appendonly.aof"
#同步方式
appendsync everysec
#aof重写期间是否同步
no-appendsync-on-rewrite no
#重写触发配置
auto-aof-rewirte-percentage 100
auto-aof-rewrite-min-size 64mb
#加载aof时如果有错误如何处理
aof-load-truncated yes
#文件重新二策略
aof-rewrite-incremental-fsync yes
详述:
appendfsync
always:把每个写命令都立即同步到aof,很慢但是很安全
everysec:每秒同步一次
no:redis不处理交给OS来处理,非常快,但不可控
一般情况下都采用everysec配置,兼顾速度与安全,最多损失1s的数据
aof-load-truncated yes:在加载时发现aof尾部不正确,会向客户端写入一个log,但是会继续执行,如果设置为no,则会停止
Redis中RDB实现原理
redis中RDB持久化的触发分为俩种,手动触发和redis定时触发
手动触发有俩种:
save:会阻塞当前redis服务器,知道持久化完成
bgsave:该触发方式会fork一个紫禁城,由子进程负责持久化,因此阻塞只会发生在fork子进程的时候
自动触发:
根据配置文件中的 save m n配置自动触发规则
注意的是fork操作会阻塞,导致redis读写性能下降,我们可以控制单个redis实例的最大内存,来尽可能降低redis在fork时的时间消耗。
RDB中AOF实现原理
AOF整个流程分为2步,1是命令的实时写入,2是对aof文件的重写
aof重写是为了减少aof文件的大小,可以手动触发或自动触发
从持久化中恢复数据
Redis中RDB和AOF的优缺点
RDB持久化的优点
1、rdb会生成多个数据文件,每个数据文件都可以代表了某一个时刻中redis的数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整的数据文件发送到一些远程的安全存储上去。
2、rdb对redis对外提供读写服务,影响非常小,可以让redis保持高性能,因为redis主进程只需要fork一个子进程,让子进程执行磁盘IO操作来进行RDB持久化即可。
3、相对AOF持久化机制来说,直接基于RDB数据文件来重启和恢复redis进程,更加快速
缺点:
1、如果想要在redis故障时,尽可能少的丢失数据,那么RDB没有AOF好,一般来说,RDB数据快照文件,都是每隔五分钟,或者更长时间生成一次,这个时候就得接受一旦redis进程宕机,那么就会丢失最近五分钟得数据
2、RDB每次在fork子进程执行RDB快照数据文件生成的时候,如果数据文件特别大,可能会导致对客户端提供的服务暂停阻塞。因为在fork进程中,可能会发生阻塞。
AOF持久化机制的优点
1、AOF可以更好的保护数据不丢失,一般AOF会每隔1秒,通过一个后台线程执行一次fsync操作,最多会丢失1秒钟的数据
2、AOF日志文件以append-only模式写入,没有任何磁盘寻址开销,写入性能非常高,而且文件不容易破损,及时文件尾部破损,也很容易修复。
3、AOF日志文件即使过大,出现后台重写操作,也不会影响客户端的读写,因为在rewrite log的时候,会对其中的指导进行压缩,创建出一份需要恢复数据的最小日志出来。再创建新日志文件的时候,老的日志文件照常写入,当心的merge后的日志文件ready的时候,再交换新老日志文件即可
4、AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除紧急恢复,比如某人不小心flushall命令清空所有数据,我们可以立即拷贝AOF文件,将flushall命令给删掉,就可以自动恢复所有的数据