Redis 数据持久化的理解

一、对持久化的理解



Redis 平时的键值对都是在内存中的,但是一旦意外中断或关闭连接,我们将丢失数据。

为了避免这种情况,就有一个持久化的机制,在某种条件下将数据以某种方式转储到文件中,下次启动服务器时可以通过持久化文件恢复数据。

二、持久化的方式



Redis 提供了两种方式,分别是RDB 和 AOF,两者最大的区别是 RDB 存储的是数据库状态(键值对),AOF 则是通过保存 Redis 服务器所执行的命令来记录数据库状态。

三、RDB


3.1 RDB文件的创建与载入

RDB持久化可以手动执行,也可以根据配置定期执行。

RDB持久化生成一个经过压缩的二进制文件,通过这个文件可以还原生成文件时的数据库状态。

两个Redis命令可以用于生成RDB文件,一个是SAVE,另一个是BGSAVE。

SAVE命令会阻塞 Redis 服务器进程, 直到 RDB 文件创建完毕为止, 在服务器进程阻塞期间, 服务器不能处理任何命令请求。而BGSAVE会派生出一个子进程。

如果服务器开启 了AOF 持久化功能, 那么服务器会优先使用 AOF 文件来还原数据库状态。

3.2 自动间隔性保存

指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合

save <seconds> <changes>

Redis默认配置文件中提供了三个条件:

save 900 1

save 300 10

save 60 10000

四、AOF


4.1 AOF持久化的实现

AOF持久化保存数据库状态的方法是将服务器执行的SET、SADD、RPUSH等命令保存到AOF文件中。

服务器在启动时,可以通过载入和执行AOF文件中保存的命令来还原服务器关闭之前的数据库状态。

AOF持久化的实现可以分为命令追加、文件写入、文件同步三个步骤。

命令追加:当AOF持久化功能处于打开状态时,服务器在执行完一个写命令后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾。

文件写入和同步:不同appendfsync值产生不同的持久化行为

always每次都要写入、同步,所以其安全性最高,效率是最慢的;everysec效率也足够快,也安全性也可以得到保证;no效率最高,但安全性比较差。

4.2 AOF文件的载入与数据还原

AOF文件中记录了数据库中所有写操作的命令,所以服务器只需要重新执行一遍AOF文件中的命令即可恢复服务器关闭之前的状态。步骤如下:

  • 创建一个不带网络连接的伪客户端;
  • 从AOF文件中分析并读取一条写命令;
  • 使用伪客户端执行被读出的写命令

4.3 AOF重写

随着AOF文件中的内容越来越多,体积越来越大,使用AOF文件进行数据还原也会耗费更多时间。

为了解决AOF文件体积膨胀的问题,Redis会创建一个新的AOF文件来替代。

实际上, AOF 文件重写并不需要对现有的 AOF 文件进行任何读取、 分析或者写入操作, 这个功能是通过读取服务器当前的数据库状态来实现的。

首先从数据库中读取键现在的值, 然后用一条命令去记录键值对, 代替之前记录这个键值对的多条命令, 这就 是 AOF 重写功能的实现原理。

时间: 2024-08-16 01:18:51

Redis 数据持久化的理解的相关文章

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

redis使用基础(五) ——Redis数据持久化

redis使用基础(五) --Redis数据持久化 (转载请附上本文链接--linhxx) 当服务器突然发生问题,或者redis重启,如果希望将数据持久化在硬盘中,下次开启redis还有数据时,redis提供了两种方案,一个叫做RDB(通过内存快照(Snapshotting)实现),另一个叫做AOF(日志追加(Append-only file)).通常结合两种方式来实现redis的持久化. 1.RDB RDB通过内存快照实现,会将redis当前的全部数据以快照的方式写入二进制文件中.实现快照有以

02 : redis 数据持久化

Redis数据持久化 什么是持久化: 通俗点:就是把redis缓存在内存中的数据保存到磁盘文件里面. Redis持久化分2种: RDB 持久化 可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). 优点:速度快,适合于用做备份,主从复制也是基于RDB持久化功能实现的. 缺点:会有数据丢失 AOF 持久化 记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集. AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会

Redis数据持久化

总的来说有两种持久化方案:RDB和AOF RDB方式按照一定的时间间隔对数据集创建基于时间点的快照. AOF方式记录Server收到的写操作到日志文件,在Server重启时通过回放这些写操作来重建数据集.该方式类似于MySQL中基于语句格式的binlog.当日志变大时Redis可在后台重写日志. 若仅期望数据在Server运行期间存在则可禁用两种持久化方案.在同一Redis实例中同时开启AOF和RDB方式的数据持久化方案也是可以的.该情况下Redis重启时AOF文件将用于重建原始数据集,因为叫R

redis数据持久化内存不足

原因:写数据到redis里面写不进去,查看redis日志显示: Can't save in background: fork: Cannot allocate memory 在小内存的进程上做一个fork,不需要太多资源,但当这个进程的内存空间以G为单位时,fork就成为一件很恐怖的操作. 发现问题之后,我先通过sysctl -a查看linux内核参数vm.overcommit_memory(sysctl -a |grep "vm.overcommit_memory"),我们直接修改内

redis 数据持久化 aof方式

打开redis的运行目录,选择数据库2(select 2,是空集)可以看到dump.rdb的上次保存时间是今天中午1:58 添加2条数据: 再查看dump.rdb,保存时间是现在(说明从1:58到现在没有修改过key) 在dump.rdb中可以看到刚才保存进入的数据,但是当添加第三个数据addr3时,dump.rdb的修改时间是不会变的,没有达到快照备份的频率. 现在选择标号为3数据库,添加2条数据,此时还未达到快照持久化的频率,所以默认dump.rdb中还没有这两个数据,dump.rdb的修改

redis学习——数据持久化

一.概述 Redis的强大性能很大程度上都是因为所有数据都是存储在内存中的,然而当Redis重启后,所有存储在内存中的数据将会丢失,在很多情况下是无法容忍这样的事情的.所以,我们需要将内存中的数据持久化!典型的需要持久化数据的场景如下: 将Redis作为数据库使用: 将Redis作为缓存服务器使用,但是缓存miss后会对性能造成很大影响,所有缓存同时失效时会造成服务雪崩,无法响应. 本文介绍Redis所支持的两种数据持久化方式. 二.Redis数据持久化 Redis支持两种数据持久化方式:RDB

Redis基本数据类型、数据持久化、过期策略及淘汰机制

一点技术.技术乐享!!! 如果有人问你:Redis这么快,他的“多线程模式”你了解吗? 请回答他:您是想问Redis这么快,为什么还是单线程模式吗? redis是什么 简单来说redis是C语言开发的一个开源的(遵从BSD协议)高性能键值对(key-value)的内存数据库,可以用作数据库.缓存.消息中间件等. 性能优秀,数据在内存中,读写速度非常快,支持并发10W QPS. 单进程单线程,是线程安全的,采用Io多路复用机制. 丰富的数据类型,支持字符串(string).散列(hash).列表(