【redis】缓存-持久化

3 阅读2分钟

提问:redis作为缓存,数据持久化怎么做到的?

回答:有两种方式:RDB和AOF

RDB:全程Redis Database Backup file(redis数据备份文件),也叫做redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中,当redis实例故障重启后,从磁盘中读取快照文件,恢复数据。

通过在bgsave开始时fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入RDB文件。
fork采用copy-on-write技术:

  • 当主进程执行读操作,访问共享内存
  • 当主进程执行写操作,则会拷贝一份数据,执行写操作

AOF:全程Append Only File(追加文件)。redis处理的每一个写命令都会记录在AOF文件下,可以看作命令日志文件。
因为是记录命令,AOF文件会比RDB文件大很多。且AOF会记录对同一个key多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少命令达到相同效果。

RDB和AOF对比:

RDBAOF
持久化方式定时对整个内存做快照记录每一次执行命令
数据完整性不完整,两次备份之间会丢失相对完整,取决于刷盘策略
文件大小会有压缩,文件体积较小记录命令,文件体积很大
宕机恢复速度很快
数据恢复优先级低,因为数据完整性不如AOF高,因为数据完整性更高
系统资源占用高,大量cpu和内存消耗低,主要是磁盘IO资源,但AOF重写会占用大量cpu和内存
使用场景可以容忍数分钟数据丢失,追求更快启动速度对数据安全性要求较高