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