Redis(七)持久化(Persistence)

前言

  前文中介绍到Redis时内存的K-V数据结构存储服务器。Redis的高性能原因之一在于其读写数据都是在内存中进行。它的架构实现方式决定了Redis的数据存储具有不可靠性,易丢失,因为RAM内存在硬件问题或者断电情况下都会被擦除。

  基于以上问题,为了防止数据在特殊情况下丢失,Redis支持内存数据持久化至磁盘的功能——Redis Persistence。

  

Redis持久化方式

Redis提供了两种持久化方式:

  • RDB持久化方式:在特定的时间间隔存储Redis键空间的某一时刻的快照。
  • AOF持久化方式:当有数据写入Redis时,将以日志的形式记录写入的命令。以追加的方式写入AOF文件尾部,写入的内容遵循Redis协议的命令格式。

两种持久化方式完全不同。第一种是以完整的数据角度进行持久化,第二种是以日志的形式记录完整的写入操作。Redis用户可以在这两种方式之间进行trade off,也可以综合使用这两种方式。

Redis持久化比较

RDB的优点:

  • RDB是某一时刻的Redis键空间的快照文件,是经过高度压缩的单个文件,所以RDB文件对于备份非常合适。根据不同的时刻,有不同版本的文件。
  • 因为其实高度压缩的单个文件,所以对于数据采集,容灾都是非常不错的选择,可以将其转移至数据中心。
  • Redis是单进程的方式work,所以在进行持久化时正在work的父进程会fork子进程进行很持久化操作,父进程仍然可以正常的服务用户client的请求,对性能影响微乎其微。
  • 因为RDB持久化方式存储的是键空间的数据,所以对于Redis重启,恢复数据相对于AOF要更迅速。

AOF优点:

  • AOF方式对于Redis的持久化更耐用,因为AOF提供了多种持久化策略可供选择:无同步持久化, 每秒同步持久化, 每次操作时同步持久化。默认策略是每秒持久化,这种方式写性能很好且只会丢失一秒间隔的数据(可容忍)。
  • AOF方式只仅仅是追加的log形式,所以持久化时无需查找键空间数据且不会出现因为断电问题出现AOF文件损坏的问题。因为是追加的方式,只会局部影响最后的文件内容,Redis提供了redis-check-aof工具用于修复AOF文件。
  • 当出现AOF文件过大时,Redis会自动后台重写AOF文件。
  • 因为AOF是追加命令+数据的格式log,所以AOF文件具有易读性。

RDB的缺点:

  • RDB方式是一段时间间隔后持久化数据快照,所以存在数据丢失风险。即使你将间隔控制在每5分钟,仍然存在最近几分钟内数据丢失的可能。
  • RDB持久化方式是工作的父进程fork持久化的子进程。如果键空间数据很大,fork可能需要耗费很长时间,在fork过程中,父进程停止对client请求服务。如果数据集很大且cpu性能不是很好,可能造成Redis秒级停止服务。

AOF缺点:

  • 相同键空间的数据,AOF文件的体积比RDB文件更大。
  • 根据不同的fsycn策略,AOF方式可能比RDB更慢。虽然每秒的fsycn性能非常好,但是在巨大的写入是RDB的性能比AOF更好。

Redis持久化工作流

  上述比较了两种持久化方式的各自优缺点,两者的选择需要trade off。但是通常,综合使用两种持久化方式是不粗的选择。

单独使用RDB存在数据丢失风险,单独使用AOF对于重启和数据备份来说不是好的idea。基于以上两种原因,综合使用RDB和AOF,能满足数据备份和快速重启,也能将数据丢失的风险降到最低。

  默认情况,Redis是将快照保存在一个二进制的dump.rdb文件中。可以配置Redis在最近间隔多少秒内发生多少变化时进行RDB持久化。或者可以使用SAVE或者BGSAVE命令。

例如:save 60 1000,如果每60秒发生1000次变化,则进行RDB持久化。

RDB的工作流程:

  1. Redis fork用于持久化的子进程。
  2. 子进程将键空间数据写入到临时的rdb文件中。
  3. 当子进程完成写入,将替换旧的RDB文件。

   对于AOF方式,需要在配置文件中开启AOF,配置:appendonly yes。当有写入命令时,Redis会将其追加到AOF文件末尾。

   可以配置AOF的fsycn策略:

  1. 每当一个新命令执行时,即追加。很慢但是很安全
  2. 每秒追加一次,足够快且只丢失一秒的数据
  3. 从不fsync,依赖操作系统,非常快但是缺少安全性

建议的策略是每秒追加一次。

使用AOF方式有时可能出现文件损坏的问题,比如正在写入AOF文件时出现断电情况。这时可以使用redis-check-aof工具修复AOF文件

redis-check-aof --fix "filename",然后使用修复后的AOF文件启动Redis即可恢复数据。

AOF重写方式的工作流程:

  1. Redis的工作父进程fork子进程。
  2. 子进程开始写一个新的临时AOF文件
  3. 父进程将新发生的操作全部写入内存缓冲区
  4. 当子进程重写完毕,父进程会受到信号,并将内存缓冲区的内容追加到子进程重写后的AOF文件中
  5. Redis再重命名旧的AOF文件名至新的文件,Redis并将新的操作追加到文件中。

Redis持久化配置

触发RDB持久化配置需要在redis.conf中配置:

dir /usr/local/var/redis/
dbfilename dump.rdb
save 60 5

触发AOF持久化配置需要在redis.cong中配置:

appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
参考

Redis Persistence

Redis Persistence

原文地址:https://www.cnblogs.com/lxyit/p/9829105.html

时间: 2024-07-31 07:23:00

Redis(七)持久化(Persistence)的相关文章

redis 数据持久化

转:redis 数据持久化 1.快照(snapshots) 缺省情况情况下,Redis把数据快照存放在磁盘上的二进制文件中,文件名为dump.rdb.你可以配置Redis的持久化策略,例如数据集中每N秒钟有超过M次更新,就将数据写入磁盘:或者你可以手工调用命令SAVE或BGSAVE. 数据保存的目录: 工作原理 Redis forks. 子进程开始将数据写到临时RDB文件中. 当子进程完成写RDB文件,用新文件替换老文件. 这种方式可以使Redis使用copy-on-write技术. 2.APP

Redis怎么持久化

(本文改编自生活真实案例,如有类同,绝不是巧合!) 端午节,烟哥正在一边愉快的学习…. 突然,微信一阵抖动.原来是老刘呼唤烟哥!善良的烟哥本以为人家是要约我出去玩!然而,打开微信一看,出现下图聊天记录 于是本文的主题就这么展开了.由于我需要迅速让老刘明白,这种问题的回答套路,所以我回答的时候,教她的是一种通用做法. ps:附<那些年用过的redis集群架构(含面试解析)>的连接地址. 当然,必须的,我一定要先问一下老刘答了哪种redis集群架构!老刘的回答是用了redis cluster集群架

Redis数据持久化机制AOF原理分析二

Redis数据持久化机制AOF原理分析二 分类: Redis 2014-01-12 15:36  737人阅读  评论(0)  收藏  举报 redis AOF rewrite 目录(?)[+] 本文所引用的源码全部来自Redis2.8.2版本. Redis AOF数据持久化机制的实现相关代码是redis.c, redis.h, aof.c, bio.c, rio.c, config.c 在阅读本文之前请先阅读Redis数据持久化机制AOF原理分析之配置详解文章,了解AOF相关参数的解析,文章链

Redis源码剖析和注释(十八)--- Redis AOF持久化机制

Redis AOF持久化机制 1. AOF持久化介绍 Redis中支持RDB和AOF这两种持久化机制,目的都是避免因进程退出,造成的数据丢失问题. RDB持久化:把当前进程数据生成时间点快照(point-in-time snapshot)保存到硬盘的过程,避免数据意外丢失. AOF持久化:以独立日志的方式记录每次写命令,重启时在重新执行AOF文件中的命令达到恢复数据的目的. Redis RDB持久化机制源码剖析和注释 AOF的使用:在redis.conf配置文件中,将appendonly设置为y

Redis的持久化

Redis的持久化有两种方法 一,RDB:是redis的默认方法,RDB相当于照快照,保存的是一种状态(保存的文件后缀是 rdb) 优点:1.快照保存数据速度极快,还原数据速度极快 2.适用于灾难备份 缺点:1.小内存机器不适合使用. RDB机制符合要求就会照快照.(随时随地的启动),会占用一部分系统资源(突然地), 很可能内存不足直接宕机.(宕机后,服务器会关闭,非正常关闭) 适用于内存比较充裕的计算机. RDB照快照的条件: 1.服务器正常关闭时候,照快照.  ./bin/redis-cli

redis开启持久化

redis的持久化有rdb和aof两种. rdb是记录一段时间内的操作,一盘的配置是一段时间内操作超过多少次就持久化. aof可以实现每次操作都持久化. 这里我们使用aof. 配置方式,打开redis的配置文件.找到appendonly.默认是appendonly no.改成appendonly yes. 再找到appendfsync 默认是: # appendfsync always #每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用 appendfsync ever

Redis实战(八)Redis的持久化

Redis相比Memcached的很大一个优势是支持数据的持久化, 通常持久化的场景一个是做数据库使用,另一个是Redis在做缓存服务器时,防止缓存失效. Redis的持久化主要有快照Snapshotting和AOF日志文件两种方式. 前者会根据配置的规则定时将内存中的数据持久化到硬盘上, 后者则是在每次执行写命令之后将命令记录下来. >>RDB方式 Redis是会以快照的形式将数据持久化到磁盘上. 默认会将快照文件存储在Redis当前进程的工作目录的dump.rdb文件中, 可以通过配置文件

Redis的持久化RDB

dbfilename redis.db  //持久化的文件dir /home/redis/6379    //文件所在目录save 900 1    // 900秒 修改一个key就保存一次save 300 10    // 300秒 修改10个key就保存一次save 60 10000    // 60秒 修改10000 个key就保存一次//上述3个save条件应该从下往上看,每个条件都是或的关系rdbcompression yes        //启用压缩rdbchecksum yes 

Redis总结(四)Redis 的持久化

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