你对redis持久化的理解?
(为什么要对于redis进行持久化?)
redis对于数据的操作是基于内存的,如果出现进程退出或者服务器宕机的情况,redis中的数据会丢失不可恢复,为了不会造成数据的丢失,所以需要对于redis中的数据进行持久化存储。
对于redis持久化的方式有三种:
RDB(全称:Redis Data Base)(默认开启)
AOF (全称:Append Only File ) (默认不开启)
RDB和AOF混合持久化方式(redis4.0以后)
RDB方式:持久化内存数据
快照的方式
(默认的持久化机制)
什么是RDB?
在指定的时间间隔内将内存中的数据集的快照写入磁盘
底层原理:
Redis会单独创建(Fork)一个子进程来进行持久化,先会将数据写入到一个临时文件中,待持久化过程结束后,再用这个临时文件去;替换上次持久化好的dump.rdb文件,这样的话,会保证数据的完整性
缺点:最后一次的持久化数据可能会丢失。
触发机制
触发机制分为手动触发和自动触发
手动触发是通过sava(不推荐,阻塞)和bgsave(推荐,异步)命令进行触发
自动触发是通过shutdown进行自动触发,然后通过bgsave方式进行持久化
如何恢复
redis重启的话,会自动通过读取dump.rdb文件进行恢复数据
优点
- 适合大规模的数据修复
- 对于数据完整性和一致性要求不高更适合使用
- 节省磁盘空间
- 恢复速度快
缺点
Fork 的时候,内存中的数据被克隆了一份,大致2倍的膨胀性要考虑
虽然 Redis 在fok 时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能。
在备份周期在一定间隔时间做一次备份,所以如果Redis意外down掉的话,就会丢失最后一次快照后的所有修堂
配置文件(陌生点):
1、当Redis无法写入磁盘的话,直接关掉Redis的写操作。推荐yes.
stop-writes-on-bgsave-eror:yes
2、对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis,会采用LZF算法进行压缩