Redis - 持久化

Redis 分别提供了 RDB 和 AOF 两种持久化机制:

  • RDB 将数据库快照用二进制数据保存到磁盘
  • AOF 以协议文本的方式将对数据库的写入命令和参数保存在AOF文件中

RDB

拢共分两步,比把大象装冰箱还简单:

  • rdbSave() 保存到磁盘
  • rdbLoad,重启后加载还原

保存

save和bgsave命令都会保存,前者阻塞主进程,后者fork出子进程进行保存
SAVE时因为AOF写入时后台线程完成所以可以同步进行
BGSAVE时,进行SAVE或者是BGSAVE都会提示错误

还原

启动时就会还原,没还原一千条处理一次请求(只针对几个命令响应,其他返回错误),完全还原后才正常处理请求
因为AOF的频率更高,因此会优先使用AOF还原

AOF

开启AOF,然后客户端发起的所有修改请求都会被保存在AOF文件中

步骤

  • 命令传播 客户端发送修改请求,如果执行成功,则传播到AOF程序中
if(executeCommond(command, params) == SUCCESS){
    if(AOFOPEN){
        propagateAOF(command, params)
        if(replication){
            propagateReplicationAOF(command, params)
        }
    }
}
  • 缓存追加 AOF程序转化命令参数数据库Id等为Redis通讯协议格式,加到aof缓存末尾
  • 文件写入和保存 WRITE将缓存会写到AOF文件,或者SAVE将AOF文件写到磁盘

保存模式

对应Redis的配置

  • 不保存
    由主线程触发,WRITE和SAVE都会阻塞主线程。
    一般只会在Redis关闭时才会触发,因此性能好,但是安全性低,如果当机则会丢失数据
  • 每命令保存
    都阻塞
    但是安全性高,只会丢失一个命令,但是性能最差
  • 每时间段保存
    WRITE阻塞 SAVE由子进程完成,不阻塞。 执行时会根据条件判断是SAVE还是WRITE
    安全性及性能平衡

还原

还原模式很简单,创建伪客户端,读取AOF文件,依次执行命令

AOF重写

上面的还原会有个问题,比如一个list[1,2,3,4]插入[5,6]又删除[1,2]变成了[3,4,5,6]除了记录所有过程外,还可以转化为一个set[3,4,5,6]的命令。这种就可以大大减少AOF的体积,直接得到最后的状态

AOF后台重写

为了不阻塞主进程,redis可以在后台重写AOF。
但是考虑到后台重写可能造成不一致的情况,整个重写过程如下:

exeCommand(){
    writeCommandToOldAofFile();
    writeCommandToReAofCache();
}

backendAof(){
    byte[] reAofCache = new byte[];
    File newAofFile = new File();
    writeCommandToNewAofFile();
    if(writeFinished){
        // 主线程中断
        // 主线程把reAofCache中的命令写到newAofFile中
        // 用新AofFile替换旧的AofFile
    }
}

大概的过程是,把耗时多的重新计算,写新文件等另起线程操作。 把这段操作时间内产生的新的状态变更记录到缓存中。 耗时操作完成后中断主线程,主线程把缓存中的内容再会写到新文件,用新文件代替老文件。这样就可以保证不丢数据,也能保证尽可能减少中断服务的时间

触发条件:
AOF开启时会维护三个变量:大小,最后一次AOF重写后的增长量,自后一次AOF重写后增长的百分比。
当大小超过临界值,且增长百分比超过临界值时就会执行AOF重写。

时间: 2024-07-30 00:01:43

Redis - 持久化的相关文章

Redis持久化

Redis持久化 今天在被电话面试的时候问到Redis持久化的问题了,说实话还是自己对Redis并不是太熟悉,导致这块回答的并不是太好,因此打算用这篇文章帮助自己整理一下.文章参考了互联网上的诸多文章,文章末尾给出了原文地址,在此感谢原作者. 持久化 持久化,简单来讲就是将数据放到断电后数据不会丢失的设备中.也就是我们通常理解的硬盘上. 写操作的流程 首先我们来看一下数据库在进行写操作时到底做了哪些事,主要有下面五个过程. 客户端向服务端发送写操作(数据在客户端的内存中) 数据库服务端接收到写请

深度剖析Redis持久化

Redis是一种面向"key-value"类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速.  近日,Redis的作者在博客中写到,他看到的所有针对Redis的讨论中,对Redis持久化的误解是最大的,于是他写了一篇长文来对Redis的持久化进行了系统性的论述.文章主要包含三个方面:Redis持久化是如何工作的.这一性能是否可靠以及和其它类型的数据库比较.以下为文章内容:  一.Redis持久化是如何工作的?  什么

redis 持久化 RDB 和 AOF

Redis 持久化: 提供了多种不同级别的持久化方式:一种是 RDB ,另一种是 AOF . RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(points-to-time snapshot) AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集.AOF 文件中的命令全部以Redis协议的格式来保存,新命令会被追加到文件的末尾.Redis还可以在后台对AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的

Redis持久化之大数据服务暂停问题

Redis持久化是有两种方式:RDB和AOF 对这两种方式的官方文档的翻译请看: http://latteye.com/2011/11/redis-persistence.html   RDB就是快照存储,比如"每1个小时对redis进行快照存储".那么, save这个参数就应该设置 save 3600 1000 //前一次快照3600秒后,当有超过1000个key被改动的时候就进行一次快照更新 RDB快照产生dump.rdb文件,当每到快照时间,更新文件. AOF是存储所有的写操作,

redis持久化问题,修改dump快照配置文件不产生预期效果

问题描述 redis持久化问题,修改dump快照配置文件不产生预期效果 redis修改了配置文件rdb存放位置, 用redis-benchmark执行10000次命令,为啥在指定路径下不生成dump.rdb文件? 具体操作如下: 在redis-conf中修改: 1.save 60 3000 2.dir /var/rdb #此路径我已经mkdir 然后,kill掉redis进程,重启redis-server,借用redis自带的压力测试工具,执行10000次命令: ./bin/redis-benc

Redis持久化方案

前言:Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化.    Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式.可以单独使用其中一种或将二者结合使用. RDB持久化 RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘. RDB是Redis默认采用的持久化方式,在redis.conf配置文件中默认

redis持久化机制

一.Redis提供了哪些持久化机制:       1). RDB持久化:     该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘.        2). AOF持久化:     该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的.     3). 无持久化:     我们可以通过配置的方式禁用Redis服务器的持久化功能,这样我们就可以将Redis视为一个功能加强版的memcached了.   

《Redis官方文档》持久化

原文链接 译者:Alexandar Mahone 这篇文章从技术层面描述了Redis持久化,建议所有读者阅读.如果希望更多了解Redis持久化和持久性保障,建议阅读Redis持久化揭秘. Redis 持久化 提供了多种不同级别的持久化方式: RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集. AOF 文件中的命令全部以 Redis 协议的格

Redis总结(四)Redis 的持久化

前面已经总结了Redis 的安装和使用今天讲下Redis 的持久化. redis跟memcached类似,都是内存数据库,不过redis支持数据持久化,也就是说redis可以将内存中的数据同步到磁盘来持久化,以确保redis 的数据安全.    redis持久化的两种方式 redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File). RDB,简而言之,就是将存储的数据快照的方式存储到磁盘上, AOF,则是将redis执行过的所有写指