2024年10月,Redis新版本优化了持久化机制,提升了数据恢复效率;同年,某大型电商平台通过优化Redis持久化策略,在服务器意外宕机后成功避免了关键交易数据的丢失,保障了促销活动的平稳运行。
大家好,今天我们来聊聊Redis怎么让数据持久保存,避免丢失的秘密。你可能知道Redis是一个速度很快的内存数据库,但它把数据都放在内存里,一旦服务器重启或者出问题,内存里的数据就全没了。这肯定不行,尤其是用来存重要信息的时候。所以,Redis提供了几种方法,可以把内存里的数据保存到硬盘上,这样就算重启,也能从硬盘再把数据加载回来,保证数据不失效。
第一种方法:快照
快照,你可以想象成给数据拍一张照片。Redis会在某个时间点,把当前内存里的所有数据,整个复制一份,保存成一个文件在硬盘上。这个文件就叫做RDB文件。你可以设置什么时候拍这张照片,比如每过900秒,如果至少有1个数据被修改了,就拍一次;或者每过300秒,至少有10个数据被修改了,就拍一次;也可以每过60秒,至少有10000个数据被修改了,就拍一次。这样设置很灵活。拍快照的时候,Redis会用一个单独的子进程来做,这样主进程还能继续处理你的请求,不会卡住。但是,拍快照是隔一段时间才拍一次,所以如果刚拍完快照,服务器就出问题了,那么从上次拍快照到出问题这段时间里修改的数据,可能就会丢失。这是它的一个缺点。
第二种方法:写日志
写日志,也叫AOF。这个方法不是拍照片,而是像写日记一样,把Redis执行的所有写命令,一条一条记录下来,保存到一个文件里。这个文件就是AOF文件。当Redis重启的时候,它会把AOF文件里的命令重新执行一遍,这样内存里的数据就恢复回来了。你可以设置写日志的时机,比如每执行一条写命令就立刻记到硬盘上,这样最安全,但速度会慢一点;或者每隔一秒把这段时间的命令批量写到硬盘上,这样平衡了安全和速度,是默认推荐的方式;也可以完全交给操作系统决定什么时候写,这样最快,但万一系统崩溃,可能会丢失多一点数据。AOF文件会越来越大,所以Redis会自动在后台重写AOF文件,把一些重复的、没用的命令合并,让文件变小。AOF的好处是数据丢失少,特别是如果你设置成每次命令都写硬盘,那几乎不会丢数据。但缺点是这个日志文件通常比RDB快照文件大,而且恢复数据的时候,重新执行所有命令可能会比较慢。
怎么选择和使用?
其实,Redis允许你同时使用快照和写日志这两种方法。很多人也是这么做的,这样就更保险了。当Redis启动的时候,如果AOF文件存在,它会优先用AOF文件来恢复数据,因为AOF通常数据更完整。你可以在配置文件里设置它们。比如,同时开启RDB和AOF。对于快照,你根据你的需要调整拍照片的条件。对于写日志,用默认的每秒写一次通常就不错。同时,定期检查一下硬盘上的这些文件是否完好,并且做好备份,比如把RDB文件和AOF文件复制到其他安全的机器上。这样,就算这台服务器的硬盘坏了,你还有备份。记住,没有绝对“永生”的技术,但通过合理设置快照和写日志,并且做好备份,你的Redis数据就能非常持久,几乎不用担心丢失,实现所谓的“缓存永生”。关键是理解你的数据有多重要,能承受多少丢失,然后选择合适的策略组合。
引用来源:基于Redis官方文档(redis.io/topics/persistence)中关于RDB和AOF持久化的说明,以及社区实践中常见的混合持久化配置建议。