一、目标 & 思路
-
不丢会话 :开启 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 生效,重启不丢
四、避免"提前失效"的要点
-
别随便开淘汰:
- 默认
maxmemory 0
+noeviction
最稳。 - 必须限内存时,仍首选
noeviction
,并对used_memory
做阈值告警(比如 80%、90% 预警)。
- 默认
-
会话最好独立实例/库:如果你的 Redis 同时存缓存与会话,建议把会话放独立实例(或至少独立命名空间),避免被其它业务压力影响。
-
监控与容量 :关注
used_memory
、mem_fragmentation_ratio
、aof_current_size
、rdb_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
bashecho '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
换成你自己的强密码 ✅