Redis为什么先执行指令,再写AOF日志?

本文探讨Redis的AOF日志机制,分析其在大量写数据情况下的工作原理及为何不同于传统数据库的重做日志。深入理解Redis事务特点与AOF日志的写入流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么这么问

因为在常见的数据库中,持久化重做日志一般是先写日志再修改数据库,保证数据/操作不会丢失。所以看到redis的AOF日志的机制后,很困惑,网上连这个问题的提问都没有,书上也是一笔带过。要弄明白这个问题,首先要搞懂Redis写AOF日志的流程。

写AOF日志
  • 首先,AOF日志中写入的是收到的操作命令记录。redis包含丰富的数据类型,对set数据执行Rpush显然会发生错误,因此命令写入AOF日志前redis会检查语法,参数校验等,没问题的话,再写入日志。比如下图:
    在这里插入图片描述
    显然rpush java这条命令参数出现错误,而rpush books java类型错误,redis会完成参数校验和语法检测,这种错误的命令也显然不能修改数据。
  • 其次 AOF日志在大量写数据的情况下,由于所有的修改命令都要写入AOF日志,因此AOF日志文件会很大,这时候就需要重写AOF日志了。
原因分析:

其他的数据库,比如mysql的redo log写入的是数据页修改的记录,写入的是物理修改,因此在事务提交时先写redo log,再做修改操作,可以保证突然宕机时数据不会丢失。通过上面写AOF日志的简单分析,如果redis也采取先写日志再操作的话,AOF日志中会出现很多无效/错误的命令记录,对本来就庞大的AOF文件来说简直是雪上加霜,我认为这是第一个原因(允许反驳)。
另外一个原因我认为是,redis的事务比起mysql等数据库的事务机制来说,可以称为弱事务,事务中出现某一个错误也会继续执行,同时如果CAS发现事务执行过程中,数据被其他线程更改了,那么事务执行失败,redis也没有回滚。这样的事务,会出现很多没有修改成功数据命令。如果先写日志,同样会有很多无效命令(同样允许反驳)。

以上是我个人看法,有大神的高见,赶紧砸向我的脸!!!

### Redis 无法启动的原因 当尝试启动 Redis 遇到问题时,可能由多种因素引起。一种情况是在 `/etc/rc.local` 文件中加入了 `redis-server` 启动指令,这可能导致服务器启动过程在此处被阻塞,进而影响整个系统的正常启动流程[^1]。 另一种常见的原因是配置文件中的监听地址设置不当。如果 Redis 的配置文件指定了错误的 IP 地址或端口用于绑定网络接口,则可能会阻止客户端成功建立连接[^2]。 此外,内存不足也可能成为阻碍 Redis 正常运行的因素之一。由于 Redis 是基于内存的操作型数据库管理系统,其性能高度依赖于可用 RAM 的数量;一旦物理内存耗尽,操作系统会触发 OOM Killer 杀死进程来释放资源,而 Redis 很可能是受害者之一[^3]。 还有就是权限问题,比如文件夹或文件的权限不够,导致 Redis 没有写入持久化数据所需的适当权限也会造成服务不能顺利开启[^4]。 最后,版本兼容性也是一个潜在的风险点。不同版本之间可能存在 API 变更或其他内部实现上的差异,这些变化有时会导致旧版客户端难以与新版服务器通信,反之亦然[^5]。 ### 解决方案 针对上述提到的各种原因,以下是相应的解决办法: 对于因为将 `redis-server` 加入 `/etc/rc.local` 导致的服务卡住现象,建议移除该条目并考虑通过 systemd 或其他初始化管理工具来进行更加可靠的后台守护进程控制方式。 关于配置文件内监听地址设定失误的情况,应仔细检查 redis.conf 中涉及 bind 和 port 参数的部分,确保它们指向正确的本地主机名/IP以及开放给外部访问的安全端口号。 面对内存溢出风险,可以通过调整 maxmemory 设置限定最大允许使用的内存量,并启用 LRU (Least Recently Used) 清理策略自动淘汰较早之前未再触及的数据项以维持系统稳定运作状态。 至于权限方面的问题,确认所有相关路径下的目录结构拥有者身份及其所属组别均匹配预期值,并赋予必要的读/写许可权限以便顺利完成 AOF/RDB 日志记录操作。 考虑到软件更新带来的不确定性挑战,务必查阅官方文档了解迁移指南,必要时降级回退至已知稳定的发行版直至找到合适的补丁修复程序为止。 ```bash # 修改 /etc/systemd/system/redis.service 文件样例 [Unit] Description=Redis In-Memory Data Store After=network.target [Service] User=redis Group=redis ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf ExecStop=/usr/local/bin/redis-cli shutdown Restart=always [Install] WantedBy=multi-user.target ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值