redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化。redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式。下面分别介绍
Snapshotting
快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久 化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照,下面是默认的快照保存配置
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000
下面介绍详细的快照保存过程
1.redis调用fork,现在有了子进程和父进程。
2. 父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数 据是fork时刻整个数据库的一个快照。
3.当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出。
client 也可以使用save或者bgsave命令通知redis做一次快照持久化。save操作是在主线程中保存快照的,由于redis是用一个主线程来处理所有 client的请求,这种方式会阻塞所有client请求。所以不推荐使用。另一点需要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并不 是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。
另外由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。如果应用要求不能丢失任何修改的话,可以采用aof持久化方式。下面介绍
Append-only file
aof 比快照方式有更好的持久化性,是由于在使用aof持久化方式时,redis会将每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉redis我们想要 通过fsync函数强制os写入到磁盘的时机。有三种方式如下(默认是:每秒fsync一次)
appendonly yes //启用aof持久化方式
# appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
# appendfsync no //完全依赖os,性能最好,持久化没保证
aof 的方式也同时带来了另一个问题。持久化文件会变的越来越大。例如我们调用incr test命令100次,文件中必须保存全部的100条命令,其实有99条都是多余的。因为要恢复数据库的状态其实文件中保存一条set test 100就够了。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。收到此命令redis将使用与快照类似的方式将内存中的数据 以命令的方式保存到临时文件中,最后替换原来的文件。具体过程如下
1. redis调用fork ,现在有父子两个进程
2. 子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令
3.父进程继续处理client请求,除了把写命令写入到原来的aof文件中。同时把收到的写命令缓存起来。这样就能保证如果子进程重写失败的话并不会出问题。
4.当子进程把快照内容写入已命令方式写到临时文件中后,子进程发信号通知父进程。然后父进程把缓存的写命令也写入到临时文件。
5.现在父进程可以使用临时文件替换老的aof文件,并重命名,后面收到的写命令也开始往新的aof文件中追加。
需要注意到是重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。
- 浏览: 31761 次
最新评论
发表评论
-
redis数据库的设计
2015-04-28 16:21 0一数据库结构 Redis 中的每个数据库,都由一个 re ... -
备忘url
2015-04-24 16:24 01:rails实践教程 http://liwei78.g ... -
转载-----redis事务处理
2015-04-21 10:11 0redis对事务的支持目前还比较简单。redis ... -
转载-----redis虚拟内存
2015-04-21 09:23 0首先说明下redis的虚拟内存与os的虚拟内存不是 ... -
redis数据类型----redis学习笔记2
2015-04-16 14:50 01. keys redis本质上一个key-val ... -
redis简介及安装----redis学习笔记1
2015-04-16 14:48 01.简介 redis是 ... -
搭建高可用mongodb集群(三)—— 分片
2015-04-13 14:50 595按照上一节中《搭建高可用mongodb集群(二)—— 深入 ... -
搭建高可用mongodb集群(四)—— 分片
2015-04-13 11:27 328按照上一节中《搭建高可用mongodb集群(三)—— 深入副 ... -
搭建高可用mongodb集群(二)—— 副本集
2015-04-13 11:22 447在上一篇文章《搭建高可用mongodb集群(一)—— 副本 ... -
搭建高可用的MongoDB集群(一):MongoDB的配置与副本集
2015-04-13 10:03 1733传统的关系数据库具有不错的性能及稳定性,同时,久经历 ... -
MongoDB 标准连接字符串
2015-04-10 15:22 454在一篇文章中看到这 ... -
MongoDB整库备份与还原以及单个collection备份、恢复方法
2015-04-10 11:15 587mongodump.exe备份的原理 ... -
MongoDB为用户设置访问权限
2015-04-10 11:02 628MongoDB已经使用很长一 ... -
MongoDB加入到Windows服务的方法
2015-04-10 10:25 556这篇文章主要介绍了Windows中把MongoDB加入到本地 ... -
MongoDB,无模式文档型数据库简介及安装
2015-04-10 09:44 592MongoDB是一个高性能,开源,无模式的文档型数据库,是 ... -
MongoDB -----Java操作MongoDB
2015-04-09 17:00 561java驱动程序是Mongodb中的驱动程序之一,也是比 ... -
NoSQL数据库的基础知识
2015-04-09 15:00 546关系型数据库和NoSQL数 ... -
Spring mvc controller参数绑定以及返回类型总结
2015-03-20 17:17 0一:controller中如何返回值到前台 1.对于spr ... -
概念模型、逻辑模型、物理模型的区别
2012-03-29 11:13 41321.1 概念模型 概念模型是对真实世界中问题域内的 ... -
ERP和SAP的含义
2011-11-16 17:20 1666ERP是英文Enterprise Resource Plann ...
相关推荐
redis持久化,看完完全懂redis持久化,看完完全懂redis持久化,看完完全懂redis持久化,看完完全懂redis持久化,看完完全懂redis持久化,看完完全懂redis持久化,看完完全懂redis持久化,看完完全懂redis持久化,看...
02-Redis持久化、主从与哨兵架构详解.zip
解密Redis持久化
02-Redis持久化、主从与哨兵架构详解02-Redis持久化、主从与哨兵架构详解02-Redis持久化、主从与哨兵架构详解02-Redis持久化、主从与哨兵架构详解02-Redis持久化、主从与哨兵架构详解02-Redis持久化、主从与哨兵架构...
06_redis 持久化.pdf
主要介绍Redis持久化、主从与哨兵架构详解,详细具体,可操作性好!
介绍redis两种持久化方式及配置,以及它们各自的优缺点
Redis持久化、主从与哨兵架构详解(1)
很不错的redis持久化详细方案书籍,能帮助初学者快速的入门redis框架和运用。
redis,持久化,主要说明了redis中的两种持久化方式,是可以值得参考的
Redis windows 测试redis持久化功能1
Redis持久化以及集群部署
Redis 有两种持久化方案,RDB (Redis DataBase)和 AOF (Append Only File)。如果你想快速了解和使用RDB和AOF,可以直接跳到文章底部看总结。本章节通过配置文件,触发快照的方式,恢复数据的操作,命令操作演示...
redis持久化 rar
Redis持久化 RDB快照(snapshot) 在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存...
Redis持久化锦囊在手,再也不会担心数据丢失了(csdn)————程序
Redis持久化策略详解
基于北京尚硅谷周阳老师讲解的redis。个人学习总结: 包含redis常用命令,redis配置文件,redis持久化,redis事务,redis主从复制,jedis的使用。
Macbook Pro进行Docker安装Redis并配置Redis持久化
Redis持久化 - RDB和AOF