版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/luo4105/article/details/70821221
为了防止断电导致数据丢失,Redis支持数据持久化,即将内存中的数据以文件形式保存。Redis持久化有RDB(快照)和AOF(日志)两种策略。
RDB(快照)是将当前数据快照写入二进制文件中,默认的文件名为dump.rdb。可以通过配置自动实现快照持久化操作。我们可以配置n秒内如果超过m个key被修改便自动执行快照,快照的默认配置:
save 900 1 #900 秒内至少有 1 个 key 被改变
save 300 10 #300 秒内至少有 300 个 key 被改变
save 6010000 #60 秒内至少有 10000 个 key 被改变
rdbcompressionyes # 存储至本地数据库时(持久化到 rdb 文件)是否压缩数据,默认为 yes
dbfilenamedump.rdb #储存文件名
dir ./ #存储地址
快照保存过程:
1.调用fork命令,生成子线程,将父线程的所有值都复制到子线程,只有少数值不同,相当于复制一个自己。
2.父线程执行client的请求,子线程负责将内存内容写在临时文件中。
3.当子线程快照临时文件完毕后,将临时文件替换原来的快照文件,子线程退出。
每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。
由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。如果应用要求不能丢失任何修改的话,可以采用aof持久化方式。
AOF的全称是appendonly file,从名字上我们就能看出来,它是一个追加写入的日志文件。AOF文件是可识别的纯文本,它的内容就是一个个的Redis标准命令。在执行AOF时,redis会把每个写命令调用write函数写在文件中(默认),在redis重启时,会读文件重构数据库。由于OS(操作系统)会缓存write命令,所有还是存在丢失数据的可能性。不过可以通过配置文件调用fsnyc函数强制OS(操作系统)写入到磁盘。
appendonlyyes #启用aof持久化方式
# appendfsyncalways #每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsynceverysec #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
# appendfsyncno #完全依赖os,性能最好,持久化没保证
AOF每一条写命令都生成一条日志,会造成 appendonly.aof 文件过大,例如我们调用incr test命令100次,文件中必须保存全部的100条命令,其实有99条都是多余的。因为要恢复数据库的状态其实文件中保存一条set test 100就够了。为此Redis提供rewrite功能来解决这个问题。Rewrite使用与快照类似的方式将内存中的数据以命令的方式保存到临时文件中,最后替换原来的文件。Rewrite处理方式,即当AOF文件满足一定条件时就对AOF进行rewrite,rewrite是根据当前内存数据库中的数据进行遍历写到一个临时的AOF文件,待写完后替换掉原来的AOF文件即可。
Redis触发AOF rewrite机制有三种:
1、Redis Server接收到客户端发送的BGREWRITEAOF指令请求,如果当前AOF/RDB数据持久化没有在执行,那么执行,反之,等当前AOF/RDB数据持久化结束后执行AOF rewrite
2、在Redis配置文件redis.conf中,用户设置了auto-aof-rewrite-percentage和auto-aof-rewrite-min-size参数来触发AOFrewrite。
auto-aof-rewrite-percentage | 指定Redis重写aof文件的条件,默认为100,表示与上次rewrite的aof文件大小相比,当前aof文件增长量超过上次afo文件大小的100%时,就会触发background rewrite。若配置为0,则会禁用自动rewrite |
---|---|
auto-aof-rewrite-min-size | 指定触发rewrite的aof文件大小。若aof文件小于该值,即使当前文件的增量比例达到auto-aof-rewrite-percentage的配置值,也不会触发自动rewrite。即这两个配置项同时满足时,才会触发rewrite。 |
3、用户设置“configset appendonly yes”开启AOF的时,调用startAppendOnly函数会触发rewrite
参考
1. http://blog.csdn.net/freebird_lb/article/details/7778981
2. http://blog.csdn.net/vtopqx/article/details/46833513