redis 的持久化方案有哪些?
Redis 的持久化,说实话,刚开始接触的时候我是真没当回事。毕竟我当时的 Redis 是个工具人,负责干嘛?缓存啊!存点临时数据、做点热点缓存、减点数据库压力,用完就扔的那种,压根没考虑过“你活着的时候记点东西,万一挂了还能想起来自己是谁”。
但工作久了(不是我说自己资深啊,是工作自然“打脸”让我意识到),只把 Redis 当缓存用其实是远远不够的。
一、Redis 真的需要持久化吗?
我们得先认清一个现实:Redis 虽然是内存数据库,但它是能存盘的。
Redis 的默认模式是内存 + 持久化,也就是:数据都在内存里跑得飞快,挂了还能从磁盘拉起来。
那问题来了:你要不要让 Redis 去“存盘”?也就是——你要不要持久化?
答案其实很典型:看场景。
• ✅ 如果你 Redis 里放的是重要数据,比如计数器、Session、商品库存、队列数据等,持久化必须开。 • ❌ 如果你只是用 Redis 当缓存,失效就拉数据库重新加载一遍,那就关掉,免得给磁盘添麻烦。
二、Redis 的持久化方案有哪些?
常规来说,有三种(当然主从/哨兵算架构层面的,今天重点说前两种):
1. RDB(快照模式)
Redis 的 RDB 模式,说白了就是:定期把内存里所有数据“拍个快照”,存成一个 .rdb 文件。
这玩意最大的特点就是两个字:高效。
• 保存的时候,Redis fork 出一个子进程,然后这个子进程把内存 copy 一份,慢慢写磁盘,妈妈再也不用担心阻塞主线程; • 恢复的时候,直接读文件恢复,速度贼快; • 占空间小,写入磁盘速度也快。
但是呢,这玩意粒度很粗,你设置成每 5 分钟拍一次,那中间这 5 分钟的数据变化就没了。如果你在它存盘之前断电了?Sorry,白干了。
👇 RDB 的配置示例:
# 在 redis.conf 中
save 900 1 # 900 秒内至少有 1 个 key 改变就触发持久化
save 300 10 # 300 秒内至少有 10 个 key 改变就触发
save 60 10000 # 60 秒内至少有 10000 个 key 改变就触发想禁用?全注释掉 save 就行。
2. AOF(Append Only File)
AOF 是怎么工作的?它把 Redis 执行的每一个写操作的命令,都记录下来,一条条写进 .aof 文件里。
有点像你小时候上课记笔记的风格,每个动作都记录一笔。
它的特点是:非常非常完整,哪怕你刚插入一个 key,马上掉电,也能靠日志完整恢复回来。
当然,也有代价:
• 文件比 RDB 大很多; • 恢复的时候要把每一条命令都“重演”一遍,慢一点; • 写入比较频繁的话,IO 压力比较大。
👇 AOF 的配置示例:
appendonly yes# 开启 AOF
appendfsync everysec # 每秒写入一次,性能和安全的折中你可以设置三种写入策略:
• always:每次写操作都 fsync(最安全,最慢) • everysec:每秒 fsync 一次(默认) • no:完全交给操作系统(最快,最不安全)
3. 混合模式:RDB + AOF,一起上!
讲真,我自己最推荐的其实是:RDB + AOF 混合持久化。
为什么?
• RDB 恢复快,但不够实时; • AOF 实时性高,但写入成本高; • 两者一起用,互补优势,既有备份,又能增量记录。
而且 Redis 4.0+ 支持了混合写入,AOF 会先写入最近一次 RDB 的内容,再追加 AOF 日志,恢复的时候效率更高。
👇 开启混合模式:
appendonly yes
appendfilename "appendonly.aof"别担心,默认就支持混合格式,只要你 AOF 是开启的。
三、段子时间:掉电的 Redis 和我妈的菜市场小本子🧾
说个段子哈,我妈以前卖菜记账都是写在小本子上的,每次有人买菜她都能唰唰唰记一笔。
我就问她:“妈,这你要是掉了怎么办?”
她说:“掉了就掉了呗,大不了记忆重建。”
我顿时就明白了:这是不开持久化的 Redis 啊!
后来她怕万一真的掉了,就每晚都拍照传我微信——这不就是 RDB 快照嘛!
再后来,她让我帮她整个 Excel 表格,我还给她写了个 Python 脚本,改成每条都自动记录——AOF 完美上线!
现实里最怕的事不是 Redis 掉电,而是老板早上 9 点问你:“Redis 的库存怎么没了?”
你说:“没开持久化。”
老板:“那你就别来了。”
四、写个小脚本,玩玩 AOF 写法
我们写个模拟 Redis 的 AOF 追加机制的小例子,当然只是演示:
defwrite_aof(command, filepath="appendonly.aof"):
withopen(filepath, "a") as f:
f.write(command + "\n")
write_aof("SET user:1000 name 'Tom'")
write_aof("INCR page:view:home")
write_aof("DEL temp:key")运行几次看看生成的 appendonly.aof 文件,是不是有点感觉了?
五、到底选谁?
一句话总结:重要数据就别抠门,该开的持久化咱就开,不然等挂的时候哭都来不及。
• Redis 就当缓存?不开持久化; • Redis 也当小数据库?建议 AOF + RDB 混合开起来; • 想减少文件体积、备份定期快照?RDB 就够了; • 想追求数据完整性、尽量不丢数据?AOF 是王道。
最后
程序员的日常,其实很像 Redis 的持久化策略。
我们也有时候想“靠内存”撑着:不做笔记、不写文档、不留痕迹,全靠脑子记。但总有断电的那一刻——可能是项目跑路,也可能是自己猝不及防“下线”。
所以啊,有空多写写,哪怕只是 AOF 那种“每条操作都记一笔”的方式,日后不迷路,才是真的安全持久化。
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek