> 文档中心 > Redis中的RDB跟AOF

Redis中的RDB跟AOF


前言

Redis是一种内存型非关系型数据库,如果断电或者宕机等故障出现,redis存在内存中的数据就会丢失,相应的Redis给出了两种持久化方案,还有一种是RDB跟AOF的结合;

1. RDB(Redis DataBase)

RDB是将某一时刻的数据集快照从内存写入磁盘当中,实际操作过程是fork一个子进程将数据集写入一个临时文件,写入成功之后再替换掉之前的旧文件,以二进制压缩存储;

优点:

  • 整个Redis只包含一个dump.rdb文件,方便持久化;
  • 容灾性好,方便备份;
  • 高性能,通过fork一个单独的子进程来进行持久化,而主进程则不会进行任何的IO操作;
  • 数据集很大的时候,启动效率要优于AOF;

缺点:

  • 数据安全性低,因为RDB是间隔一段时间进行持久化的;
  • 如果数据量比较大可能会导致整个redis停止服务几百毫秒甚至一秒钟;

2. AOF(Append Only File)

AOF是将Redis的操作日志以追加的方式写入文件;

优点:

  • 数据安全,提供了三种同步策略:
    1.每秒同步:宕机等情况会丢失1秒内的数据;
    2.每修改同步:不会丢失数据;
    3.不同步:由操作系统决定,丢失的数据也是不确定的;
  • 通过append模式写文件,即使宕机了也不会丢失文件及数据,可以通过redis-check-aof 工具解决数据一致性的问题;
  • AOF的rewrite模式定期对AOF文件重写达到压缩(相同的命令合并)的目的;

缺点:

  • AOF的文件比RDB的文件大;
  • 数据集大的时候效率低于RDB;

RDB/AOF小结:

AOF的文件比RDB要大,并且比RDB安全,但是性能却低于RDB,AOF的更新频率比RDB高,如果在redis中同时配置了RDB跟AOF,服务会优先采用AOF进行持久化;

3.Redis过期键的删除策略

Redis中默认的过期策略:惰性删除跟定期删除;

  1. 惰性删除:操作某个数据的时候才回去判断数据是否过期,过期则删除,以空间换时间;
  2. 定期删除:每隔一段时间扫描redis server中expires字典,过期则删除;
  3. 定时删除:使用定时器设置key的过期时间,到点从dict中删除,以时间换空间;

Redis中有两个Dict对象:
dict:存放的是实际的数据;
expires:存放的是key和过期时间;