小白解决redis的开启 AOF 持久化 + RDB 兜底,重启不丢会话,并避免因内存淘汰导致的提前失效

一、目标 & 思路

  • 不丢会话 :开启 AOF (每秒落盘)+ 保留 RDB,AOF 负责「几乎实时」,RDB 作为「快速恢复的兜底快照」

  • 避免提前失效 :默认 不设置内存上限maxmemory 0)+ 不淘汰策略noeviction)。

    如果必须设上限,也建议仍用 noeviction,这样写满会报错 而不是悄悄把带 TTL 的会话赶走。监控内存告警即可。

二、快速配置(沿用你已安装在 /opt/redis-7.0.2 的源码版)

你已经 make install 过,那么可执行文件通常在 /usr/local/bin/redis-server

1)创建运行用户与数据目录(安全 & 权限 OK)

shell 复制代码
# 创建系统用户(任选一个 nologin 路径)
sudo useradd --system --home-dir /var/lib/redis --no-create-home --shell /usr/sbin/nologin redis 2>/dev/null || \
sudo useradd --system --home-dir /var/lib/redis --no-create-home --shell /sbin/nologin redis

# 数据目录
sudo install -o redis -g redis -m 0750 -d /var/lib/redis

2)推荐的 redis.conf(AOF+RDB,前台运行,日志交给 systemd) 把下面内容保存为:/opt/redis-7.0.2/redis.conf

vi 复制代码
################################## NETWORK #####################################
bind 0.0.0.0
protected-mode yes
port 6379
tcp-keepalive 300
timeout 0

################################## GENERAL #####################################
# 让 systemd 接管进程与日志(前台运行)
daemonize no
supervised no
loglevel notice
logfile ""                # 输出到 stdout(journald 收集)
# pidfile 建议不要设(Type=simple 不需要)
# pidfile /run/redis/redis-server.pid

databases 16
always-show-logo no

################################ SECURITY ######################################
# 强密码请自行替换
requirepass YOUR_STRONG_PASSWORD

################################ SNAPSHOTS (RDB) ###############################
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb

# 数据都写在这里(确保属主 redis:redis)
dir /var/lib/redis

############################## APPEND ONLY (AOF) ###############################
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec              # 1 秒一次 fsync,重启最多丢 1 秒
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes         # 用 RDB 作为 AOF 底座,启动更快

############################## MEMORY (避免提前失效) ###########################
maxmemory 0                      # 不设上限
maxmemory-policy noeviction      # 不淘汰(若必须上限,仍建议 noeviction 并做监控)

################################ MISC ##########################################
hz 10
dynamic-hz yes
disable-thp yes
jemalloc-bg-thread yes

小贴士:如果你必须 限制内存(如 8GB),请设置 maxmemory 8gb + maxmemory-policy noeviction,并给 Redis 做用量告警;这样不会提前删会话,写满时会报错(你可以在应用侧兜底/降级)。

3)systemd unit(配合前台运行) /etc/systemd/system/redis.service

vi 复制代码
[Unit]
Description=Redis Server (simple mode)
After=network.target
Wants=network-online.target

[Service]
Type=simple
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /opt/redis-7.0.2/redis.conf
WorkingDirectory=/var/lib/redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0750
LimitNOFILE=10032
Restart=on-failure
RestartSec=1s
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

说明:如果你不是 make install,而是直接用源码目录里的二进制,请把上面的 ExecStart 改为
ExecStart=/opt/redis-7.0.2/src/redis-server /opt/redis-7.0.2/redis.conf

应用并启动:

shell 复制代码
sudo chown -R redis:redis /var/lib/redis
sudo systemctl daemon-reload
sudo systemctl enable --now redis
sudo systemctl status redis --no-pager

三、重启不丢会话(验证步骤)

shell 复制代码
# 写入一个带过期时间的"会话"(1 小时)
redis-cli -a YOUR_STRONG_PASSWORD SET session:uid:42 "hello" EX 3600
redis-cli -a YOUR_STRONG_PASSWORD GET session:uid:42

# 重启服务
sudo systemctl restart redis

# 复查是否仍在
redis-cli -a YOUR_STRONG_PASSWORD GET session:uid:42
# 仍能读到,说明 AOF+RDB 生效,重启不丢

四、避免"提前失效"的要点

  1. 别随便开淘汰

    • 默认 maxmemory 0 + noeviction 最稳。
    • 必须限内存时,仍首选 noeviction,并对 used_memory 做阈值告警(比如 80%、90% 预警)。
  2. 会话最好独立实例/库:如果你的 Redis 同时存缓存与会话,建议把会话放独立实例(或至少独立命名空间),避免被其它业务压力影响。

  3. 监控与容量 :关注 used_memorymem_fragmentation_ratioaof_current_sizerdb_last_save_time 等指标;磁盘要留足空间给 AOF/RDB。

五、常见坑(你日志里出现过的)

  • systemd supervision requested ... but Redis is compiled without libsystemd support!

    不要在 redis.conf 里写 supervised systemd,改为 supervised no,并让 unit 用 Type=simple 前台运行。

  • somaxconn 提示:
    WARNING: TCP backlog 511 cannot be enforced because somaxconn=128

    bash 复制代码
    echo 'net.core.somaxconn = 511' | sudo tee /etc/sysctl.d/99-redis.conf
    sudo sysctl --system
  • "chown: 无效的用户: redis:redis"

    先创建 redis 系统用户(上面已给命令),再 chown。

结论

  • AOF everysec + RDB:重启不丢会话
  • noeviction:避免"提前失效"
  • 前台运行 + systemd(Type=simple)Docker Compose:最省心
  • 记得把 YOUR_STRONG_PASSWORD 换成你自己的强密码 ✅
相关推荐
Java爱好狂.1 小时前
Java面试Redis核心知识点整理!
java·数据库·redis·分布式锁·java面试·后端开发·java八股文
阿杆2 小时前
如何在 Spring Boot 中接入 Amazon ElastiCache
java·数据库·redis
此生只爱蛋6 小时前
【Redis】String 字符串
java·数据库·redis
青云交7 小时前
Java 大视界 -- 基于 Java+Flink 构建实时电商交易风控系统实战(436)
java·redis·flink·规则引擎·drools·实时风控·电商交易
破烂pan7 小时前
Python 整合 Redis 哨兵(Sentinel)与集群(Cluster)实战指南
redis·python·sentinel
SoleMotive.7 小时前
redis和mysql有什么区别,以及redis和mysql都有什么缺点,以及什么地方redis不如mysql?
数据库·redis·mysql
锥锋骚年8 小时前
golang 开发 Redis与Memory统一接口方案
开发语言·redis·golang
bafuka8 小时前
别再手撸热点缓存了:一个注解搞定Redis热点问题(已开源)
redis
程可爱9 小时前
详解Redis的五种基本数据类型(String、List、Hash、Set、ZSet)
redis
济南java开发,求内推9 小时前
redis升级至7.0.15版本
redis