redis笔记-数据库之持久化策略

2018-1-17 by Atlas


  • redis持久化

将redis在内存中的数据库状态保持到磁盘里面,避免数据意外丢失。

  • RDB持久化
  • 既可以手动执行,也可以根据服务器配置选项定期执行。
  • 生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态。
  • RDB文件载入时,服务器一直处于阻塞状态,直到完成。

  • 命令SAVE、BGSAVE
    SAVE命令会阻塞redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求。
    BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求。
  • AOF文件更新频率通常比RDB文件更新频率高。
    so -->
    如果开启AOF,服务器优先使用AOF文件还原数据库;
    只有AOF关闭,服务器才会使用RDB文件还原数据库。

  • BGSAVE命令执行时的服务器状态:
    (1)BGSAVE执行期间,客户端发送的SAVE命令会被服务器拒绝。
    (2)BGSAVE执行期间,客户端发送的BGSAVE命令会被服务器拒绝。
    (3)BGSAVE和BGREWRITEAOF不能同时执行:
    如果BGSAVE正在执行,那么客户端发送的BGREWRITEAOF会被延迟到BGSAVE后执行;
    如果BGREWRITEAOF正在执行,那么客户端发送的BGSAVE会被服务器拒绝。
  • SAVE保存条件
save  900  1                          服务器在900秒之内,对数据库进行了至少1次修改
save  300  10                        服务器在300秒之内,对数据库进行了至少10次修改
save  60    10000                  服务器在60秒之内,对数据库进行了至少10000次修改
struct redisServer {
        // ...
        // 记录保存条件的数组
        struct saveparam *saveparams;
        // 修改计数器
        long long dirty;
        // 上次执行保存的时间
        time_t lastsave;
        // ...
}
struct saveparam {
        // 秒数
        time_t seconds;
        // 修改数
        int changes;
}

ServerCron 函数检查保存条件的过程

RDB文件结构将和JAVA CLASS文件一同讨论。

  • AOF持久化
  • AOF持久化是通过保存redis服务器所执行的 写命令 来记录数据库状态的。

  • AOF文件内容是纯文本格式。
    e.g.
    redis> SET msg "hello"
    ok
    AOF文件内容(SELECT命令是服务器自动添加的):
    2\r\n$6\r\nSELECT\r\n$1\r\n0\r\n
    3\r\n$3\r\n$3\r\nSET\r\n$3\r\nmsg\r\n$5\r\nhello\r\n
  • AOF持久化实现步骤:
    命令追加 --> 文件写入 --> 文件同步
  • 命令追加是将执行的写命令追加到服务器状态的aof_buf缓存区的末尾:
struct redisServer {
        // ...
        // AOF缓冲区
        sds aof_buf;
        // ...
}
  • 文件的写入与同步
    flushAppendOnlyFile()函数考虑是否要将aof_buf中的内容写入和保存到AOF文件里面,行为由服务器配置的appendfsync选项的值来决定。
  • appendfsync配置:

always:AOF持久化效率最慢,安全性来说最安全,故障只会丢失一个命令数据。
everysec:AOF持久化效率足够快,安全性来说,故障只会丢失一秒钟的命令数据。
no:AOF持久化效率最快,安全性来说,故障会丢失上次同步AOF文件之后的所有写命令数据。

  • AOF 文件载入过程

  • AOF文件重写,解决AOF文件体积膨胀问题。
  • AOF文件重写原理:
    AOF文件重写并不需要对现有的AOF文件进行读取、分析或者写入操作,而是通过读服务器当前的数据库状态来实现的。
    AOF文件重写首先从数据库中读取键现在的值,然后用一条命令记录键值对,代替之前记录这个键的多条命令。
    如果元素数量超过redis.h/REDIS_AOF_REWRITE_ITEMS_PER_CMD常量的值,那么重写多条命令记录键的值。
  • AOF文件后台重写过程(BGREWRITEAOF原理)

参考文献:《redis设计与实现》

原文地址:http://blog.51cto.com/damon188/2062259

时间: 2024-10-20 13:34:55

redis笔记-数据库之持久化策略的相关文章

Redis 中的数据持久化策略(RDB)

Redis 是一个内存数据库,所有的数据都直接保存在内存中,那么,一旦 Redis 进程异常退出,或服务器本身异常宕机,我们存储在 Redis 中的数据就凭空消失,再也找不到了. Redis 作为一个优秀的数据中间件,必定是拥有自己的持久化数据备份机制的,redis 中主要有两种持久化策略,用于将存储在内存中的数据备份到磁盘上,并且在服务器重启时进行备份文件重载. RDB 和 AOF 是 Redis 内部的两种数据持久化策略,这是两种不同的持久化策略,一种是基于内存快照,一种是基于操作日志,那么

redis中持久化策略

1.redis持久化规则 说明:根据redis的配置文件中所配置的持久化策略,定期持久化.将redis内存中的数据最终写入到持久化文件中.当redis意外关闭内存数据清空了.当redis重新启动时,根据配置文件中持久化文件的路径/名称,读取持久化文件.从持久化文件中恢复内存数据. 2.RDB模式 说明: RDB模式是redis中默认的持久化策略.该模式能够定期(有时间间隔)将内存中的数据持久化到XXX.rdb文件中. 该模式的效率是最高的.相当于对内存做快照处理. 同时数据加密保存. 如果允许少

3、redis.conf中的持久化相关配置

Redis支持2种持久化策略:snapshot方式和commandlog方式,前者通过将当前内存数据快照周期性写入RDB文件来实现:后者通过在log中记录Redis进程收到的写操作来实现,下次Redis重启时,回放commandlog来恢复数据状态.        根据实际需求,用户可以选择完全禁用持久化,也可以在同一个Redis实例中同时启用RDB和AOF.        特别注意:如果部署方式为主从,则不同实例的持久化时机最好错开!避免master和slaves同时进入后台持久化,这可能会降

redis持久化策略梳理及主从环境下的策略调整记录

redis是一个内存数据库,它的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为"半持久化模式"):也可以把每一次数据变化都写入到一个Append Only File(AOF)里面(这称为"完全持久化模式").redis提供了两种不同级别的持久化方式:一种是默认的RDB(filesnapshotting快照)持久化,一种是AOF持久化,这两种持久化方式都可以将内存中的数据库状态保存到磁盘上,但是原理非常不同,区别很明显! 1.RDB持久化可以在

redis持久化策略RDB和AOF

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

关于redis的持久化策略

Redis的持久化 Redis虽然是基于内存的存储系统,但是它本身是支持内存数据的持久化的,而且提供两种主要的持久化策略:RDB快照和AOF日志. Redis的RDB快照 Redis支持将当前数据的快照存成一个数据文件的持久化机制,即RDB快照.这种方法是非常好理解的,但是一个持续写入的数据库如何生成快照呢?Redis借助了fork命令的copy on write机制.在生成快照时,将当前进程fork出一个子进程,然后在子进程中循环所有的数据,将数据写成为RDB文件. 我们可以通过Redis的s

Redis 笔记与总结6 Redis 高级应用之 事务处理、持久化操作、pub_sub、虚拟内存

3.事务处理 redis 对事务的支持目前还比较简单. redis 只能保证一个 client 发起的事务中的命令可以连续的执行,而中间不会插入其他 client 的命令. 由于 redis 是单线 程来处理所有 client 的请求的所以做到这点是很容易的.一般情况下redis 在接受到一个 client 发来的命令后会立即处理并 返回处理结果,但是当一个client 在 一个连接中发出 multi 命令时,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一个队列中.当

redis学习笔记——Redis过期键的删除策略

Redis过期键的删除策略 对于过期键一般有三种删除策略 定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作: 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键:如果没有过期,那就返回该键: 定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键.至于删除多少过期键,以及要检查多少个数据库,则由算法决定. 下面我们来看看三种策略的优缺比较: 定时删除策略对内存是

Redis的持久化策略

Redis的持久化策略 Redis的持久化策略主要有两种,下面主要对每种策略的特点及应用简要总结. ○ RDB § RDB:是redis的默认持久化机制.相当于照快照.保存的不是数据,保存的是一种状态.20G数据----> 几kb快照 § 优点:快照保存数据速度极快,还原数据速度极快:适用于灾难备份,复制其中的dump.rdb文件即可. § 缺点:小内存机器不适合使用.RDB机制符合要求就会照快照.(随时随地启动),会占用一部分系统资源(突然的,就是在将大文件压缩过程中,会突然占用一部分内存),