`
longzhun
  • 浏览: 370199 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

七.redis 持久化

 
阅读更多

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文件,这点和快照有点类似。

from:http://www.cnblogs.com/xhan/archive/2011/02/07/1949640.html

分享到:
评论

相关推荐

    ServiceStack.Redis-5.8无限制.zip

    Redis是一款开源、高性能、内存中的键值数据库,广泛应用于缓存、消息队列和数据持久化等场景。版本5.8提供了对Redis最新特性和优化的支持。 在ServiceStack.Redis中,主要包含以下关键知识点: 1. **API设计**:...

    StackExchange.Redis .NET4.0

    Redis以内存中的数据存储,但可以通过持久化选项将数据保存到磁盘,以防止数据丢失。 StackExchange.Redis库为.NET开发者提供了以下关键功能和知识点: 1. **连接管理**:StackExchange.Redis使用连接池管理Redis...

    ServiceStack.Redis操作工具类

    7. **持久化和复制**:了解Redis的RDB(快照)和AOF(追加日志)持久化方式,以及如何配置ServiceStack.Redis以支持这些特性。同时,Redis的主从复制功能也能通过ServiceStack.Redis轻松实现。 8. **性能优化**:...

    ServiceStack.redis v3.9.71

    此外,它还支持事务、持久化和主从复制等Redis特性。 StackExchange.Redis.1.2.6是另一个Redis客户端库,尽管它不是ServiceStack.redis的一部分,但常常与ServiceStack.redis一起使用。StackExchange.Redis提供了更...

    (5.9.3.0)ServiceStack.Redis(已取消6000限制)

    Redis是一个高性能的键值数据库,常被用作缓存、消息队列或者数据持久化存储。ServiceStack.Redis提供了一组全面的.NET接口,使得.NET开发者可以方便地利用Redis的各种功能,如字符串、哈希表、列表、集合和有序集合...

    ServiceStack.Redis.dll

    6. **持久化**:ServiceStack.Redis支持Redis的RDB和AOF两种持久化策略,确保数据在系统崩溃或重启后能够恢复。 7. **分片(Sharding)**:对大规模数据进行水平扩展,将数据分布在多个Redis实例上,提高系统的读写...

    ServiceStack.Redis 源码

    Redis 是一个开源的、高性能的键值数据库,常用于缓存、消息队列以及数据持久化等场景。 ServiceStack.Redis 的核心功能包括但不限于: 1. **连接管理**:库中包含了连接池管理,确保高效地复用连接,减少建立和...

    stackexchange.redis.2.0.513.nupkg

    6. **持久化与备份**:通过配置,可以配合Redis的持久化机制,确保数据在服务重启后依然可用。 三、设计原理 1. **线程安全**:StackExchange.Redis采用线程安全的设计,允许多个线程并发访问,避免了多线程环境下...

    ServiceStack.Redis客户端dLL3.0

    除了基本的数据操作,ServiceStack.Redis还支持高级特性,如持久化、事务处理、Lua脚本执行等。Lua脚本可以在服务器端执行,减少网络往返,提高性能。此外,客户端还提供了连接池管理,通过复用连接降低建立和关闭...

    StackExchange.Redis

    8. **持久化和复制**:Redis支持数据持久化(RDB和AOF)以及主从复制,StackExchange.Redis客户端提供了配置这些功能的接口,帮助开发者构建高可用和容错的Redis集群。 9. **监控和性能指标**:客户端提供了一系列...

    TeamDev.Redis.rar

    TeamDev Redis Client , Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 TeamDev.Redis.rar客户端dll文件 C#客户端并且有代码示例

    2.redis运维实战教程资料-详细课件笔记总结

    9.redis的两种持久化方式存储 10.redis的RDB工具分析key的大小 11.redis的主从复制 12.redis的哨兵模式实现主从自动切换,保障主从高可用 13.redis cluster集群搭建,实现分布式数据存储及高可用的主从故障切换 14....

    NServiceKit.Redis

    2. **完整功能**:支持Redis的所有主要操作,包括读写、事务、持久化、复制等。 3. **性能优化**:库经过优化,确保在.NET Framework 4.0下也能提供良好的性能。 4. **线程安全**:在多线程环境中使用时,库提供了...

    ServiceStack.Redis

    2. **持久化**:Redis可以通过RDB(快照)和AOF(追加日志)两种方式实现数据持久化,确保数据在服务器重启后仍然可用。 3. **主从复制**:通过复制机制,可以创建Redis主从集群,提高系统的可用性和读取性能。 4. *...

    Redis从入门到精通2024版 视频教程 下载 百度网盘链接4.zip

    │ 06.Redis 持久化之快照.mp4 │ 07.Redis 持久化之 AOF.mp4 │ 08.Redis 事务[简介].mp4 │ 09.Redis 事务[简单实现].mp4 │ 10.Redis 事务[Java 实现].mp4 │ 11.Redis 主从同步[CAP].mp4 │ 12.Redis 主从...

    Redis6知识点汇总完整版PDF最新版本

    《Redis6知识点汇总》将全面概述Redis 6的知识点,从基本概念到高级应用,涵盖...12.Redis持久化之RDB 13.Redis持久化之AOF 14.Redis_主从复制 15.Redis集群 16.Redis应用问题解决 17.Redis6.0新功能 18.Redis网路模型

    1.redis课程介绍.mp4

    4.持久化 4.1.持久化方式 4.2.RDB对比AOF 5.删除策略 5.1.数据过期 5.2.惰性删除 5.3.数据淘汰 6.主从复制 6.1.互联网"3高" 6.2.主从复制架构 6.3.主从复制流程 6.4.数据同步 6.5.主从架构搭建 6.6.心跳...

    Redis从入门到精通2024版 视频教程 下载 百度网盘链接3.zip

    │ 06.Redis 持久化之快照.mp4 │ 07.Redis 持久化之 AOF.mp4 │ 08.Redis 事务[简介].mp4 │ 09.Redis 事务[简单实现].mp4 │ 10.Redis 事务[Java 实现].mp4 │ 11.Redis 主从同步[CAP].mp4 │ 12.Redis 主从...

    Redis从入门到精通2024版 视频教程 下载 百度网盘链接1.zip

    │ 06.Redis 持久化之快照.mp4 │ 07.Redis 持久化之 AOF.mp4 │ 08.Redis 事务[简介].mp4 │ 09.Redis 事务[简单实现].mp4 │ 10.Redis 事务[Java 实现].mp4 │ 11.Redis 主从同步[CAP].mp4 │ 12.Redis 主从...

Global site tag (gtag.js) - Google Analytics