Redis
为了内部数据
的安全考虑
,会把自己的数据以文件
的形式保存
到硬盘中
一份,在服务器重启
后会自动
把硬盘
的数据恢复
到内存
(Redis)里面html
Redis持久化
分为:redis
RDB 持久化方式数据库
AOF 持久化方式segmentfault
两种持久化能够同时开启缓存
RDB 持久化
是指在指定的时间间隔内
将内存中
的数据
快照写入磁盘
,实际操做过程是 fork
一个子进程,先将数据
写入临时文件
,写入成功后,再替换
以前的文件,用二进制压缩存储安全
Redis 将数据库快照保存在名字为 dump.rdb
的二进制文件中服务器
RDB 持久化快照名称与路径(redis.conf 文件):app
RDB持久化备份频率:工具
$ save 900 1 #900秒内若是超过1个key被修改,则发起快照保存 $ save 300 10 #300秒内若是超过10个key被修改,则发起快照保存 $ save 60 10000 #60秒内若是超过10000个key被修改,则发起快照保存
优势:性能
很是适合于备份,好比你能够在每一个小时
保存一下过去24小时内的数据,同时天天保存
过去30天的数据,这样即便出了问题你也能够根据需求恢复
到不一样版本
的数据
很方便传送到远端数据中心,很是适用于灾难恢复
RDB
在保存 RDB
文件时父进程
惟一须要作的就是 fork
出一个子进程,接下来的工做所有由子进程
来作,父进程不须要再作其余 IO
操做,因此 RDB
持久化方式能够最大化 Redis
的性能
4.与 AOF
相比,在恢复大的数据的时候,RDB
效率更高
缺点:
若是你想保证数据的高可用性
,即最大限度
的避免数据丢失
,那么 RDB
将不是一个很好的选择。由于系统一旦在定时持久化以前出现宕机现象
,你可能会丢失几分钟的数据
因为 RDB
是经过 fork
子进程来协助完成数据持久化工做的,所以,若是当数据较大
时,可能会致使整个服务器中止
服务几百毫秒
,甚至是1秒钟
手动发起RDB持久化方式:
输入 save
或者 bgsave
(bgsave 是开启单独线程)
AOF 持久化
以日志的形式记录服务器所处理的每个写、删除操做,查询操做
,当服务器重启
的时候会从新执行
这些命令来恢复
原始的数据
开启 AOF
持久化(redis.conf)
注:
重启 Redis 才生效
AOF 持久化名称与路径:
AOF 持久化备份频率:
# 每次有新命令追加到 AOF 文件时就执行一次同步 :很是慢,也很是安全 $ always # 每秒同步一次:足够快(和使用 RDB 持久化差很少),而且在故障时只会丢失 1 秒钟的数据 # 推荐(而且也是默认)的措施为每秒同步一次, 这种策略能够兼顾速度和安全性 $ everysec # 从不一样步:将数据交给操做系统来处理。更快,也更不安全的选择 $ no
AOF 持久化备份优化:
由于 AOF
的运做方式是不断地将命令追加到文件的末尾, 因此随着写入命令的不断增长, AOF
文件的体积也会变得愈来愈大
例如, 若是你对一个计数器调用了 100
次 INCR
, 那么仅仅是为了保存这个计数器的当前值, AOF
文件就须要使用 100 条记录(entry)。然而在实际上, 只使用一条 SET
命令已经足以保存计数器的当前值了, 其他 99 条记录实际上都是多余的
输入 bgrewriteaof
命令优化 AOF
文件
AOF 文件损坏:
服务器可能在程序正在对 AOF
文件进行写入时宕机
, 宕机会形成了 AOF
文件出错(corrupt), 那么 Redis
在重启时会拒绝载入
这个 AOF
文件, 从而确保数据
的一致性
不会被破坏。
修复出错的 AOF
文件:
为现有的 AOF
文件建立一个备份
使用 Redis
附带的 redis-check-aof
程序,对原来的 AOF
文件进行修复:
$ redis-check-aof –fix
使用 diff -u
对比修复后的 AOF
文件和原始 AOF
文件的备份,查看
两个文件之间的不一样
之处
重启 Redis
服务器,等待服务器载入修复后的 AOF
文件,并进行数据恢复
优势:
AOF
持久化能够带来更高的数据安全性。Redis
中提供了3种
同步策略,即每秒同步
、每修改同步
和不一样步
。使用默认的每秒同步
其效率也是很是高的(同步是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒
的数据
AOF
文件是一个只进行追加
的日志文件,因此不须要写入 seek
,即便因为某些缘由(磁盘空间已满,写的过程当中宕机等等)未执行完整的写入命令,你也也可以使用 redis-check-aof
工具修复这些问题
Redis
能够在 AOF
文件体积变得过大时,自动地在后台对 AOF
进行重写: 重写后的新 AOF
文件包含了恢复当前数据
所需的最小命令集合。 整个重写操做是绝对安全
的,由于 Redis
在建立新 AOF
文件的过程当中,会继续将命令追加
到现有的 AOF
文件里面,即便重写过程当中发生宕机
,现有的 AOF
文件也不会丢失。 而一旦新 AOF
文件建立完毕,Redis
就会从旧 AOF
文件切换到新 AOF
文件,并开始对新 AOF
文件进行追加
操做
AOF
文件有序地保存了对数据库执行的全部写入操做, 这些写入操做以 Redis
协议的格式保存, 所以 AOF
文件的内容很是容易被人读懂, 对文件进行分析(parse)也很轻松。 导出(export) AOF
文件也很是简单: 举个例子, 若是你不当心执行了 FLUSHALL
命令, 但只要 AOF
文件未被重写, 那么只要中止服务器, 移除 AOF
文件末尾的 FLUSHALL
命令, 并重启 Redis
, 就能够将数据集恢复到 FLUSHALL
执行以前的状态
缺点:
对于相同
的数据来讲,AOF
文件一般要大于 RDB
文件
根据同步策略
的不一样
,AOF
的运行效率
可能会慢于 RDB
。总之,每秒同步
策略的效率是比较高的,同步禁用
策略的效率和 RDB
同样高效。不过在处理巨大的写入载入
时,RDB
能够提供更有保证的最大延迟时间(latency)
在 Redis 2.2
或以上版本,能够在不重启
的状况下,从 RDB
切换到 AOF
:
为最新的 dump.rdb 文件建立一个备份
将备份放到一个安全的地方
执行如下两条命令:
# 开启 AOF 功能,Redis 会阻塞直到初始 AOF 文件建立完成为止 # 以后 Redis 会继续处理命令请求, 并开始将写入命令追加到 AOF 文件末尾 $ redis-cli config set appendonly yes # 关闭 RDB 功能 $ redis-cli config set save
确保写命令
会被正确
地追加
到 AOF
文件的末尾注:
在redis.conf
中打开 AOF
功能,不然服务器重启以后, 以前经过 CONFIG SET
设置的配置就会被遗忘
, 程序会按原来
的配置
来启动
服务器。
若是你对数据安全性很是重视
的话,你应该同时使用两种持久化
功能
若是你承受数分钟之内的数据丢失
,你能够只使用 RDB 持久化
两者选择的标准,就是看是否愿意牺牲一些性能
,换取更高的缓存一致性
(AOF),仍是愿意写
操做频繁
的时候,不启用备份
来换取更高的性能
,待手动运行 save
的时候,再作备份(RDB)。注:
将来 Redis
可能会将 AOF
和 RDB
整合成单个持久化模型
.
相关文档:
英文:https://redis.io/topics/persi...
中文:http://www.redis.cn/topics/pe...