Redis持久化
持久化 是将数据从掉电易失的内存存放到能够永久存储的设备上
Redis为什么需要持久化
因为数据都是缓存在内存中的,当你重启系统或者关闭系统后,缓存在内存中的数据都会消失殆尽,再也找不回来了。所以,为了让数据能够长期保存,就要将 Redis 放在缓存中的数据做持久化存储
Redis持久化方式
RDB(Redis DB) hdfs: fsimage
AOF(AppendOnlyFile) hdfs : edit logs 关闭的
RDB
在默认情况下,Redis 将数据库快照保存在名字为 dump.rdb的二进制文件中
某个时间点内存的快照备份,按照时点进行备份,8点,10点,在备份期间duang机,期间的数据不能备份
不定时的备份速度快,对内存不会造成太大压力。
RDB的2种持久化方式: a,b
a. 阻塞方式 客户端中执行save命令
停服务器 对用户界面不友好,但两个阶段恢复的数据完全相同
b. 非阻塞方式:(复杂度高?) bgsave 分散存储
用户体验度更高,用户添加新需求的时候,后台还可以继续运行 COW写时拷贝技术 父进程指向的是指针,子进程fork()读写进程,父子进程相互进行互不影响。
策略
自动:按照配置文件中的条件满足就执行BGSAVE
save 60 1000,Redis要满足在60秒内至少有1000个键被改动,会自动保存一次
手动:客户端发起SAVE、BGSAVE命令
实时存储,多套文件,
优点
完全备份,不同时间的数据集备份可以做到多版本恢复(手动)
紧凑的单一文件,方便网络传输,适合灾难恢复
恢复大数据集速度较AOF快
缺点
会丢失最近写入、修改的而未能持久化的数据(阻塞)
fork过程(开启子进程)非常耗时,会造成毫秒级不能响应客户端请求(非阻塞)
AOF
采用追加方式保存 记录所有的写操作命令,在服务启动的时候使用这些命令就可以还原数据库.
相对于RDB丢失数据少很多
写入磁盘策略:always everysec no
重写机制 体积 百分比
auto-aof-rewrite-min-size ,触发AOF重写所需的最小体积(64M)
auto-aof-rewrite-percentage ,指定触发重写所需的AOF文件体积百分比
百分比为了避免陷入无限的死循环
优点
写入机制,默认fysnc每秒执行,性能很好不阻塞服务,最多丢失一秒的数据
重写机制,优化AOF文件
如果误操作了(FLUSHALL等),只要AOF未被重写,停止服务移除AOF文件尾部FLUSHALL命令,重启Redis,可以将数据集恢复到 FLUSHALL 执行之前的状态
缺点
相同数据集,AOF文件体积较RDB大了很多
恢复数据库速度比RDB慢(文本,命令重演)