`
天府小茶客
  • 浏览: 12803 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Redis持久化、主从备份、与memcache对比

阅读更多

redis持久化的两种方式:

 

数据持久化通俗讲就是把数据保存到磁盘上,保证不会因为断电等因素丢失数据。

redis 需要经常将内存中的数据同步到磁盘来保证持久化。redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式。先介绍下这两种dump方式再讲讲自己遇到的一些现象和想法,前面的内容是从网上整理出来的。

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

 

这两种持久化方式有各自的特点,快照相对性能影响不大,但一旦崩溃,数据量丢失较大,而aof数据安全性较高,但性能影响较大,这就得根据业务特点自行选择了。

 

Redis& Memcached:

1  Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

2  Redis支持数据的备份,即master-slave模式的数据备份。

3  Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

 

Redis的主从备份过程:

 

 redis的主从复制策略是通过其持久化的rdb文件来实现的,其过程是先dump出rdb文件,将rdb文件全量传输给slave,然后再将dump后的操作实时同步到slave中

分享到:
评论

相关推荐

    MemCache和Redis缓存介绍

    - **主从复制**:Redis支持主从复制,可以实现数据的冗余备份和故障切换。 - **网络协议**:Redis使用自定义的二进制协议,提高了网络通信效率。 4. **适用场景**:由于其丰富的数据结构和持久化功能,Redis常...

    ehcache memcache redis 差异

    对比这三种缓存系统,Ehcache更适合Java环境,尤其是需要本地缓存和持久化的场景;Memcached因其简单、高性能而适用于快速读取大量数据的场景;而Redis由于其丰富的数据结构和持久化功能,更适用于复杂的应用场景,...

    session共享之memcache Redis

    - **工作原理**:与Memcache类似,但Redis提供更丰富的数据结构,并支持持久化到磁盘,可以确保在服务重启后恢复数据。 - **优点**:高性能,支持多种数据结构,可以进行复杂操作;提供持久化,数据安全性更高;...

    memcached数据完整迁移到redis

    此外,Redis 提供持久化、事务处理、发布/订阅消息系统等高级功能,并且可以作为主从复制的中心节点,实现高可用性。 **迁移原因** 从 Memcached 迁移到 Redis 可能出于以下原因: 1. **数据持久化**:Memcached ...

    包含Redis,memcache,encache的NoSQL入门

    同时,Redis还支持持久化,可以将内存中的数据定期或在特定事件后保存到磁盘,以防止数据丢失。此外,Redis还提供了发布/订阅模式,使得消息传递成为可能。 **Memcached** 是另一个常见的分布式内存对象缓存系统,...

    选redis还是memcache

    2. **持久化需求**:对于需要缓存数据持久化的场景,如需要缓存的数据在服务器重启后仍然保持有效,Redis支持多种持久化方式(如RDB和AOF),而Memcached则不具备此功能。然而,需要注意的是,Redis的持久化功能并不...

    Java开发中的Memcache原理及实现以及Redis的入门

    4. **主从复制与集群**: Redis支持主从复制,可以实现数据备份和读写分离。Redis Cluster是其官方提供的分布式解决方案,能自动将数据分散在多个节点上,实现水平扩展。 5. **高级功能**: Redis还提供了发布/订阅、...

    memcache与redis

    标题“memcache与redis”指出我们将探讨两种流行的键值存储系统——Memcached和Redis。这两种技术都是用于数据缓存和快速访问的高性能解决方案,广泛应用于Web开发和其他需要高效数据处理的场景。 描述部分虽然为空...

    redis安装与配置1

    Redis 以其内存存储和持久化特性,解决了 Memcache 的数据易丢失问题,确保了服务的高可用性。 Redis 的安装通常涉及以下步骤: 1. **下载**:从官方网站(http://redis.io/download)获取最新版的 Redis 压缩包。...

    redis 下载安装

     实现数据持久化的两种方式:(1)使用截图的方式,将内存中的数据不断写入磁盘(性能高,但可能会引起一定程度的数据丢失) (2)使用类似mysql的方式,记录每次更新的日志4、Redis的主从同步:对提高读取性能...

    竞品分析之redis强于memcached_memcached集群

    竞品分析之redis强于memcached ...1.redis支持持久化(存盘),memcache只能存在内存中 2.redis的速度比memcached快很多.Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求 ...

    Redis,快看看这40道面试题.pdf

    6. **Memcache与Redis的区别** - **数据结构**:Memcached只支持字符串类型,而Redis支持多种数据结构。 - **持久化**:Memcached不支持数据的持久化,而Redis支持。 - **主从复制**:Redis支持主从复制,而...

    Redis 面试题全解析1

    3. Memcache 与 Redis 的主要区别在于 Redis 提供更多数据结构和持久化选项,而 Memcache 只支持简单的键值对,且不支持持久化。 二、Redis 数据结构与指令 1. Redis 支持的数据类型包括字符串(String)、哈希(Hash)...

    redis 问题.pdf

    五、Redis持久化 Redis提供了RDB(快照)和AOF(日志)两种持久化方式,RDB在特定时间点生成数据库快照,AOF记录每次写操作日志,恢复时读取日志重放操作。 六、Redis常见性能问题及解决方案 包括但不限于网络延迟...

    (2024)Redis,快看看这40道面试题.pdf

    根据给定文件的信息,我们可以提炼出一系列关于Redis的重要知识点,这些知识点主要涵盖了Redis的基本概念、数据类型、优势对比、持久化机制、性能问题及其解决办法、过期键处理策略、淘汰策略、内存管理机制、同步...

    JAVA架构面试_Redis高频面试题 - 2.pdf

    8. **Memcache 与 Redis 的区别**:Memcache 是简单的键值存储,只支持基本数据类型,没有持久化和事务;Redis 支持更丰富的数据结构,具备持久化、复制和事务等功能,且性能优秀。 9. **Redis 单线程模型**:Redis...

    redis&memcache;所需扩展包

    例如,你需要了解如何设置持久化、主从复制、集群配置、安全策略等。此外,熟悉 Redis 的数据结构(如字符串、哈希、列表、集合和有序集合)和命令,以及 Memcached 的基本操作,是高效利用它们的关键。 在提供的...

    Redis和Memcache对比与如何选择

    数据持久化可以通过RDB(快照)或AOF(日志)模式来实现,而主从复制则可以确保数据的冗余备份和故障切换。 此外,Redis支持多种复杂操作,如原子计数、排序、发布订阅等,这意味着你可以在一个操作中完成更复杂的...

    Redis和Memcache的区别总结

    综上所述,Redis 和 Memcache 的主要区别在于数据类型、持久化、分布式存储、数据一致性、CPU 利用率以及运行环境等方面。Redis 更适合需要复杂数据结构、数据持久化和高可靠性的应用,而 Memcache 则是轻量级缓存和...

    Redis面试知识点.pdf

    #### 5、Memcache与Redis的区别都有哪些? - **数据持久化**:Redis支持数据持久化,而Memcached不支持。 - **数据类型**:Redis提供了更多数据类型支持。 - **事务支持**:Redis支持事务,而Memcached不支持。 - *...

Global site tag (gtag.js) - Google Analytics