首页 > 数据库 >Redis持久化机制详解

Redis持久化机制详解

时间:2024-01-05 23:33:19浏览次数:55  
标签:AOF 持久 fsync 文件 Redis 详解 快照 化机制

Redis持久化机制详解

1. RDB 持久化

Redis 可以通过创建快照来获得存储在内存里面的数据在 某个时间点 上的副本。Redis 创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis 主从结构,主要用来提高 Redis 性能),还可以将快照留在原地以便重启服务器的时候使用。
快照持久化是 Redis 默认采用的持久化方式,在 redis.conf 配置文件中默认有此下配置:

save 900 1           #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发bgsave命令创建快照。

save 300 10          #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发bgsave命令创建快照。

save 60 10000        #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发bgsave命令创建快照。

RDB 创建快照时会阻塞主线程么?
Redis 提供了两个命令来生成 RDB 快照文件:

  • save : 同步保存操作,会阻塞 Redis 主线程;
  • bgsave : fork 出一个子进程,子进程执行,不会阻塞 Redis 主线程,默认选项。

2. AOF 持久化

与快照持久化相比,AOF 持久化的实时性更好。默认情况下 Redis 没有开启 AOF(append only file)方式的持久化(Redis 6.0 之后已经默认是开启了),可以通过 appendonly 参数开启:

appendonly yes

开启 AOF 持久化后每执行一条会更改 Redis 中的数据的命令,Redis 就会将该命令写入到 AOF 缓冲区 server.aof_buf 中,然后再写入到 AOF 文件中(此时还在系统内核缓存区未同步到磁盘),最后再根据持久化方式( fsync策略)的配置来决定何时将系统内核缓存区的数据同步到硬盘中的。

只有同步到磁盘中才算持久化保存了,否则依然存在数据丢失的风险,比如说:系统内核缓存区的数据还未同步,磁盘机器就宕机了,那这部分数据就算丢失了。
AOF 文件的保存位置和 RDB 文件的位置相同,都是通过 dir 参数设置的,默认的文件名是 appendonly.aof。

AOF 工作基本流程是怎样的?

  1. 命令追加(append):所有的写命令会追加到 AOF 缓冲区中。
  2. 文件写入(write):将 AOF 缓冲区的数据写入到 AOF 文件中。这一步需要调用write函数(系统调用),write将数据写入到了系统内核缓冲区之后直接返回了(延迟写)。注意!!!此时并没有同步到磁盘。
  3. 文件同步(fsync):AOF 缓冲区根据对应的持久化方式( fsync 策略)向硬盘做同步操作。这一步需要调用 fsync 函数(系统调用), fsync 针对单个文件操作,对其进行强制硬盘同步,fsync 将阻塞直到写入磁盘完成后返回,保证了数据持久化。
  4. 文件重写(rewrite):随着 AOF 文件越来越大,需要定期对 AOF 文件进行重写,达到压缩的目的。
  5. 重启加载(load):当 Redis 重启时,可以加载 AOF 文件进行数据恢复。

标签:AOF,持久,fsync,文件,Redis,详解,快照,化机制
From: https://www.cnblogs.com/aclq/p/17948312

相关文章

  • 无涯教程-Redis - PHP连接
    在PHP程序中开始使用Redis之前,需要确保已在计算机上设置了RedisPHP驱动程序和PHP,您可以检查PHP教程以在您的计算机上安装PHP。现在,让无涯教程检查如何设置RedisPHP驱动程序。您需要从github存储库https://github.com/nicolasff/phpredis  下载phpredis,下载后,将文件解压缩......
  • 无涯教程-Redis - Java连接
    在Java程序中开始使用Redis之前,需要确保已在计算机上设置了RedisJava驱动程序和Java,您可以查看无涯教程的Java教程,以在计算机上安装Java。现在,看看如何设置RedisJava驱动程序。您需要从路径下载jedis.jar。确保下载它的最新版本。您需要将jedis.jar包含到类路径中。连接......
  • 【Redis技术专区】「原理分析」深入探索和分析Redis6.0为何需要启用多线程
    背景介绍在Redis6.0版本中,引入了多线程技术,这是为了进一步提高Redis的性能和并发处理能力。通过启用多线程,Redis能够同时处理多个客户端请求,有效地利用多核处理器资源,提高系统的吞吐量和响应速度。开启多线程可以在处理阻塞操作时提供更好的性能,例如慢查询、持久化操作等。此外,多......
  • PHP的array_column()函数用法详解
    在PHP中,经常需要对数组进行处理和操作。有时候,需要从一个多维数组中获取特定的一列数据,这时候就可以使用array_column()函数来实现。本文将详细介绍array_column()函数的用法。一、什么是array_column()函数array_column()是一个PHP函数,用于从一个多维数组中获取指定的一列数据。该......
  • 无涯教程-Redis - 管道管理
    Redis是一个TCP服务器,并支持请求/响应协议,在Redis中,通过以下步骤完成请求-客户端向服务器发送查询,并通常以阻塞的方式从Socket中读取服务器的响应。服务器处理命令并将响应发送回客户端。管道的基本含义是,客户端可以完全不等待答复就将多个请求发送到服务器,并最终在一个步骤中......
  • ctfshow-misc详解(持续更新中)
    杂项签到题目是个损坏的压缩包,考点:伪加密修改如下:保存解压得到flagflag{79ddfa61bda03defa7bfd8d702a656e4}misc2题目描述:偶然发现我竟然还有个软盘,勾起了我的回忆。我的解答:随便选一个虚拟机,然后编辑虚拟机设置然后添加选择软盘驱动器选择使用软盘映......
  • 无涯教程-Redis - 性能测试
    Redis基准测试是用于通过同时运行n个命令来检查Redis性能的实用程序。Benchmarks-语法以下是Redis基准测试的基本语法。redis-benchmark[option][optionvalue]Benchmarks-示例以下示例通过调用100000命令来检查Redis。redis-benchmark-n100000PING_INLINE:1......
  • 无涯教程-Redis - 安全密码
    可以保护Redis数据库,以使创建连接的所有客户端都需要在执行命令之前进行身份验证,为了保护Redis,需要在配置文件中设置密码。以下示例显示了保护Redis的步骤。127.0.0.1:6379>CONFIGgetrequirepass1)"requirepass"2)""默认情况下,此属性为空白,表示未为此设置密码。您可......
  • 无涯教程-Redis - 服务器命令
    Redis服务器命令基本上用于管理Redis服务器。Server-示例以下示例说明了如何获取有关服务器的所有统计信息和信息。redis127.0.0.1:6379>INFO#Serverredis_version:2.8.13redis_git_sha1:00000000redis_git_dirty:0redis_build_id:c2238b38b1edb0e2redi......
  • eslintrc.js配置文件详解
    转自:https://www.jianshu.com/p/fe727ad2bbf4通俗说就是统一代码规范。配置参数rules:{"规则名":[规则值,规则配置]}规则值"off"或者0//关闭规则关闭"warn"或者1//在打开的规则作为警告(不影响退出代码)"error"或者2//把规则作为一个错误(退出代码触......