首页 > 数据库 >Redis持久化

Redis持久化

时间:2024-09-04 10:14:23浏览次数:9  
标签:文件 持久 AOF Redis RDB 数据

Redis的数据都是存储在内存中,为了数据的永久保存,需要把数据同步到硬盘上,这个过程就叫做持久化. Redis的持久化存在有两种方式: rdb方式,aof方式,这两种方式可以单独使用,也可以综合使用.

1. RDB(Redis Database Backup file(Redis数据备份文件))

RDB也被叫做Redis数据快照(snapshot),简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。

1.1 执行时机

RDB持久化在四种情况下会执行:

执行save命令

执行bgsave命令

Redis停机时

触发RDB条件时

1.2 RDB原理

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能,如果需要进行大规模的快照,且处于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效.RDB的缺点就是最后一次持久化后的数据可能丢失.

1.3 具体流程

具体流程如下:

  1. redis 客户端执行 bgsave 命令或者自动触发 bgsave 命令;

  2. 主进程判断当前是否已经存在正在执行的子进程,如果存在,那么主进程直接返回;

  3. 如果不存在正在执行的子进程,那么就 fork 一个新的子进程进行持久化数据,fork 过程是阻塞的,fork 操作完成后主进程即可执行其他操作;

  4. 子进程先将数据写入到临时的rdb文件中,待快照数据写入完成后再原子替换旧的 rdb文件;

  5. 同时发送信号给主进程,通知主进程 rdb 持久化完成,主进程更新相关的统计信息

fork采用的是copy-on-write技术:

当主进程执行读操作时,访问共享内存;  
当主进程执行写操作时,则会拷贝一份数据,执行写操作。

1.4 总结

  1. 整个过程中,主进程是不进行任何 IO 操作的,这就确保了极高的性能

  2. 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效

  3. RDB 的缺点是最后一次持久化后的数据可能丢失

2. AOF

以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来(不会记录读指令),只许追加文件但是不可以改写文件,redis启动之初会读取该文件(appendonly.aof)重新构建数据。
换而言之:redis重启的话就是根据日志文件的内容将写指令从头到尾执行一次,以完成数据的恢复工作。

  1. 客户端的请求写命令会被 append 追加到 AOF 缓冲区内

  2. AOF 缓冲区根据 AOF 持久化策略[always,everysec,no]将操作 sync 同步到磁盘的 AOF 文件 中

  3. AOF 文件大小超过重写策略或手动重写时,会对 AOF 文件 rewrite 重写,压缩 AOF 文件容量

  4. Redis 服务重启时 ,会重新 load 加载 AOF 文件中的写操作达到数据恢复的目的

2.1 aof重写机制

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。

AOF原本有三个命令,但是set num 123 和 set num 666都是对num的操作,第二次会覆盖第一次的值,因此第一个命令记录下来没有意义。
所以重写命令后,AOF文件内容就是:mset name jack num 666

2.2 原理

AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。 AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似

2.3 触发条件

在 APPEND ONLY MODE模块下有两条默认配置


这两条配置就是触发重写aof文件的条件,第一个表示文件大小达到前一次保存文件的一倍,第二个表示aof文件大小最少达到64MB,两个条件必须同时满足。

2.4 总结

AOF方式,以日志记录每一个操作。Redis可以通过日志去还原数据。

优势: 安全性相对RDB方式高很多,它记录了每一个操作

劣势:效率相对于RDB方式低很多。

Redis默认是关闭AOF方式的。 

3. RDB与AOF对比

3.1 RDB

采用的是快照机制进行的持久化

3.1.1 优点

RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集。 这种文件非常适合用于进行备份

RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快(因为其文件要比AOF的小)==

RDB的性能要比AOF更好

3.1.2 缺点

RDB的持久化不够及时(一定时间间隔),可能会存在数据丢失,不便于数据库的重构(因为是快照的某一时刻最终结果,不清楚数据的变化过程)

RDB持久化时如果文件过大可能会造成服务器的阻塞,停止客户端请求

3.2 AOF

采用append模式,不断的记录数据的变化过程

3.2.1 优点

AOF的持久性更加的耐久(可以每秒 或 每次操作保存一次)

AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松,数据几乎不会丢失,便于数据库的重构。

AOF是增量操作

3.2.2 缺点

对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积,而且AOF文件只会越来越大(即使是删除命令也会被记录)

根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB. 

3.3 选择

如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失,选择RDB 持久化。

如果对数据的完整性要求比较高, 选择AOF

官方推荐两个都启用

摘抄自:https://blog.csdn.net/qq_52495299/article/details/141598468

标签:文件,持久,AOF,Redis,RDB,数据
From: https://www.cnblogs.com/shuijibaobao/p/18395930

相关文章

  • (八)Redis 主从复制、切片集群
    一、主从复制1、主从关系都说的Redis具有高可靠性,这里有两层含义:一是数据尽量少丢失,二是服务尽量少中断。AOF和RDB保证了前者,而对于后者,Redis的做法就是将一份数据同时保存在多个实例上。为了保证数据一致性,Redis提供了主从库模式,并采用读写分离的方式,如图2、主从复制-......
  • Redis性能压测、监控工具及优化方案
    当今的互联网应用中,Redis作为一种高性能的键值数据库,扮演着不可或缺的角色。它在处理海量数据和高并发请求方面表现卓越。然而,随着业务规模的扩大,如何确保Redis的性能保持在最佳状态,成为了开发者和运维人员不可忽视的难题。在面对复杂业务场景时,如何进行Redis的性能压测?有哪些......
  • Redis学习
    一.Redis简介    Redis是一个基于内存的key-value结构数据库(MYSQL:磁盘存储,二维表),它的读取性能高,适合存储热点数据(热点商品,资讯,新闻)二.如何启动服务并连到客户端    1.启动服务 redis-server.exeredis.windows.conf    2.连接客户端r......
  • Redis组件介绍(六)
    写在前面今天学习redis最后的知识。Redis的发布与订阅发布/订阅模式Redis提供了两种发布/订阅模式:基于频道(Channel)的发布/订阅基于模式(Pattern)的发布/订阅相关命令订阅频道subscribechannel[channel...]订阅给定的一个或多个频道。退订频道unsubs......
  • Redis数据结构:Zset类型全面解析
    Redis数据结构:Zset类型全面解析Redis,作为一种高性能的键值对数据库,因其丰富的数据类型和高效的性能而受到了广泛的关注和使用。在Redis的五种主要数据类型中,Zset(有序集合)类型可能是最复杂,但也是最强大的一种。Zset不仅可以存储键值对,还可以为每个元素分配一个分数,然后根......
  • Redis备忘录
    基础知识缓存设计思想缓存的主要目的是提高数据访问速度,减少后端数据库的压力。设计时需要考虑:数据一致性:缓存与数据库中的数据需保持一致。缓存失效策略:如LRU(最近最少使用)等,以便有效管理缓存中的数据。数据过期:设置合理的过期时间,避免不必要的数据占用缓存空间。缓存开发......
  • SpringBoot项目常用配置文件MybatisPlusConfig、RedisConfig、RedissonConfig、Swagge
    MybatisPlusConfig:@Configuration@MapperScan("com.yupi.usercenter.mapper")publicclassMybatisPlusConfig{@BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptor=newMybatisPlusInterc......
  • 常见持久层框架赏析,到底是什么让你选择 MyBatis?
    在绝大多数在线应用场景中,数据是存储在关系型数据库中的,当然,有特殊要求的场景中,我们也会将其他持久化存储(如ElasticSearch、HBase、MongoDB等)作为辅助存储。但不可否认的是,关系型数据库凭借几十年的发展、生态积累、众多成功的案例,依然是互联网企业的核心存储。作为一个Java开......
  • springboot环境+redis实现分布式限流
    分布式限流,依赖redis实现1个按秒限流的限流器,知识点:自定义注解,切面,注解的使用源码1.创建自定义注解RateLimit首先,我们定义一个自定义注解RateLimit,它包含code和limit属性。importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;import......
  • 51. redis基础命令使用手册
    redis基础命令使用手册安装常用命令启动客户端示例Redis使用认证密码登录修改配置文件重启Redis登录验证在命令行客户端配置密码(redis重启前有效)在Redis集群中使用认证密码数据库选择默认有16个数据库选择数据库查看当前数据库数据结构stringslists集合有序集合哈希友情链接安装m......