首页 > 数据库 >Redis持久化

Redis持久化

时间:2023-09-04 19:22:38浏览次数:35  
标签:文件 持久 AOF Redis redis 命令 RDB

1.描述

redis的持久化是为了避免进程突然退出导致数据永久丢失,需要将redis中的数据以某种形式从内存保存到硬盘中。当redis再次重启时,通过这些redis持久化文件对进程结束之前的数据进行数据恢复。
redis持久化的方式有RDB持久化和AOF持久化两种。RDB持久化是通过将数据保存到硬盘,AOF持久化则是通过将命令保存到硬盘。由于AOF持久化的实时性更好,即当进程意外退出时丢失的数据更少,因此AOF是目前主流的持久化方式。

2.RDB持久化

RDB持久化是将redis中的数据以快照的方式保存到硬盘中,保存的为rdb文件,在redis重启时会通过读取这个文件进行恢复数据。

2.1 触发方式

RDB持久化分为手动触发和自动触发两种。
手动触发
手动触发可以通过save和bgsave命令进行触发

  • save命令:当执行save命令后,redis会对数据进行持久化操作,但是该命令会阻塞当前redis服务器,因此一般生产环境进行持久化的时候不会通过该命令进行。
  • bgsave命令:当执行bgsave命令,redis进行持久化是通过主进程fork一个子进程进行持久化操作,因此其只有在fork的过程中才会阻塞redis服务器,而在数据持久化的过程中并不会阻塞。

自动触发
自动触发是通过redis的配置文件redis.conf中的save <seconds> <changes>命令进行自动执行的,该命令的含义是当seconds秒内发生了chasnges次改变时,会调用bgsave命令进行RDB持久化,redis的默认配置为:

save 900 1
save 300 10
save 60 10000

2.2 执行流程

从上面的执行流程可以看出其执行步骤为:
(1):redis父进程首先判断当前是否在执行save,bgsave或bgrewriteaof的子进程,如果有则直接返回。因为如果有两个并发的子进程同时执行大量的磁盘写操作,可能会引起严重的性能问题。
(2):redis通过步骤一之后会fork一个子进程,父进程在fork子进程的时候是会阻塞的
(3):redis父进程fork子进程结束后能够响应其它的命令。
(4):redis的子进程会生成rdb文件,rdb文件生成之后会将新的rdb文件替换旧的rdb文件
(5):通知父进程持久化完成

2.3 RDB常用配置

save <seconds> <changes>:bgsave自动触发条件,如果设置为save "",则表示RDB持久化自动触发没有开启
stop-writes-on-bgsave-error yes:当bgsave出现错误时,redis是否停止执行写命令,如果设置为yes,则当硬盘出现问题时可以即使发现,避免数据的大量丢失,如果设置为no,则redis会无视bgsave的错误继续执行写命令。
rdbcompression yes:是否开启RDB文件压缩
rdbchecksum yes:是否开启RDB文件的校验,在写入文件和读取文件的时候都起作用。
dbfilename dump.rdb:RDB文件名
dir ./:RDB文件和AOF文件所在的目录

2.4 RDB持久化的优缺点

优点

  • 适合大规模的数据备份、恢复;
  • 可以定时备份
  • 加载比AOF快

缺点

  • 如果redis宕机的话会丢失一部分数据
  • 如果数据量过大,同步的时候会产生大量IO,严重影响服务器性能

3.AOF持久化

AOF持久化是将redis执行的命令单独放到日志文件中,当redis重启时再次按顺序执行aof文件中的命令,来恢复之前的数据。与RDB相比,AOF持久化的实时性更好,因此aof使用的更加多。另外aof持久化默认在redis中是关闭的,想要将其开启,需要修改配置文件的appendonly yes命令。

3.1 AOF的执行流程

AOF的执行流程可以分为三步,为:

  • 命令追加:将redis的命令写道aof_buf缓冲区;
  • 命令写入和文件同步:根据同步策略将aof_buf中的内容同步到硬盘;其同步策略是由redis配置文件中的appendfsync控制,有三个值:
    • always:这个是指每次有写命令都将其同步到AOF文件。
    • no:这个命令是不主动写入到AOF文件,由操作系统进行写入,通常同步周期30秒。
    • everysec:这个是每秒将aof_buf缓冲区中的写命令写入到AOF文件中,是redis默认的配置
  • 文件重写:定期重写AOF文件,达到压缩的目的;其重写是fork一个子进程将redis中的数据转化为写命令,同步到新的AOF文件,会将完成之后再用新的AOF文件来替换老的文件。在重写的过程中如果有新的数据写入到redis,那么会将命令写到aof_rewrite_buf(重写缓冲区)中,防止在重写的过程中把这部分数据丢失。

3.2 AOF常用配置

appendonly no:是否开启AOF持久化,yes开启,no关闭
appendfilename "appendonly.aof":AOF持久化文件
appendfsync everysec:fsync持久化策略
no-appendfsync-on-rewrite no:AOF重写期间是否禁止fsync,如果开启的话则能够降低文件重写时CPU和硬盘的负载,但是可能会丢失AOF重写期间的数据
auto-aof-rewrite-percentage 100:AOF重写时,当前AOF大小与上一次重写时AOF大小的比值
auto-aof-rewrite-min-size 64mb:AOF重写时,文件的最小大小
aof-load-truncated yes:如果AOF文件结尾损坏,redis启动时是否仍载入AOF文件

3.3 AOF持久化的优缺点

优点

  • 能够更好的保护数据不丢失

缺点

  • 数据恢复的速度比RDB慢
  • AOF持久化文件比RDB持久化文件大

4.AOF-RDB混合持久化

在redis4.0版本之前同时开启AOF持久化和RDB持久化时,redis在重启时会优先加载AOF文件,只有当AOF文件不存在时才会加载RDB文件。而在redis4.0版本之后存在AOF-RDB混合持久化,开启方式通过aof-use-rdb-preamble yes配置文件进行开启,但是必须先开启AOF持久化。AOF-RDB混合持久化的过程是在redis数据本次对RDB快照文件和下次对RDB快照文件之间进行AOF持久化,对数据进行RDB快照之后会将AOF持久化文件进行清空。而在redis重启恢复数据时,是先读取RDB持久化文件,然后再读取AOF持久化文件进行数据恢复。

标签:文件,持久,AOF,Redis,redis,命令,RDB
From: https://www.cnblogs.com/mcj123/p/17672425.html

相关文章

  • 虹科干货 | 什么是Redis数据集成(RDI)?
    大量的应用程序、日益增长的用户规模、不断扩展的技术需求,以及对即时响应的持续追求。想想这些是否正是你在经历的。也许你尝试过自己构建工具来应对这些需求,但是大量的编码和集成工作使你焦头烂额。那你是否知道,有这样一个工具可以帮助你实现从缓存中执行所有查询?一、推出Redis数......
  • Spring缓存抽象怎么和redis进行集成
    一.在Mavenpom.xml文件中加入Redis包<!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-redis</artifactId><version>${boot.version}</version></depen......
  • 规则持久化-实现push模式持久化
                        ......
  • 规则持久化-规则管理三种模式
        ......
  • Redis存取数据快的原因
    1.Redis是完全基于内存的,绝大部分请求是纯粹的内存操作,这个数据存在内存中,类似于HashMap,而HashMap的优势就是查找和操作的时间复杂度都是0(1);2.数据结构简单,对数据操作也简单,redis中的结构都是特殊设计的;3.采用单线程,不存在多进程和多线程导致的切换而消耗CPU,不用去考虑各种锁的......
  • Amazo S3 是如何实现 99.999999999% 的持久性和可用性的?
    亚马逊简单存储服务(AmazonS3)是最广泛使用和可靠的云存储服务之一,提供高度可扩展和耐用的存储。许多S3客户的关键要求是确保其数据的最大正常运行时间和可用性。在本文中,我们将深入探讨S3如何通过其稳固的系统架构和实现方式实现超过99.99%的可用性。亚马逊云科技开发者社......
  • Redis7 入门概述
    一、是什么RemoteDictionaryServer(远程字典服务)二、能干啥1、主流功能与应用1、分布式缓存2、内存存储和持久化(RDB+AOF)redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务3、高可用架构搭配(单机主从哨兵集群)4、缓存穿透、击穿、雪崩5、分布式锁6、队列7、......
  • Redis—分布式锁
    单实例的正确实现方式获取锁的正确操作为:SETresource_namemy_random_valueNXPX30000,它限定了只有当锁空闲且持有锁的时间为30000ms,并且锁资源对应的value为一个随机值。设置随机值是为了在释放锁时,确保当前线程能够释放该锁,避免出现操作超时的线程释放了其它线程的锁。......
  • springboot - 整合redis
    1.引入pom依赖<!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--fastjson序列化器--><dependency><grou......
  • RedisTemplate使用文档
    一.Redis五种基本数据类型1.String字符串String的数据结构是简单的Key-Value模型,Value可以是字符串,也可以是数字。应用场景计数器—点赞,视频播放量,每播放一次就+1统计多单位的数量粉丝数对象缓存存储2.Hash散列表Redis的哈希是键值对的集合。Redis的哈希值是字符串......