1,redis 优缺点
优点:redis将数据都存储在内存中,所以访问速度快。
缺点:重启后内存中的数据将全部丢失。
2,持久性
持久性:redis 将数据从内存中以某种形式同步到硬盘,使得重启后可以根据硬盘中的记录恢复数据。
3,持久性的两种方式
- RDB方式:根据指定的规则“定时”将内存中的数据存储在硬盘上。
- AOF方式:在每次执行命令后将命令本身记录下来。
4,RDB方式
rdb方式的持久性,当符合一定条件时,redis会自动将内存中的所有数据生成一份副本并存储在硬盘上,这个过程称为快照。
快照原理,过程如下:
- redis 使用fork 函数复制一份当前进程(父进程)的副本(子进程);
- 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件;
- 当子进程写入完所有数据后会用临时文件替换旧的rdb 文件,至此一次快照操作完成。
redis在快照过程中不会修改rdb 文件,只有快照结束后才会将旧的文件替换成新的,也就是任何时候rdb 文件都是完整的。
redis 启动后会读取rdb 快照文件,将数据从硬盘载入内存。
通过rdb 持久化,一旦redis 异常退出,就会丢失最后一次快照以后更改的所有数据。
5,rdb 快照的几种情况
- 根据配置规则进行自动快照。
- 用户执行 save 或 bgsave。
- 执行flushall 命令。
- 执行复制(replication)。
5.1 根据配置规则进行自动快照
进行快照的条件可以由用户在配置文件中自定义,由两个参数构成:时间窗口M 和改动的键的个数N。每当时间M 内被更改的键的个数大于N 时,即符合自动快照条件。
save 900 1 (在15分钟内有一个或一个以上的键被更改则进行快照,15分钟=900秒)
save 300 10 (在300秒内至少有10个键被更改)
save 60 10000
每条快照条件占一行,并且以save 参数开头。同时可以存在多个条件,条件之间是“或”的关系。
5.2 用户执行save 或bgsave 命令
这是手动执行快照。区别是save 命令,在快照 执行过程中,redis 会阻塞所有来自客户端的请求;而bgsave 可以在后台异步地进行快照操作,快照的同时服务器还可以继续响应来自客户端的请求。
5.3 执行flushall 命令
flushall 命令,redis 会清除数据库中所有数据。
- 当自动快照条件不为空时,不论清空数据库的过程是否触发了自动快照的条件,redis 就会执行一次快照操作;
- 当没有定义自动快照条件时,执行flushall 时不会进行快照。
5.4 执行复制
当设置了主从模式时,redis 会在复制初始化时进行自动快照。即使没有定义自动快照条件,并且没有手动执行过快照操作,也会生成rdb 快照文件。
6,AOF 方式
AOF 将执行的每一条命令追加到硬盘文件中,当使用redis 存储非临时数据时,一般需要打开aof 持久化来降低进程中止导致的数据丢失。
6.1 AOF 方式开启
默认情况redis 是关闭的,可以通过appendonly 参数启用:
appendonly yes
开启aof 后,每执行一条更改redis 中数据的命令,redis 就会将该命令写入硬盘中的AOF 文件。
6.2 AOF 实现
AOF 文件以纯文本的形式记录了redis 执行的写命令,该内容正是redis 客户端向redis 发送的原始通信协议的内容。
在启动时redis 会逐个执行 aof文件中的命令将硬盘中的数据载入到内存中,载入的速度相较rdb 会慢一些。