redis持久化问题及最佳解决方案

591 阅读2分钟

概述

redis作为一个缓存,为了达到高性能,数据都是直接放到缓存中的,那么必然会面临一个断电数据丢失的问题.对于流量不高的应用来说,大不了通过数据库,将数据恢复到缓存中; 对于高并发应用来说,缓存宕机丢失数据,会引发雪崩,击穿,穿透等一系列问题.

AOF持久化方案

image.png


工作原理描述:
     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宕机