概述
redis作为一个缓存,为了达到高性能,数据都是直接放到缓存中的,那么必然会面临一个断电数据丢失的问题.对于流量不高的应用来说,大不了通过数据库,将数据恢复到缓存中; 对于高并发应用来说,缓存宕机丢失数据,会引发雪崩,击穿,穿透等一系列问题.
AOF持久化方案
工作原理描述:
1.客户端每接受到一条命令,执行完后,将日志数据写到AOF文件中
2.写回AOF文件有三种策略,Always(每个命令执行完,立即写回磁盘),Everysec(每秒将缓存中的日志写回
磁盘),No(缓存中的日志,由操作系统统一刷到磁盘)
3.为了避免AOF日志文件太大,有日志重写机制,日志数量最后会等于真实数据量 ,同时为了不阻塞主线程,fork
子线程执行重写任务
AOF方案问题:
1.使用AOF日志恢复,需要每条日志都执行,恢复速度非常慢
2.Always写盘策略比较耗费性能,Everysec,No又存在数据丢失分险
RDB(快照)持久化方案
工作原理描述:
1.redis可以fork一个线程直接将内存中数据生成RDB文件,恢复时候,直接读取RDB就可以恢复了
2.RDB生成过程中,允许客户端写操作,可以保证数据一致性
AOF方案问题:
1.两次RDB生成的时间之间的数据会丢失
2.频繁执行RDB太过于消耗资源,一般建议分钟级别执行一次,虽然不会阻塞主线程
解决方案
1.可以容忍分钟级别数据丢失,使用RDB快照方案,毕竟快照生成不能执行太频繁(有快速恢复的功效)
2.只能容能秒级别数据丢失,使用AOF方案(有丢失数据少的功效)
3.混合使用RDB和AOF方案,Redis 4.0可用(可以达到快速恢复和少量数据丢失功效)
4.部署高可用的主从结构,尽量避免redis宕机