如何做Redis的持久化?

参考资料: http://tech.it168.com/a2012/0806/1381/000001381007_1.shtml

 

方式1: 简单的aof文件方式

这种方式只生成aof文件;

优点: 不会定期生成snapshot,对磁盘消耗小(不是少),也不会因为生成snapshot时写磁盘对服务带来影响(虽然影响不太大)

缺点: 重新启动服务时可能需要无法估计的时间

 

方式2: snapshot方式

该方式不生成aof文件,定期产生snapshot文件

优点: 重启服务时,启动速度快

缺点: 会丢失最后一次产生snapshot到意外宕机之间的写数据

 

方式3: aof + bgrewriteaof

1. 产生aof文件

2. 通过 bgrewriteaof 命令定期压缩aof(其实是根据内容中的数据重新生成aof)文件

优点: 不会导致aof文件太大而占用太大的磁盘文件,不会因为aof文件太大而导致重启服务时太慢

缺点: 毕竟重启服务还是要加载aof文件的

 

方式4: snapshot + aof + snapshot点   (该方式是否可行未经验证)

1. 定期产生snapshot文件

2. 产生snapshot文件后,删除文件中snapshot点之前的数据,这样aof就不会太大了

3. 服务重启时,先加载snapshop,在加载snapshot时间点后的aof文件

4. 这样的话,aof文件中记录的命令不应该有类似 incr decr之类的命令,应该都是set、delete之类的命令,这个和snapshot点的选择有关系(没法选择一个确切的snapshot点); 或者: snapshot期间允许用户执行写操作吗?不允许的话就没有这个问题了,如果不允许的话,这个条件也太苛刻了

5. 从redis的源码来看,是不会同时参考snapshot的rdb文件和aof文件的

其实, redis4.0之后,是支持rdb+aof 方式的,这时候,loadAppendOnlyFile() 函数中有rdb相关逻辑,而且,这时候的aof文件的前面部分其实就是rdb文件的内容,但是依然叫做aof文件,所以,依然时候loadAppendOnlyFile() 函数就搞定了。

参考: Redis-4.0以后的混合持久化_gdlsky的博客-CSDN博客_redis混合持久化

 

关于snapshot的频率:

原来以为 save 300 10 解释为: 超过300s或者超过10条变更就snapshot,其实不是的,而是: 超过300s并且超过10条变更就snapshot

 

 

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据