小白解决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 换成你自己的强密码 ✅
相关推荐
tryCbest9 小时前
Python 使用 Redis 详细教程
redis·python·bootstrap
Savvy..10 小时前
Redis 黑马点评-商户查询缓存
数据库·redis·缓存
不要再敲了12 小时前
SSM框架下的redis使用以及token认证
数据库·spring boot·redis·缓存·mybatis
你的人类朋友1 天前
快速搭建redis环境并使用redis客户端进行连接测试
前端·redis·后端
长安城没有风1 天前
从入门到精通【Redis】理解Redis事务
数据库·redis·缓存
gsfl1 天前
Redis 持久化机制
数据库·redis·缓存
z晨晨1 天前
互联网大厂Java求职面试实战:Spring Boot与微服务场景深度解析
java·spring boot·redis·微服务·kafka·spring security·电商
野犬寒鸦1 天前
从零起步学习Redis || 第五章:利用Redis构造分布式全局唯一ID
java·服务器·数据库·redis·分布式·后端·缓存
何故染尘優2 天前
Redis 如何配置 Key 的过期时间?它的实现原理?
数据库·redis·缓存