之前介绍过用Redis给网站提速,但很多人忽略了一个关键问题:Redis的数据默认在内存里,服务器重启或崩溃,数据可能全没了。持久化配置决定了你的Redis数据安不安全。本文讲清Redis的持久化机制和生产环境该怎么配。
一、为什么要关心持久化?
Redis是内存数据库,速度快但内存断电即失。如果你只把Redis当纯缓存(数据丢了从数据库重新加载即可),持久化不那么重要;但如果Redis存了不能丢的数据(会话、队列、计数、甚至当主数据库用),就必须配好持久化,否则一次重启就是数据灾难。
二、两种持久化机制:RDB vs AOF
RDB(快照):每隔一段时间把内存数据整体快照存到磁盘。
- 优点:文件紧凑、恢复快、对性能影响小;
- 缺点:两次快照之间的数据可能丢失(如每5分钟一次,崩溃时丢最近5分钟)。
AOF(追加日志):把每个写操作追加记录到日志文件。
- 优点:数据更安全(可配置每秒甚至每次写都记录),丢失窗口极小;
- 缺点:文件较大、恢复较慢、对性能有一定影响。
三、怎么选?
- 纯缓存:可以只开RDB,甚至关闭持久化(反正数据能重建);
- 重要数据:开启AOF(appendfsync everysec 每秒同步,性能和安全平衡);
- 最稳妥:RDB + AOF同时开启——AOF保证数据安全性,RDB用于快速恢复,这是生产环境推荐配置。
配置示例(redis.conf):
save 900 1 # RDB:900秒内有1次修改就快照
save 300 10
appendonly yes # 开启AOF
appendfsync everysec # 每秒同步(推荐)
四、内存管理:maxmemory与淘汰策略
Redis吃内存,不限制的话可能吃爆服务器内存导致OOM(参考swap篇)。必须设置内存上限和淘汰策略:
maxmemory 2gb # 内存上限
maxmemory-policy allkeys-lru # 淘汰策略
常用淘汰策略:
- allkeys-lru:内存满时淘汰最久未用的键——纯缓存场景首选;
- volatile-lru:只淘汰设了过期时间的键;
- noeviction:不淘汰,内存满时写入报错——当数据库用、数据不能丢时用这个。
缓存场景用lru自动淘汰旧数据,数据库场景用noeviction配合足够内存。
五、生产环境安全(重申)
再强调Redis的安全铁律(参考Redis提速篇的安全部分):
- 只监听内网/本机:bind 127.0.0.1 或内网IP,绝不裸奔公网;
- 设强密码:requirepass;
- 6379端口不对公网开放(参考防火墙篇)。
Redis未授权访问是最常见的入侵途径之一(参考入侵应急篇),持久化配得再好,被入侵一切归零。
六、硬件与备份
- 内存要够:Redis数据全在内存,内存不足是硬伤,选内存充足的机器;
- 持久化文件的磁盘:AOF频繁写,NVMe更好(参考NVMe篇);
- 备份持久化文件:把RDB/AOF文件纳入备份(参考备份篇),多一层保险。
结论
Redis持久化:纯缓存可只用RDB或不持久化;重要数据开AOF(everysec);生产推荐RDB+AOF双开。同时设好maxmemory和淘汰策略(缓存用lru、数据库用noeviction),并守住”不裸奔、设密码”的安全底线。配好这些,Redis才既快又稳又安全。在你的服务器上按业务类型配好Redis持久化,别让一次重启毁掉你的数据。