Redis持久化

快照(默认)

    将内存中的数据以快照的方式写入到二进制文件中,默认文件名是dump.rdb。

    配置自动化做快照持久化(如redis在n秒内如果超过m个key被修改就自动做快照)

      save 900 1       # 900秒内如果超过1个key被修改,则发起快照保存

      save 300 10     # 300秒内如果超过10个key被修改,则发起快照保存

      save 60 10000 # 60秒内如果超过10000个key被修改,则发起快照保存

    快照保存过程

1、redis调用fork,产生父进程和子进程

2、父进程继续处理client的请求,子进程负责将内存的内容写入到临时文件。由于os写时复制机制(copy on write),父子进程共享相同的页面,当父进程处理请求时,os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程地址空间内的数据是fork时刻的整个数据库的一个快照。

3、当子进程将快照写入临时文件完毕之后,用临时文件替换原来的快照文件,然后子进程退出。

    client端可以使用save或者bgsave通知redis做一次快照持久化。

save由于是在主线程中保存快照,由于redis使用一个主线程来处理所有client请求,这种方式会阻塞client请求。

快照持久化的问题:

由于每次快照都是讲数据完整的写入磁盘一次,即将整个Redis中的所有数据都遍历一边到一个扩展名为RDB的数据文件中,并不是增量的只同步变更的数据。如果数据量大,而且写操作较多,必然会引起大量的磁盘IO操作,从而影响性能。

  配置

save 900 1
save 300 10
save 60 10000

# The filename where to dump the DB
dbfilename dump_6379.rdb
 
# Note that you must specify a directory here, not a file name.
dir /opt/redis/

AOF(Append-Only File)

    追加式的日志操作记录

    防止redis意外宕机,丢失最后一次快照后的所有修改,如果应用要求不应该丢失任何修改的话,可以采用AOF持久化。

    使用AOF持久化时,Redis将每个收到的写命令都通过write函数追加到文件中(默认是appendonly.aof)。当Redis重启的时候会通过重新执行文件中保存的写命令,以此来实现重建数据库中的内容。

由于OS会有缓存的机制,所以可以配置Redis通过强制调用fsync函数强制OS写入到磁盘的时机。方式如下:

    启用AOF,appendonly yes

#appendfsync always // 保证最能完全的持久化

appendfsync everysec // 每秒钟写入磁盘一次,在性能和持久化中的这种方式

#appendfsync no // 完全依赖OS,性能最好,持久化保证

    

    AOF持久化的问题:

持久化文件会变的越来越大,例如调用同一条命令做修改100次,那么前99次都是多余的,再恢复数据库时只需要最后一条。为了压缩AOF的持久化文件,Redis提供bgrewriteaof命令,使用与快照的方式类似的方法将内存中的数据以命令的形式保存到临时文件,最后在替换原来的文件。

      1、Redis调用fork,生成父子进程

2、子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的额命令

3、父进程继续处理client请求,除了将写命令写入原来的AOF文件中(保证子进程重写失败),同时缓存收到的写命令。

          4、当子进程完成快照内容写入临时文件后,子进程发信号告知父进程将缓存的写命令写入到临时文件。

5、父进程使用临时文件替换旧的AOF文件,并重命名。

注意事项:

重写AOF文件时,没有读取旧的AOF文件,而是将整个内存中的数据库内容用命令的方式重写一个新的AOF文件。(类似快照)

Redis持久化的更多相关文章

  1. redis持久化RDB和AOF

    Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AO ...

  2. redis——持久化篇

    众所周知,redis是内存数据库,它把数据存储在内存中,这样在加快读取速度的同时也对数据安全性产生了新的问题,即当redis所在服务器发生宕机后,redis数据库里的所有数据将会全部丢失. 为了解决这 ...

  3. redis持久化机制

    redis持久化 redis的数据存在内存中,所以存取性能好.但是存在内存中的数据存在一个问题,一旦机器重启,内存数据消失.为了解决这个问题,redis支持持久化.持久化就是为了解决内存数据丢失时恢复 ...

  4. Redis-cluster集群【第二篇】:redis持久化

    Redis持久化原理: Redis支持两种持久化:RDB和AOF模式 一.名词解释: RDB:持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot).AOF ...

  5. Redis持久化实践及灾难恢复模拟

    参考资料: Redis Persistence http://redis.io/topics/persistence Google Groups https://groups.google.com/f ...

  6. Redis持久化-数据丢失及解决(转载)

    本文转载自        Redis持久化-数据丢失及解决  感谢原作者 Redis的数据回写机制 Redis的数据回写机制分同步和异步两种, 同步回写即SAVE命令,主进程直接向磁盘回写数据.在数据 ...

  7. Redis持久化-数据丢失及解决

    Redis的数据回写机制 Redis的数据回写机制分同步和异步两种, 同步回写即SAVE命令,主进程直接向磁盘回写数据.在数据大的情况下会导致系统假死很长时间,所以一般不是推荐的. 异步回写即BGSA ...

  8. 关于Redis持久化

    Redis有两种持久化的方式:快照(RDB文件)和追加式文件(AOF文件) RDB持久化方式是在一个特定的间隔保存某个时间点的一个数据快照. AOF(Append only file)持久化方式则会记 ...

  9. 解密Redis持久化

    原文 http://blog.nosqlfan.com/html/3813.html 本文内容来源于Redis作者博文,Redis作者说,他看到的所有针对Redis的讨论中,对Redis持久化的误解是 ...

随机推荐

  1. 【MySQL】花10分钟阅读下MySQL数据库优化总结

    1.花10分钟阅读下MySQL数据库优化总结http://www.kuqin.com2.扩展阅读:数据库三范式http://www.cnblogs.com3.my.ini--->C:\Progr ...

  2. jq.validate 自定义验证两个日期

    jq.validate 自定义验证两个日期 首先定义有一个表单,date1和date2是属于表单的元素,若date1大于date2,返回false:若date1<date2,返回true.使用j ...

  3. 标准库String类

    下面的程序并没有把String类的所有成员方法实现,只参考教程写了大部分重要的成员函数. [cpp] view plain copy #include<iostream> #include ...

  4. PM成长之路(一)

    到底什么样的人适合任项目经理一直是很多企业的困惑,因为大家发现优秀项目经理的特质看起来和传统的职能经理或技术专家很不一样.当企业在决定开展一个重大的项目时,如果不能找到一个适合带领和管理项目的项目经理 ...

  5. 小公司0成本基于Pythony的单元\GUI\Web自动化\性能的几个开源软件测试工具

    以下是当前流行的几款适合小公司0成本的几个开源软件测试解决方案: 1.单元测试 a.unittest :Python自带的单元测试框架 b.pyunit:Junit的Python版本 2.使用Pyho ...

  6. 练习JavaScript实现过滤特殊字符

    for循环遍历特殊字符和用户输入字符,然后做比较,返回结果. <script type="text/javascript"> var name = prompt(&qu ...

  7. 【bzoj4008】 HNOI2015—亚瑟王

    http://www.lydsy.com/JudgeOnline/problem.php?id=4008 (题目链接) 题意 给出n个技能,每个技能按顺序有p[i]的可能性释放,可以造成d[i]的伤害 ...

  8. [bigdata] hadoop 参数配置解析

    ResourceManager相关配置参数 yarn-site.xml 中配置 yarn.resourcemanager.address ResourceManager 对客户端暴露的地址.客户端通过 ...

  9. 浅谈:javascript的面向对象编程之具体实现

    下面的javascript代码都是需要使用jQuery插件来做的.希望大家可以搭建好工作环境 首先我们来做一个练习:在一个删除的超链接中添加一个提示信息,提示是否确认删除. 一般情况下我们都会这么做 ...

  10. SOA 实现:服务设计原则

    http://www.ibm.com/developerworks/cn/webservices/ws-soa-design/ 引言 面向服务的体系结构(Service-Oriented Archit ...