细说Redis持久化机制
概述
Redis不仅能够作为缓存来使用,也能够作为内存数据库。
Redis作为内存数据库使用时。必需要解决一个问题:数据的持久性。有些将Redis作为缓存使用的场景也需要将缓存的数据持久化到存储介质上,这样在Redis重新启动后仍然能对热点数据提供缓存服务。不会由于缓存数据的缺失而对整个系统造成冲击。
本文就Redis内置的持久化机制进行说明。
Redis持久化方式
Redis内置的持久化方式有两种:快照方式和AOF方式。
快照方式是将某一时点的内存数据写到硬盘上。AOF方式是将写入的命令记录在硬盘上的文件中。以下具体说明这两种方式。
快照方式
快照方式能够将一个时点的内存数据保存到硬盘。保存快照之后Redis重新启动时能够读取快照文件而恢复数据,也能够使用快照来建立复制相应的Redisserver。
快照持久化模式
既然快照是保存某一个时点的内存数据,那么就要求在进行快照时内存数据不能发生变化。关于这点Redis有两种模式:SAVE和BGSAVE。SAVE模式首先使Redis停止服务,然后将这个时点的Redis内存数据写入到硬盘中。等完毕写入后Redis開始提供服务,这个过程通常会比較长,在生产环境中使用的场景较少。
BGSAVE模式会使用fork命令拷贝Redis的内存,在fork过程中Redis也会停止对外服务,但这个过程很快。在实体机或者VMWare和KVM中1G的内存拷贝大概在10-20ms,而在Xen中要稍慢些,大概在200-300ms。
拷贝内存完毕后,拷贝的这份内存数据開始持久化到硬盘。同一时候Redis也继续对外提供服务。
SAVE模式对Redis可用性影响非常大。可能使Redis在一段较长时间内无法提供服务。BGSAVE模式对Redis可用性影响较小,1G的内存数据会使Redis中断服务10-20ms。这个数值在普通情况下是能够接受的,可是由于BGSAVE是使用fork机制,这就要求fork时系统的可用内存至少要和Redis占用的内存一样大。
快照的触发条件
触发Redis进行内存快照持久的条件有下面几种:
- 给Redisserver发送BGSAVE命令,这将触发Redis进行BGSAVE模式的快照持久。
- 给Redisserver发送SAVE命令。这将触发Redis进行SAVE模式的快照持久。
- Redis接收到SHUTDOWN命令或者TERM信号,将触发Redis进行SAVE模式的快照持久。之后Redis停止。
- 在主从结构中。当从Redis同步主Redis时间太长时。主Redis会触发BGSAVE模式的快照持久。
- 在配置文件的save属性中配置Redis在某个条件满足时进行持久,这会触发Redis进行BGSAVE模式的持久。比如,在配置文件里配置`save 60 10000`。意为假设在60s内发生了10000次写操作那么Redis将启动BGSAVE操作。在配置文件里能够配置多个save,当有一个save条件满足时。Redis就运行BGSAVE操作。
快照配置的參数
| 參数名称 | 參数值 | 參数解释 |
| save | m秒 n次,比方60 1000 | 配置触发快照的条件。"60 1000"表示假设在60s内发生了1000次写操作。那么Redis就要进行持久操作 |
| stop-writes-no-bgsave-error | yes,no | 配置在BGSAVE错误发生时是否停止 |
| rdbcompression | yes,no | 配置是否对持久数据进行压缩 |
| dir | 文件夹路径,比方./ | 配置持久文件保存的文件夹 |
| dbfilename | 持久文件名称。比方dump.rdb | 配置持久文件名称 |
快照存在的问题
从上面的说明能够看出,快照持久化方式是基于时间点的,假设在一次快照完毕,下一次快照还没開始之前Redis崩溃了,那么上一快照之后的数据变化将会丢失。
在BGSAVE模式下,假设在快照刚结束时Redis崩溃,那将会丢失内存拷贝之后的发生变化的数据。
AOF方式
文件同步方式
- always : Redis在每次有写操作发生时都会同步到硬盘,这样的方式会给IO带来非常大压力,实际中写入的速率要考虑硬盘的IO速率。
- everysec :Redis每1秒将日志同步到硬盘。这样的方式性能较好,但也意为着假设Redis崩溃那么将丢失1秒的数据。
- no : Redis不主动控制内存缓存区和硬盘的同步,而由操作系统来控制。
这样的方式不可控,一般不採用。
Rewriting/compacting AOF
为了解决问题Redis提供了BGREWRITEAOF命令来重建日志。
BGREWRITEAOF执行机制
BGREWRITEAOF存在的问题
- fork时要暂停Redis对外服务
- 须要系统为fork保留内存空间
除此之外,BGREWRITEAOF还有这自己的问题:
- 由于要替换日志文件,假设日志文件很大。比方几十G,那么替换日志文件的时间也会比較长。
AOF配置的參数
AOF配置的參数
| 參数名称 | 參数值 | 參数解释 |
| appendonly | yes,no | 配置是否开启AOF持久机制 |
| appendfsync | always,everysec,no | 配置AOF持久机制的同步策略 |
| no-appendfsync-on-rewirte | yes,no | 配置在重建日志时是否继续进行AOF |
| auto-aof-rewrite-percentage | 百分比值 比方100 |
配置触发重建日志的条件:当前日志大小和最后一次重建日志大小的比例,这里的"100"意为当前日志大小超过最后一次重建日志大小100%时。将可能触发重建日志操作。 |
| auto-aof-rewrite-min-size | 日志文件大小 比方64mb |
配置触发重建日志的条件:当前日志大小的最小值,这里的"64mb"意为当前日志超过64mb时,将可能触发重建日志操作。
要注意的是:auto-aof-rewrite-percentage和auto-aof-rewrite-min-size必须同一时候满足才干够触发重建日志操作。 |
| dir | 文件夹路径 比方./ |
配置持久文件保存的文件夹 |
持久化方式比較
| 持久化方式 | 可用性影响 | 数据丢失 | 内存占用 | IO负荷 | 硬盘空间占用 |
| SAVE | 高 | 分钟级 | 小 | 高 | 较低 |
| BGSAVE | 较小 | 分钟级 | 大 | 高 | 较低 |
| AOF | 小 | 秒级 | 小 | 较高 | 高 |
| AOF+BGREWRITEAOF | 较小 | 秒级 | 大 | 最高 | 较高 |
细说Redis持久化机制的更多相关文章
- 浅谈:Redis持久化机制(一)RDB篇
浅谈:Redis持久化机制(一)RDB篇 众所周知,redis是一款性能极高,基于内存的键值对NoSql数据库,官方显示,它的读效率可达到11万次每秒,写效率能达到8万次每秒,因为它基于内存以及存 ...
- 浅谈:Redis持久化机制(二)AOF篇
浅谈:Redis持久化机制(二)AOF篇 上一篇我们提及到了redis的默认持久化方式RDB,是一种通过存储快照数据方式持久化的机制,它在宕机后会丢失掉最后一次更新RDB文件后的数据,这也是由于它 ...
- 北京大公司二面:了解Redis持久化机制吗?
今日总结 Redis持久化机制:RDB和AOF RDB持久化:定时任务,BGSAVE命令 fork一个子进程生成RDB文件(二进制) AOF持久化:根据配置将写命令存储至日志文件中,顺序写&& ...
- redis持久化机制
redis持久化 redis的数据存在内存中,所以存取性能好.但是存在内存中的数据存在一个问题,一旦机器重启,内存数据消失.为了解决这个问题,redis支持持久化.持久化就是为了解决内存数据丢失时恢复 ...
- Redis 持久化机制
1.背景 之前在使用redis 时候,没有过多的考虑持久化! 但是这样即使你用了redis 也是徒劳,表面上你是用上了redis 进行缓存数据,感觉已经给自己的架构添加了一个道QPS 防护墙! 哈哈, ...
- redis持久化机制【十三】
一.Redis提供了哪些持久化机制: redis的高性能是因为其所有数据都存在了内存中 ,为了使redis在重启之后数据仍然不丢失,需要将数据同步到硬盘中,这一过程就是持久化. redis支持两种方式 ...
- Redis持久化机制,优缺点,如何选择合适方式
一.什么是Redis持久化? 持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失. 二.Redis 的持久化机制是什么?各自的优缺点? Redis 提供两种持久化机制 RDB(默认) 和 ...
- Redis持久化机制 RDB和AOF的区别
一.简单介绍 Redis中的持久化机制是一种当数据库发生宕机.断电.软件崩溃等,数据库中的数据无法再使用或者被破坏的情况下,如何恢复数据的方法. Redis中共有两种持久化机制 RDB(Redis D ...
- 源码级别理解 Redis 持久化机制
文章首发于公众号"蘑菇睡不着",欢迎来访~ 前言 大家都知道 Redis 是一个内存数据库,数据都存储在内存中,这也是 Redis 非常快的原因之一.虽然速度提上来了,但是如果数据 ...
随机推荐
- 解决前端工程师与UI设计协同工作的问题
前端工程师与UI设计协同工作主要环节在于设计图与前端界面是否一致.(还原度) 不得不说,设计图与前端界面实现不一致的问题时有发生.(好吧,我经验有限)所以经常写完的前端页面都需要去修改.(特别是做移动 ...
- 大数据学习——sparkSql对接mysql
1上传jar 2 加载驱动包 [root@mini1 bin]# ./spark-shell --master spark://mini1:7077 --jars mysql-connector-j ...
- python风格之包导入
导入总应该放在文件顶部, 位于模块注释和文档字符串之后, 模块全局变量和常量之前. 导入应该按照从最通用到最不通用的顺序分组: 标准库导入 第三方库导入 应用程序指定导入 每种分组中, 应该根据每个模 ...
- 九度oj 题目1083:特殊乘法 清华大学2010年机试题目
题目描述: 写个算法,对2个小于1000000000的输入,求结果. 特殊乘法举例:123 * 45 = 1*4 +1*5 +2*4 +2*5 +3*4+3*5 输入: 两个小于1000000000的 ...
- HDU1877 又一版 A+B
Problem Description 输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数. Input 输入格式:测 ...
- 【bzoj2802】[Poi2012]Warehouse Store 贪心+堆
题目描述 有一家专卖一种商品的店,考虑连续的n天.第i天上午会进货Ai件商品,中午的时候会有顾客需要购买Bi件商品,可以选择满足顾客的要求,或是无视掉他.如果要满足顾客的需求,就必须要有足够的库存.问 ...
- cssText批量修改样式
cssText所有浏览器都支持. cssText 的使用 obj.style.cssText = " width:200px;position:absolute;left:100px;&qu ...
- 【NOI2017】游戏
好久没写 $2-sat$ 了……(话说这东西哪里还考过) 题意 有 $3$ 种赛车 $A,B,C$ 和 $4$ 种赛道 $a,b,c,x$,赛车 $A$ 不适用于赛道 $a$,赛车 $B$ 不适用于赛 ...
- iOS-Core Data基础
Core Data基础 Core Data是一个API集合,被设计用来简化数据对象的持久存储. 在此先不普及概念,先通过一个简单的案例使用来感受一下Core Data的精妙之处. 在创建工程的时候勾选 ...
- 开源编辑器ueditor
http://ueditor.baidu.com/website/onlinedemo.html