Redis是基于内存的,如果不想办法把数据保存到硬盘上,一旦Redis出现故障(退出/故障),内存数据将全部丢失
- 我们肯定不想Redis里面的数据由于某些故障全部丢失(导致请求都走DB),即便发生了也希望可以将Redis数据全部恢复过来,这就是持久化的作用
Redis提供了两种持久化方案
- RDB(基于快照):将某一时刻的所有数据保存到一个RDB文件
- AOF(Append-only-file):当Redis服务器执行写命令的时候,将执行的写命令保存到AOF文件
1.1 RDB(快照持久化)
RDB持久化可以手动执行,也可以根据服务器配置定期执行。RDB持久化生成的是一个经过压缩的二进制文件,Redis可以通过这个文件还原数据库的数据
有两个命令可以生成RDB文件:
SAVE
会阻塞Redis服务器进程,服务器不能接受任何请求,知道RDB文件创建完毕为止BGSAVE
创建出一个子进程,由子进程来负责创建RDB文件,服务器进程可以继续接受请求
Redis服务器在启动的时候,如果发现有RDB文件,就会自动载入RDB文件(不需要人工干预)
- 服务器在载入RDB文件过程中,会处于阻塞状态,直到载入工作完成
除了手动调用SAVE
或者BGSAVE
命令生成RDB文件之外,我们还可以通过配置的方式定期执行:
在默认的配置下,如果以下条件被触发,就会执行BGSAVE
命令
save 900 1 #在900秒(15分钟)之后,至少有1个key发生变化,
save 300 10 #在300秒(5分钟)之后,至少有10个key发生变化
save 60 10000 #在60秒(1分钟)之后,至少有10000个key发生变化
复制代码
总结:通过手动调用SAVE
或者BGSAVE
命令或者配置条件触发,将数据库某一时刻的数据快照,生成RDB文件实现持久化
1.2 AOF(文件追加)
- AOF是通过保存Redis服务器所执行的写命令来记录数据库的数据
AOF持久化功能的实现可以分为3个步骤:
- 命令追加:命令写入aof_buf缓冲区
- 文件写入:调用flushAppendOnlyFile函数,考虑是否要将aof_buf缓冲区写入AOF文件中
- 文件同步:考虑是否将内存缓冲区的数据真正写入到硬盘
flushAppendOnlyFile函数的行为由服务器配置的appendfsyn选项来决定的:
appendfsync always # 每次有数据修改发生时都会写入AOF文件。
appendfsync everysec # 每秒钟同步一次,该策略为AOF的默认策略。
appendfsync no # 从不同步。高效但是数据不会被持久化。
复制代码
声明:本文仅为个人摘抄整理,作为以后回顾使用。若有错误,请指正