众所周知,redis 是基于内存的,一般来说,机器挂了的话,内存中的数据就丢失了。我们如何保护redis 中数据的安全性呢?redis 本身提供了数据持久化机制,也就是将数据同时存储在磁盘中,每次redis 重启后就会从硬盘加载数据到内存。
redis 提供了两种不同的数据持久化方式,一种是快照,他是将某一时刻的数据写到硬盘中,另一种是只追加文件,他会在执行写命令时将写命令复制到硬盘中,这两者可以同时使用,也可以单独使用。
快照持久化
主要有以下几种方式:
1) 客户端向redis 发送 BGSAVE命令来创建快照,这时redis 会fork 一个子进程负责将数据写入硬盘,父进程继续处理命令请求。
2)客户端向redis 发送 SAVE 命令来创建一个快照,接受SAVE命令的服务器在快照创建完成前,不再响应其他命令,这个不常用
3)用户创建 SAVE 选项 如 save 60 10000 ,那么redis 就会从最近一次创建快照开始算,只要有 60秒内 10000 次的写入, redis 就会自动执行 BGSAVE
4)当 redis 接受 SHUTDOWN 命令,或者收到 TERM 信号时,就会 执行SAVE,执行完毕后关闭
5)当一个redis 服务器连接另一个redis服务器,并向对方发送 SYNC命令进行复制操作,如果主服务器没有执行BGSAVE或者并非刚刚执行完BGSAVE命令,那么主服务器就会执行 BGSAVE命令。
快照只适用于,对于丢失一部分数据不会影响的系统,也不适用于 内存数据量过大的系统
只追加文件(AOF持久化)
通过设置 appendonly yes 来打开。 appendfsync 选项 设置为 always 会频繁对磁盘写入,使用固态硬盘的用户应该注意,这会降低固态硬盘的寿命。用户可以设置 appendfsync eversysec 每秒进行写入。appendfsync no 则由操作系统决定何时写入,不推荐使用。但随着时间推移 AOF文件体积会逐渐增大,用户可以发送 BGREWRITEAOF 来重写 AOF文件,使其体积尽可能小。也可以配置redis 自动 rewrite AOF 文件。
上面是redis 持久化的介绍。当然只有持久化是不够的,我们还需要数据备份。“不要把鸡蛋放到同一个篮子里”。之后我们会介绍 redis 的主从复制。