Redis持久化机制:AOF日志

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: 说到关系型数据库,最常想到的就是MySQL、oracle了;说到非关系型数据库,最常想到的就是redis、MongoDB了。而Redis因其速度快的优势,广泛应用在各种缓存场景中。但redis数据是存储在内存中,所以数据的持久化就显得尤为重要,我们都知道,Redis有两大持久化机制,分别是 AOF日志 和 RDB快照,今天就先来说说AOF日志的重要知识吧。

前言

说到关系型数据库,最常想到的就是MySQL、oracle了;说到非关系型数据库,最常想到的就是redis、MongoDB了。而Redis因其速度快的优势,广泛应用在各种缓存场景中。

但redis数据是存储在内存中,所以数据的持久化就显得尤为重要,我们都知道,Redis有两大持久化机制,分别是 AOF日志RDB快照,今天就先来说说AOF日志的重要知识吧。

AOF写入规则

简单来说,AOF写入规则就是:

  1. redis执行命令
  2. 执行成功后,将命令记录到日志中(注意,是将命令记录起来)

注意,命令成功后才会记录命令,这样就可以避免记录大量错误命令到日志中了。

AOF存在2个潜在风险:

  • 丢失数据,比如刚执行完一个命令,AOF日志还没记录就宕机了,此时会丢失这个命令日志。
  • 会阻塞Redis主线程:AOF不会阻塞当前的操作,但是可能会给下一操作带来阻塞的风险,因为AOF日志也是在Redis的主线程中完成的。

AOF的3种写回策略

为了解决丢失数据的风险,AOF有提供了3种写回策略,分别是:

  • Always 同步写回:每个写命令执行完成,立刻同步地将日志写回磁盘;
  • Everysec 每秒写回:每个写命令执行后,日志先写到内存缓冲区,每1秒将缓冲区的内容写入磁盘;
  • No 操作系统控制的写回:每个写命令执行后,把日志写到AOF文件的内存缓冲区,写入时机由操作系统决定。

每种策略都有各自的优缺点,总结就是:

策略 优点 缺点
Always 数据基本不丢失 每个命令执行后都得同步,性能影响大
Everysec 性能适中 宕机会丢失1秒内的数据
No 性能最好 宕机会丢失较多数据

根据每种策略的优缺点,我们结合项目的要求来选择策略。比如说我们的数据可靠性的要求特别高,就选择Always策略;如果想高性能,可靠性要求不是很高,就选择No策略;如果允许数据有少部分丢失,性能要求不能受太大影响,我们可选择Everysec策略。

当AOF记录的日志越来越多,日志文件也会随着增大,我们需要注意随之产生的性能问题。总结有3点:

  1. 系统会限制保存过大的文件;
  2. 文件太大,追加日志的话,效率会变低;
  3. 文件太大,如果发生宕机,恢复时间就会很慢。

Redis的设计者也考虑到了这个问题,因此就有了下面要讲的AOF重写机制。

AOF重写机制

重写机制说简单点,就是会对记录的多条命令加以判断,如果可合并,就对多条命令合并,这样就减少了文件大小。 举个例子来说:

重写前的命令:
$ hset nba curry 30
$ hset nba james 23
$ hdel nba james 23
$ hset nba kobe 24
复制代码

此时nba这个哈希列表中有的数据是:curry 30, kobe 24

经过AOF重写后的命令就会简化成:

$ hset nba curry 30
$ hset nba kobe 24
复制代码

AOF重写这个过程,不会阻塞主线程。因为这个过程是通过后台子进程bgrewriteaof去完成的。重写这个过程,总结来说就是一个拷贝,两处日志。

一个拷贝 意思就是当AOF重写时,主线程会fork出一个子进程bgrewriteaof。同时,fork会将主线程的内存拷贝一份给子进程,这样子进程就能访问到最新的数据,bgrewriteaof就将需要拷贝的数据记录到重写日志。

两处日志 指的是:1. 正在使用的AOF日志,redis会将它写到缓冲区;2.新的AOF重写日志,也会被写到重写日志的缓冲区,等到拷贝数据的重写完成后,再将新的重写日志也写到AOF文件中。

归纳一下,每次AOF重写时,Redis会拷贝一份内存用于重写。然后2处日志就是保证重写过程中,新产生的数据不会丢失。

AOF重写的触发条件

我们可通过2个配置项去控制AOF重写的触发:

  1. auto-aof-rewrite-min-size: 表示运行AOF重写时文件的最小大小,默认为64MB
  2. auto-aof-rewrite-percentage: 当前AOF文件比上一次重写后AOF文件的增量大小,和上一次重写后AOF文件大小的比值。

当AOF文件大小同时超出2个配置项的值时,Redis就会触发AOF重写这个机制。

小结

Redis AOF日志,是Redis持久化机制的一种。当我们要选择此机制时,需要了解其写入规则及其重要参数,才能更好的配置好redis。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 NoSQL 安全
Redis的两种持久化方式---RDB、AOF
通过本文的介绍,我们详细讲解了Redis的两种主要持久化方式:RDB和AOF。每种方式都有其独特的优缺点和适用场景。在实际应用中,可以根据具体需求选择合适的持久化方式,或者同时启用RDB和AOF,以达到最佳效果。希望本文能帮助您更好地理解和应用Redis的持久化机制,构建高效、可靠的数据存储解决方案。
140 79
|
3月前
|
存储 NoSQL Redis
Redis 持久化揭秘:选择 RDB、AOF 还是混合持久化?
Redis 是一个内存数据库,意味着它主要将数据存储在内存中,从而能够提供极高的性能。然而,作为内存数据库,Redis 默认情况下的数据不会永久保存。为了确保数据在重启或故障后能够恢复,Redis 提供了几种 **持久化机制**。这些机制允许 Redis 将内存中的数据保存到硬盘上,从而实现数据持久化。
201 22
Redis 持久化揭秘:选择 RDB、AOF 还是混合持久化?
|
2月前
|
存储 运维 NoSQL
【赵渝强老师】Redis的慢查询日志
Redis慢查询日志用于记录执行时间超过预设阈值的命令,帮助开发和运维人员定位性能问题。每条慢查询日志包含标识ID、发生时间戳、命令耗时及详细信息。配置参数包括`slowlog-max-len`(默认128)和`slowlog-log-slower-than`(默认10000微秒)。实战中可通过`slowlog get`获取日志、`slowlog len`查看长度、`slowlog reset`重置日志。建议线上环境将`slowlog-max-len`设为1000以上,并根据并发量调整`slowlog-log-slower-than`。需要注意的是,慢查询只记录命令执行时间。
159 5
|
4月前
|
监控 NoSQL 测试技术
【赵渝强老师】Redis的AOF数据持久化
Redis 是内存数据库,提供数据持久化功能,支持 RDB 和 AOF 两种方式。AOF 以日志形式记录每个写操作,支持定期重写以压缩文件。默认情况下,AOF 功能关闭,需在 `redis.conf` 中启用。通过 `info` 命令可监控 AOF 状态。AOF 重写功能可有效控制文件大小,避免性能下降。
125 6
|
5月前
|
存储 缓存 NoSQL
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
80 2
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
|
5月前
|
存储 Prometheus NoSQL
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
72 3
|
5月前
|
存储 缓存 NoSQL
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
111 1
|
21天前
|
存储 缓存 关系型数据库
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
29 5
图解MySQL【日志】——Redo Log
|
4月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
1196 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
3月前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。