精华内容
下载资源
问答
  • Redis快照原理详解

    2020-04-11 08:08:35
    本文对Redis快照的实现过程进行介绍,了解Redis快照实现过程对Redis管理很有帮助。 Redis默认会将快照文件存储在Redis当前进程的工作目录中的dump.rdb文件中,可以通过配置dir和dbfilename两个参数分别指定快照文件...

    本文对Redis快照的实现过程进行介绍,了解Redis快照实现过程对Redis管理很有帮助。

    Redis默认会将快照文件存储在Redis当前进程的工作目录中的dump.rdb文件中,可以通过配置dir和dbfilename两个参数分别指定快照文件的存储路径和文件名。快照的过程如下。


    (1)Redis使用fork函数复制一份当前进程(父进程)的副本(子进程);
    (2)父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件;
    (3)当子进程写入完所有数据后会用该临时文件替换旧的 RDB 文件,至此一次快照操作完成。


    在执行 fork 的时候操作系统(类 Unix 操作系统)会使用写时复制(copy-on-write)策略,即fork函数发生的一刻父子进程共享同一内存数据,当父进程要更改其中某片数据时(如执行一个写命令),操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的RDB文件存储的是执行fork一刻的内存数据。


    写时复制策略也保证了在 fork 的时刻虽然看上去生成了两份内存副本,但实际上内存的占用量并不会增加一倍。这就意味着当系统内存只有2 GB,而Redis数据库的内存有1.5 GB时,执行 fork后内存使用量并不会增加到3 GB(超出物理内存)。为此需要确保 Linux 系统允许应用程序申请超过可用内存(物理内存和交换分区)的空间,方法是在/etc/sysctl.conf 文件加入 vm.overcommit_memory = 1,然后重启系统或者执行 sysctl vm.overcommit_memory=1 确保设置生效。


    另外需要注意的是,当进行快照的过程中,如果写入操作较多,造成 fork 前后数据差异较大,是会使得内存使用量显著超过实际数据大小的,因为内存中不仅保存了当前的数据库数据,而且还保存着 fork 时刻的内存数据。进行内存用量估算时很容易忽略这一问题,造成内存用量超限。


    通过上述过程可以发现Redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候 RDB 文件都是完整的。这使得我们可以通过定时备份 RDB 文件来实现 Redis 数据库备份。RDB 文件是经过压缩(可以配置rdbcompression 参数以禁用压缩节省CPU占用)的二进制格式,所以占用的空间会小于内存中的数据大小,更加利于传输。


    Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将一个记录1000万个字符串类型键、大小为1 GB 的快照文件载入到内存中需要花费20~30秒。


    通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。这就需要开发者根据具体的应用场合,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受的范围。例如,使用Redis存储缓存数据时,丢失最近几秒的数据或者丢失最近更新的几十个键并不会有很大的影响。如果数据相对重要,希望将损失降到最小,则可以使用AOF方式进行持久化。

    展开全文
  • 主要为大家详细介绍了redis快照模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Redis 快照持久

    2019-04-16 15:26:17
    <p>Redis 是一种内存数据库,它将数据存储在内存中,所以如果不将数据保存到硬盘中,那么一旦 Redis ...快照</strong>(snapshotting),它可以将存在于某一时刻的所有数据写入硬盘里面。另一种方法叫...
      <p>本文转载自:https://leehao.me/Redis-%E5%BF%AB%E7%85%A7%E6%8C%81%E4%B9%85%E5%8C%96%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</p>
      
    
      
        <p>Redis 是一种内存数据库,它将数据存储在内存中,所以如果不将数据保存到硬盘中,那么一旦 Redis 进程退出,保存在内存中的数据将会丢失。为此,Redis 提供了两种不同的持久化方法来将数据存储到硬盘里面。一种方法叫做<strong>快照</strong>(snapshotting),它可以将存在于某一时刻的所有数据写入硬盘里面。另一种方法叫 <strong>AOF</strong>(append-only file),它会在执行写命令时,将被执行的写命令复制到硬盘里面。这种两持久化方法既可以同时使用,也可以单独使用,当然如果 Redis 单纯只作为缓存系统使用的话,也可以两种持久化方法都不使用。具体选择哪种持久化方法取决于用户的应用场景。<br>快照持久化方法是 Redis 默认开启的持久化方法,本文介绍快照持久化方法,AOF 方法将在另一篇文章中介绍。</p>
    

    RDB 文件

    Redis 将某一时刻的快照保存成一种称为 RDB 格式的文件中。RDB 文件是一个经过压缩的二进制文件,通过该文件,Redis 可以将内存中的数据恢复成某一时刻的状态。Redis 与 RDB 文件的关系可以通过下图 1 和图 2 来表示。


    图 1:Redis 将内存的数据保存为 RDB 文件


    图2:Redis 用 RDB 文件还原内存数据

    SAVE 命令

    Redis 提供了两个命令用来生成 RDB 文件,一个是 SAVE,一个是 BGSAVE。
    SAVE 命令会阻塞 Redis 服务器进程,走到 RDB 文件创建完毕为止,在 Redis 服务器进程阻塞期间,Redis 不能处理任何命令请求。

    1
    2
    redis 127.0.0.1:6379> save
    OK

    在生产环境,我们一般不会直接使用 SAVE 命令,原因是由于它会阻塞 Redis 进程。但是,如果机器已没有足够的内存去执行 BGSAVE 命令,或者即使等待持久化操作完毕也无所谓,我们也可以使用 SAVE 命令来生成 RDB 文件。

    BGSAVE 命令

    BGSAVE 命令会派生出一个子进程,然后由子进程创建 RDB 文件,因此,BGSAVE 命令不会阻塞 Redis 服务器进程。

    1
    2
    redis 127.0.0.1:6379> bgsave
    Background saving started

    可以使用 LASTSAVE 命令来检查保存 RDB 文件的操作是否执行成功。

    自动保存 RDB 文件

    除了手动执行 SAVE 和 BGSAVE 命令来生成 RDB 文件外,Redis 还提供了自动保存 RDB 文件的功能。由于 BGSAVE 命令可以在不阻塞服务器进程的情况下执行,所以 Redis 允许用户通过设置配置来让 Redis 服务器每隔一段时间自动执行一次 BGSAVE 命令。
    下面是 Redis 配置文件 redis.conf 中有关自动保存 RDB 文件的有关配置内容:

    1
    2
    3
    save 900 1
    save 300 10
    save 60 10000

    上面配置的含义是,Redis 服务器只要满足以下三个条件中的任意一个, BGSAVE 命令就会被执行:

    • Redis 服务器在 900 秒之内,对数据库进行了至少一次修改
    • Redis 服务器在 300 秒之内,对数据库进行了至少 10 次修改
    • Redis 服务器在 60 秒之内,对数据库进行了至少 10000 次修改

    涉及 RDB 文件的配置选项还包括:

    1
    2
    3
    4
    5
    dbfilename dump.rdb
    dir ./
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes
    • dbfilename:配置 RDB 文件名称
    • dir:配置 RDB 文件存放的路径
    • stop-writes-on-bgsave-error:当生成 RDB 文件出错时是否继续处理 Redis 写命令,默认为不处理
    • rdbcompression:是否对 RDB 文件进行压缩
    • rdbchecksum:是否对 RDB 文件进行校验和校验

    快照持久化的优点

    快照持久化的方法采用创建一个子进程的方法来将 Redis 的内存数据保存到硬盘中,因此,它并不会对 Redis 服务器性能造成多大的影响,这可以说是快照持久化方法最大的一个优点。
    快照持久化使用的 RDB 文件是一种经过压缩的二进制文件,可以方便地在网络中传输与保存。通过恰当的配置,可以让我们方便快捷地将 Redis 内存数据恢复到某一历史状态。这对于提高数据的安全性,应对服务器宕机等意外的发生很有帮助。

    快照持久化的缺点

    尽管快照持久化允许 Redis 恢复到快照文件的状态,但如果 RDB 文件生成后,Redis 服务器继续处理了写命令导致 Redis 内存数据有更新,这时恰好 Redis 崩溃了而来不及保存新的 RDB 文件,那么 Redis 将会丢失这部分新的数据。也就是说,如果系统真的发生崩溃,那么我们将会丢失最近一次生成 RDB 文件之后更改的所有数据。因此,快照持久化方法只适用于那些即使丢失一部分数据也不会造成问题的应用场景。
    另外,快照持久化方法需要调用fork()方法创建子进程。当 Redis 内存的数据量较大时,创建子进程和生成 RDB 文件得占用较多的系统资源和处理时间,这会对 Redis 正常处理客户端命令的性能造成较大的影响。
    当然,如果我们可以妥善处理快照持久化方法可能带来的数据丢失,那么快照持久化仍然是一个不错的选择。

    参考资料

    1. Redis 实战,Josiah L. Carlson 著,黄健宏译,人民邮电出版社,2015年
    2. Redis 设计与实现,黄健宏著,机械工业出版社,2015年
    3. https://redis.io/topics/persistence
    4. https://redis.io/commands/save
    5. https://redis.io/commands/bgsave
    6. Redis RDB 文件格式介绍,https://github.com/sripathikrishnan/redis-rdb-tools/wiki/Redis-RDB-Dump-File-Format
    7. Redis RDB 版本的历史,https://github.com/sripathikrishnan/redis-rdb-tools/blob/master/docs/RDB_Version_History.textile
    </div>
    
    展开全文
  • Redis快照持久化

    千次阅读 2019-02-22 11:37:51
    redis的基础知识我们已经准备的差不多了,接下来两篇文章,我想和大家聊聊redis持久化这个话题。 本文是Redis系列的第八篇文章,了解前面的文章有助于更好的理解本文: 1.Linux上安装Redis 2.Redis中的五种数据类型...

    redis的基础知识我们已经准备的差不多了,接下来两篇文章,我想和大家聊聊redis持久化这个话题。

    本文是Redis系列的第八篇文章,了解前面的文章有助于更好的理解本文:


    1.Linux上安装Redis
    2.Redis中的五种数据类型简介
    3.Redis字符串(STRING)介绍
    4.Redis字符串(STRING)中BIT相关命令
    5.Redis列表与集合
    6.Redis散列与有序集合
    7.Redis中的发布订阅和事务


    redis持久化

    整体上来说,redis持久化有两种方式,快照持久化和AOF,在项目中我们可以根据实际情况选择合适的持久化方式,也可以不用持久化,这关键看我们的redis在项目中扮演了什么样的角色。那么我将分别用两篇文章来介绍这两种不同的持久化方式,本文我们先来看看第一种方式。

    快照持久化

    快照持久化,顾名思义,就是通过拍摄快照的方式实现数据的持久化,redis可以在某个时间点上对内存中的数据创建一个副本文件,副本文件中的数据在redis重启时会被自动加载,我们也可以将副本文件拷贝到其他地方一样可以使用。

    如何配置快照持久化

    redis中的快照持久化默认是开启的,redis.conf中相关配置主要有如下几项:

    save 900 1
    save 300 10
    save 60 10000
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    dbfilename dump.rdb
    dir ./
    

    前面三个save相关的选项表示备份的频率,分别表示900秒内至少一个键被更改则进行快照,300秒内至少10个键被更改则进行快照,60秒内至少10000个键被更改则进行快照,stop-writes-on-bgsave-error表示在快照创建出错后,是否继续执行写命令,rdbcompression则表示是否对快照文件进行压缩,dbfilename表示生成的快照文件的名字,dir则表示生成的快照文件的位置,在redis中,快照持久化默认就是开启的。我们可以通过如下步骤验证快照持久化的效果:

    1.进入redis安装目录,如果有dump.rdb文件,先将之删除。如下:

    p299

    2.启动redis,随便向redis中存储几个数据,然后关闭redis并退出,如下:

    [root@localhost redis-4.0.8]# redis-server redis.conf
    [root@localhost redis-4.0.8]# redis-cli
    127.0.0.1:6379> set k1 v1
    OK
    127.0.0.1:6379> set k2 v2
    OK
    127.0.0.1:6379> SHUTDOWN
    not connected> exit
    

    3.退出来后,我们发现刚刚删掉的dump.rdb文件又回来了,这就是生成的备份文件。
    4.此时再次启动redis并进入,发现刚刚存储的数据都还在,这是因为redis在启动时加载了dump.rdb中的数据。好了,关闭redis并退出。
    5.将redis目录下的dump.rdb文件删除。
    6.再次启动redis并进入到控制台,所有的数据都不存在了。

    快照持久化操作流程

    通过上面的介绍,小伙伴们对快照持久化都有一个大致的认识了,那么这个东西到底是怎么运行的?持久化的时机是什么?我们来仔细扒一扒。

    1.在redis运行过程中,我们可以向redis发送一条save命令来创建一个快照,save是一个阻塞命令,redis在接收到save命令之后,开始执行备份操作之后,在备份操作执行完毕之前,将不再处理其他请求,其他请求将被挂起,因此这个命令我们用的不多。save命令执行如下:

    127.0.0.1:6379> SAVE
    OK
    

    2.在redis运行过程中,我们也可以发送一条bgsave命令来创建一个快照,不同于save命令,bgsave命令会fork一个子进程,然后这个子进程负责执行将快照写入硬盘,而父进程则继续处理客户端发来的请求,这样就不会导致客户端命令阻塞了。如下:

    127.0.0.1:6379> BGSAVE
    Background saving started
    

    3.如果我们在redis.conf中配置了如下选项:

    save 900 1
    save 300 10
    save 60 10000
    

    那么当条件满足时,比如900秒内有一个key被操作了,那么redis就会自动触发bgsava命令进行备份。我们可以根据实际需求在redis.conf中配置多个这种触发规则。

    4.还有一种情况也会触发save命令,那就是我们执行shutdown命令时,当我们用shutdown命令关闭redis时,此时也会执行一个save命令进行备份操作,并在备份操作完成后将服务器关闭。

    5.还有一种特殊情况也会触发bgsave命令,就是在主从备份的时候。当从机连接上主机后,会发送一条sync命令来开始一次复制操作,此时主机会开始一次bgsave操作,并在bgsave操作结束后向从机发送快照数据实现数据同步。

    快照持久化的缺点

    快照持久化有一些缺点,比如save命令会发生阻塞,bgsave虽然不会发生阻塞,但是fork一个子进程又要耗费资源,在一些极端情况下,fork子进程的时间甚至超过数据备份的时间。定期的持久化也会让我们存在数据丢失的风险,最坏的情况我们可能丢失掉最近一次备份到当下的数据,具体丢失多久的数据,要看我们项目的承受能力,我们可以根据项目的承受能力配饰save参数。

    OK,快照持久化我们就介绍这么多,更多资料小伙伴们可以参考官方文档http://www.redis.net.cn/tutorial/3501.html。小伙伴在看官方文档时,有什么问题欢迎留言讨论。

    更多资料请关注公众号:
    在这里插入图片描述

    展开全文
  • redis中,我们可以在特定时间点进行内存拷贝来创建快照,在创建完毕之后,这个快着能够回退,还可以拷贝到其他机器甚至是机器的重启。快照会被写入在配置文件中配置的文件中,并存储在dir目录...

    在redis中,我们可以在特定时间点进行内存拷贝来创建快照,在创建完毕之后,这个快着能够回退,还可以拷贝到其他机器甚至是机器的重启。

    快照会被写入在配置文件中配置的文件中,并存储在dir目录中,在执行下一个快照前,如果redis或者硬件或者系统导致崩溃,那么数据会从最新的redis快照中进行恢复。

    这里举个例子就是说我们有一台redis机器,下午2:35内存中有10G的缓存,然后现在已经完成了快照操作,新的快照在3:06启动,在下午3:08完成之前,我们需要更新35个数据。但是在这期间如果系统奔溃,那么下午2:35之后的所有数据都讲丢失。而如果当前快照完成了话,那么仅仅会丢失这35个数据。

    这块有五个方法进行快照执行

    1.任何redis客户端都可以通过bgsave命令来初始化一个快照(window平台除外),这个命令会创建一个子线程去将快照写入磁盘,并且对主线程没有任何影响。

    2.reids客户端同样可以蚕蛹save命令初始化一个快照,这个命令能够让redis停止执行接受到的命令,直到快照完成之后。这个命令不常用,除非我们需要我们的数据在磁盘上,或者我们可以等待redis在一定时间内不执行命令,或者我们没有足够的内存去执行bgsave命令。

    3.如果在redis中配置了保存行,比如save 60 10000,那么如果在上次成功保存之后60秒内发生10000次写入,那么 redis就会自动触发bgsave。但存在多个保存行,只要一个规则匹配,就会触发bgsave。

    4.当redis接受shutdown命令或者收到term命令,redis将执行save命令,然后阻止客户端的命令执行。save执行完毕之后就关闭。

    5.当redis服务连接到其他redis服务进行sync同步命令,进行复制。如果其中的命令还没有执行或者完成,那么redis将开始进行bgsave命令。

    当我们使用快照的方式进行持久化,那么我们不可避免的会存在最新快照到故障时刻的数据丢失的问题,对于某些应用来说,数据丢失是不能容忍的,这时候我们可以采用aof去持久化。但是如果应用可以允许数据丢失,那么快照也行的。

    redis快照采用的fork的方式将内存进行拷贝,然后进行快照存储,因此如果缓存的数据很大,比如数十G,那么内存的压力就会很大,就会导致进程采用虚拟内存,这样会降低redis的性能,降低redis的响应时间。一般情况下,硬件或者虚拟机每G的fork大概需要10-20ms,所以说如果是20G的redis数据进行快照bgsave,那么将会产生20*(10-20)ms=200ms-400ms的暂停。

    因为采用bgsave会导致内存复制的时间延迟,因此我们可以采用save指令,但是save指令因为是客户端阻塞的,因此不能执行其他的命令。所以快照完成的速度会更快。

    本书的作者也提到了他们在68G的虚拟机上运行近50G数据的redis去检测bgsave和save的差别,bgsave的内存拷贝需要15秒甚至更多。15-20分钟才能完成整个快照的保存。但是使用save去完成快照只需要3-5分钟。

    展开全文
  • Redis快照持久化 持久化: 即把数据存储在硬盘中 rdb的工作原理: 1redis使用fork函数复制当前进程(父进程)的副本(子进程) –在使用fork函数那一刻(T1),父子进共享同一内存数据,其后当父进行执行新的命令时候...
  • redis-rdb-tools 是一个开源的解析redis快照文件dump.rdb的工具,解析出dump.rdb文件后可以用来做数据分析,redis数据恢复或者写入到其他key-value缓存系统中。 1.下载&安装 git clone ...
  • Redis快照持久化 持久化: 即把数据存储在硬盘中 rdb的工作原理: 每隔N分钟或N次写操作后, 从内存dump数据形成rdb文件,压缩放在备份目录 参数说明 save 900 1 #必须900秒之后至少1个关键字发生变化。就...
  • redis快照与AOF

    2018-08-22 15:02:00
    我们知道,redis的数据是保存在内存里,而内存一断电就没了,所以为了数据持久化,我们得想办法把内存中的...快照的核心原理就是把redis在某个时间内存内的所有数据都写入硬盘,那么什么时候写入呢?快照的配置都有哪些呢...
  • 快照持久化指的是将某一时刻的所有数据写入硬盘,快照是内存数据的二进制序列化形式,在存储上...相关介绍:Redis 的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制 来保证 Redis 的数据不...
  • 4.1.1-Redis快照持久化

    2021-01-02 22:05:10
    Redis可以通过创建快照来获得存储在内存里面的数据在某个时间点上的副本。根据配置,快照将被写入dbfilename选项指定的文件里面,并存储在dir选项指定的路径下。如果在新的快照文件创建完成之前,Redis,系统或者...
  • redis持久化方式之一是采用快照方式 。 在配置文件中比如save 900 2 表示的是,900s内有2次写入操作,就会触发快照行为。 小弟有几个问题: 1 比如在第40s有两次写入,那么是在40s进行快照还是在900s时进行快照? 2 ...
  • redis快照(持久化)

    2021-01-10 17:33:45
    一.前言 Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中 的数据库状态也会消失。所以 Redis 提供了持久化功能! 二.RDB
  • 本文转自:https://www.2cto.com/database/201707/655681.htmlRedis 是一种内存数据库,它将数据存储在内存中,所以如果不将数据保存...一种方法叫做快照(snapshotting),它可以将存在于某一时刻的所有数据写入硬...
  • redis快照存储模式报错

    千次阅读 2018-01-23 17:09:56
    redis报错问题 MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for ...
  • 虽然我们经常将 Redis 看做一个纯内存的键值存储系统,但是我们也会用到它的持久化功能,RDB 和 AOF 就是 Redis 为我们提供的两种持久化工具,其中 RDB 就是 Redis 的数据快照,我们在这篇文章想要分析 Redis 为什么...
  • redis 快照 RDB和AOF

    2017-11-14 15:43:43
    RDB的问题  1:fork  一个进程时,内存的数据也被复制了,即内存会是原来的两倍 ... 3:由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修
  • 今天在使用composer添加Redis缓存的时候,运行Redis发生错误: 127.0.0.1:6379> set dachou dadachou (error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,466
精华内容 2,186
关键字:

redis快照

redis 订阅