Skip to content
安装与配置

安装与配置

Redis 简介与版本选择

Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,支持 strings、hashes、lists、sets、sorted sets、streams、bitmaps、hyperloglogs 和 geospatial indexes 等丰富的数据结构。它通常被用作数据库、缓存、消息代理和流处理引擎。

核心特性

  • 内存存储:所有数据保存在内存中,读写速度极快(微秒级延迟)
  • 持久化:支持 RDB 快照和 AOF(Append Only File)两种持久化方式
  • 高可用:通过 Sentinel 实现自动故障转移,通过 Cluster 实现数据分片
  • 丰富的功能:发布订阅、Lua 脚本、事务、过期策略、LRU/LFU 淘汰等

版本演进速查

版本 发布时间 关键新特性
6.0.x 2020-04 ACL 权限系统、多线程 I/O、RESP3 协议、SSL/TLS、客户端缓存
6.2.x 2021-02 GEOSEARCH/Roaring、SMISMEMBER、ZUNION/ZDIFF/ZINTER 扩展、COPY 命令
7.0.x 2022-04 Functions(取代 eval 脚本)、listpack 替代 ziplist、AOF 多部分、ACL 增强、Sharded Pub/Sub
7.2.x 2023-08 命令文档增强、性能优化、内存效率改进
7.4.x 2024-07 新增哈希字段过期、ZRANK/ZREVRANK 扩展、更多性能与稳定性优化

版本选择建议

场景 推荐版本 理由
生产环境(保守) 6.2.x 久经考验,大量部署案例,社区支持成熟
生产环境(新项目) 7.2.x / 7.4.x 更新特性(Functions、listpack 内存优化),持续维护
开发/测试 7.4.x 最新稳定版 体验最新特性,提前适配
需要 ACL / SSL 6.0+ ACL 从 6.0 开始支持
需要 Functions 7.0+ Functions 从 7.0 开始支持

💡 最佳实践:新项目建议直接从 7.2.x 起步。如果从旧版本迁移,先评估 ACL、Functions 等变更对现有代码的影响。


安装

Linux

通过包管理器安装

Debian / Ubuntu (apt)

# 安装
sudo apt update
sudo apt install redis-server

# 查看版本
redis-server --version

# 启动
sudo systemctl start redis-server
sudo systemctl enable redis-server

⚠️ 注意:apt 默认源的 Redis 版本通常较旧。如需最新版本,使用官方源:

# 添加 Redis 官方 APT 源
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt update
sudo apt install redis

RHEL / CentOS / Fedora (yum/dnf)

# CentOS 7 / RHEL 7
sudo yum install epel-release
sudo yum install redis

# CentOS 8+ / RHEL 8+ / Fedora
sudo dnf install redis

# 启动
sudo systemctl start redis
sudo systemctl enable redis

Arch Linux (pacman)

sudo pacman -S redis

从源码编译安装

适用于需要特定版本、定制编译参数或离线环境的场景。

# 1. 安装编译依赖
sudo apt install build-essential tcl pkg-config    # Debian/Ubuntu
# sudo yum groupinstall "Development Tools"         # CentOS/RHEL
# sudo yum install tcl                               # CentOS/RHEL

# 2. 下载源码
VERSION=7.2.5
curl -O https://download.redis.io/releases/redis-${VERSION}.tar.gz
tar xzf redis-${VERSION}.tar.gz
cd redis-${VERSION}

# 3. 编译(-j 启用并行编译加速)
make -j$(nproc)

# 4. 运行测试(可选但推荐)
make test

# 5. 安装到系统路径
sudo make install

编译后关键可执行文件的位置:

文件 说明
redis-server Redis 服务端
redis-cli 命令行客户端
redis-benchmark 性能压测工具
redis-check-aof AOF 文件修复工具
redis-check-rdb RDB 文件检查工具
redis-sentinel Sentinel 哨兵

🚨 陷阱:编译 Redis 需要 GCC 4.9+(推荐 GCC 5+)。CentOS 7 默认的 GCC 4.8.5 可能无法编译较新版本,需先升级:

sudo yum install centos-release-scl
sudo yum install devtoolset-9-gcc devtoolset-9-gcc-c++
scl enable devtoolset-9 bash

🔬 深入原理make install 默认安装到 /usr/local/bin。如需自定义路径,使用 make PREFIX=/opt/redis install

macOS

# Homebrew 安装
brew install redis

# 启动服务
brew services start redis

# 查看状态
brew services info redis

macOS 上 Homebrew 安装的配置文件路径在:

  • Intel Mac: /usr/local/etc/redis.conf
  • Apple Silicon: /opt/homebrew/etc/redis.conf

Windows

Redis 官方不直接支持 Windows。推荐以下方案:

方案一:Docker(推荐)

# 先安装 Docker Desktop for Windows,然后:
docker run -d --name redis -p 6379:6379 redis:7.2-alpine

方案二:WSL2

# 在 WSL2 的 Linux 发行版中按 Linux 流程安装即可
sudo apt install redis-server

方案三:Memurai

Memurai 是 Windows 原生的 Redis 兼容替代品,提供免费的开发者版本: https://www.memurai.com/

🚨 陷阱:微软曾维护的 Windows 版 Redis 早已停止更新(停留在 3.x 版本),切勿用于生产或新项目。

Docker

# 拉取镜像并启动
docker run -d \
  --name redis \
  -p 6379:6379 \
  --restart unless-stopped \
  redis:7.2-alpine

# 指定密码
docker run -d \
  --name redis \
  -p 6379:6379 \
  --restart unless-stopped \
  redis:7.2-alpine \
  redis-server --requirepass mypassword

# 挂载自定义配置文件
docker run -d \
  --name redis \
  -p 6379:6379 \
  -v /host/path/redis.conf:/usr/local/etc/redis/redis.conf \
  --restart unless-stopped \
  redis:7.2-alpine \
  redis-server /usr/local/etc/redis/redis.conf

# 挂载持久化数据目录
docker run -d \
  --name redis \
  -p 6379:6379 \
  -v /host/data/redis:/data \
  --restart unless-stopped \
  redis:7.2-alpine \
  redis-server --appendonly yes

常用 Redis Docker 镜像标签:

标签 说明
redis:7.2-alpine 基于 Alpine Linux(体积最小,约 30MB)
redis:7.2 基于 Debian(功能完整)
redis:7.2-bookworm 基于 Debian Bookworm
redis:latest 最新稳定版
redis:7.0 7.0 版本

💡 最佳实践:Docker 场景优先使用 alpine 标签,镜像更小、启动更快。如果需要 Debug 或缺少某些工具,再用完整版。


启动与停止

前台启动

# 直接启动,终端会被阻塞,Ctrl+C 停止
redis-server

# 带配置文件前台启动
redis-server /path/to/redis.conf

后台启动(守护进程)

redis.conf 中设置:

daemonize yes

然后启动:

redis-server /etc/redis/redis.conf

验证进程:

ps aux | grep redis-server

🚨 陷阱:Docker 中必须保持前台运行(daemonize no),否则容器启动后会立即退出。Docker 自己就是进程管理器,不需要 Redis 自身 daemonize。

开机自启(systemd)

创建 systemd 单元文件 /etc/systemd/system/redis.service

[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=on-failure
RestartSec=5s
User=redis
Group=redis
LimitNOFILE=65536
NoNewPrivileges=yes
ProtectSystem=full
ReadWritePaths=/var/lib/redis
ReadWritePaths=/var/log/redis

[Install]
WantedBy=multi-user.target

启用服务:

# 创建 redis 用户
sudo useradd -r -s /bin/false redis

# 创建必要目录
sudo mkdir -p /var/lib/redis /var/log/redis
sudo chown -R redis:redis /var/lib/redis /var/log/redis

# 启用服务
sudo systemctl daemon-reload
sudo systemctl start redis
sudo systemctl enable redis

常用 systemd 管理命令:

sudo systemctl start redis      # 启动
sudo systemctl stop redis       # 停止
sudo systemctl restart redis    # 重启
sudo systemctl status redis     # 查看状态
sudo systemctl enable redis     # 开机自启
sudo systemctl disable redis    # 取消开机自启

停止 Redis

# 优雅关闭(会执行持久化保存)
redis-cli shutdown

# 强制关闭(不保存数据)
redis-cli shutdown nosave

# 关闭并保存
redis-cli shutdown save

# 关闭远程 Redis
redis-cli -h 192.168.1.100 -p 6379 shutdown

也可以直接使用 systemd:

sudo systemctl stop redis

查看运行状态

# 连通性检查
redis-cli ping
# 预期返回: PONG

# 简要状态信息
redis-cli info

# 查看特定部分
redis-cli info server      # 服务器信息(版本、进程ID等)
redis-cli info clients     # 客户端连接信息
redis-cli info memory      # 内存使用
redis-cli info stats       # 运行统计
redis-cli info replication # 复制状态
redis-cli info persistence # 持久化状态

# 查看客户端列表
redis-cli client list

redis-cli 使用入门

连接 Redis

# 基础连接(默认 localhost:6379)
redis-cli

# 指定主机和端口
redis-cli -h 192.168.1.100 -p 6379

# 指定密码和数据库
redis-cli -h 192.168.1.100 -p 6379 -a mypassword -n 2

# 通过环境变量传密码(避免命令行暴露)
REDISCLI_AUTH=mypassword redis-cli -h 192.168.1.100 -p 6379

# TLS 加密连接
redis-cli --tls --cacert ca.crt --cert client.crt --key client.key -h host -p 6380

# 连接集群
redis-cli -c -h 192.168.1.100 -p 7000

🚨 陷阱:使用 -a 在命令行传递密码会被其他用户的 ps 命令看到。生产环境优先使用 REDISCLI_AUTH 环境变量或交互式认证(进入 cli 后执行 AUTH password)。

交互模式 vs 命令模式

交互模式

redis-cli
127.0.0.1:6379> SET key "value"
OK
127.0.0.1:6379> GET key
"value"
127.0.0.1:6379> EXIT

命令模式(适合脚本):

# 单条命令
redis-cli SET key "value"
redis-cli GET key

# 管道批量执行
echo -e "SET k1 v1\nSET k2 v2\nGET k1" | redis-cli

# 读取命令文件
redis-cli < commands.txt

常用选项

选项 说明 示例
-h 指定主机 redis-cli -h 10.0.0.1
-p 指定端口 redis-cli -p 6380
-a 指定密码 redis-cli -a secret
-n 选择数据库(0-15) redis-cli -n 1
--raw 原始输出(中文等非 ASCII 直接显示) redis-cli --raw
--no-raw 显示转义字符(默认行为) redis-cli --no-raw GET utf8key
--stat 实时统计模式(每秒刷新) redis-cli --stat
--bigkeys 扫描大 Key redis-cli --bigkeys
--memkeys 扫描内存占用大的 Key redis-cli --memkeys
--hotkeys 扫描热点 Key(需 maxmemory-policy=LFU) redis-cli --hotkeys
--latency 测量延迟(持续输出) redis-cli --latency
--latency-history 延迟历史记录(含统计) redis-cli --latency-history
--latency-dist 延迟分布图 redis-cli --latency-dist
-c 集群模式(自动重定向) redis-cli -c -h node1 -p 7000
--monitor 实时监控所有命令 redis-cli monitor
--rdb 导出 RDB 文件到 stdout(远程备份) redis-cli --rdb backup.rdb
--pipe 管道模式(批量导入数据) cat data.txt | redis-cli --pipe
-r 重复执行命令 redis-cli -r 5 PING
-i 执行间隔(秒),搭配 -r 使用 redis-cli -r 60 -i 1 INFO stats
--scan 渐进式遍历 Key redis-cli --scan --pattern 'user:*'
--csv CSV 格式输出 redis-cli --csv INFO stats
--json JSON 格式输出(7.0+) redis-cli --json GET user:1

实时监控命令执行

redis-cli monitor
# 1692345678.123456 [0 192.168.1.100:54321] "SET" "key1" "value1"
# 1692345678.234567 [0 192.168.1.100:54321] "GET" "key1"

性能提示monitor 命令会显著影响 Redis 性能(约 50% 吞吐量下降),仅建议在调试时短暂使用,生产环境慎用。

HELP 命令

# 查看命令分组
HELP @string          # 字符串相关命令
HELP @hash            # 哈希相关命令
HELP @list            # 列表相关命令
HELP @set             # 集合相关命令
HELP @sorted_set      # 有序集合相关命令
HELP @stream          # 流相关命令
HELP @generic         # 通用命令(DEL、EXPIRE 等)
HELP @server          # 服务器管理命令
HELP @connection      # 连接相关命令
HELP @cluster         # 集群命令
HELP @pubsub          # 发布订阅命令
HELP @transactions    # 事务命令
HELP @scripting       # 脚本命令

# 查看具体命令
HELP SET
HELP GET
HELP INFO

交互模式快捷键

快捷键 说明
CLEAR 清屏
Ctrl+C 取消当前输入
Ctrl+D 退出 redis-cli
TAB 自动补全命令
/ 历史命令

配置文件核心参数

Redis 配置文件通常位于:

  • Linux (apt): /etc/redis/redis.conf
  • Linux (编译): 源码目录下的 redis.conf,通常拷贝到 /etc/redis/redis.conf
  • macOS (Homebrew): /usr/local/etc/redis.conf/opt/homebrew/etc/redis.conf

基本配置

参数 默认值 说明
bind 127.0.0.1 绑定的网络接口 IP,多个用空格分隔
port 6379 Redis 监听端口
daemonize no 是否以守护进程方式运行
pidfile /var/run/redis_6379.pid PID 文件路径
loglevel notice 日志级别:debug / verbose / notice / warning
logfile "" 日志文件路径,空字符串表示输出到 stdout
databases 16 数据库数量(DB 0 ~ DB 15)
unixsocket (注释) Unix socket 路径,不监听 TCP 时使用
unixsocketperm 0 Unix socket 权限

网络配置

参数 默认值 说明
tcp-backlog 511 TCP 连接队列长度,高并发时需要调大
timeout 0 客户端空闲超时(秒),0 表示永不超时
tcp-keepalive 300 TCP keepalive 探测间隔(秒),0 表示禁用

性能提示:高并发场景下,设置 tcp-backlog 为 1024 或更大,配合 Linux 系统的 net.core.somaxconn 一起调整:

sudo sysctl -w net.core.somaxconn=1024

内存配置

参数 默认值 说明
maxmemory 0 最大内存上限(字节),0 表示不限制
maxmemory-policy noeviction 内存达到上限时的淘汰策略

淘汰策略详解

策略 行为 适用场景
noeviction 不淘汰,写入报错 严格数据完整性场景(数据库模式)
allkeys-lru 所有 Key 中淘汰最近最少使用的 通用缓存
volatile-lru 有过期时间的 Key 中淘汰 LRU 持久 + 缓存混合场景
allkeys-lfu 所有 Key 中淘汰访问频率最低的 需反高频热点场景
volatile-lfu 有过期时间的 Key 中淘汰 LFU 缓存为主但部分数据需持久
allkeys-random 所有 Key 中随机淘汰 均匀访问的缓存
volatile-random 有过期时间的 Key 中随机淘汰 较少使用
volatile-ttl 过期 Key 中淘汰 TTL 最短的 优先保留长期数据

💡 最佳实践:Redis 作为缓存使用,建议设置 maxmemory-policy allkeys-lruallkeys-lfu。作为数据库使用时,设置 maxmemory 但使用 noeviction,确保不会因内存不足而丢数据。

持久化配置

RDB 快照

参数 默认值 说明
save 3600 1 300 100 60 10000 触发条件:N 秒内 M 次写操作则触发保存
dbfilename dump.rdb RDB 文件名
dir ./ RDB/AOF 文件存储目录(建议写绝对路径)
rdbcompression yes 是否压缩 RDB(LZF 算法)
rdbchecksum yes 是否对 RDB 做 CRC64 校验
stop-writes-on-bgsave-error yes RDB 保存失败时是否拒绝写入

AOF 持久化

参数 默认值 说明
appendonly no 是否开启 AOF
appendfilename appendonly.aof AOF 文件名
appendfsync everysec 刷盘策略:always / everysec / no
no-appendfsync-on-rewrite no AOF 重写期间是否暂停 fsync
auto-aof-rewrite-percentage 100 AOF 重写触发增长比例
auto-aof-rewrite-min-size 64mb AOF 重写触发的文件最小体积
appendfsync 值 行为 性能 安全性
always 每次写命令都 fsync 最低 最高(最多丢 0 条)
everysec 每秒 fsync 一次 中等 中等(最多丢 2 秒数据)
no 由操作系统决定 fsync 时机 最高 最低(可能丢大量数据)

💡 最佳实践appendfsync everysec 是绝大多数场景的最优选择,兼顾性能和数据安全。

安全配置

参数 默认值 说明
requirepass (注释) Redis 登录密码
rename-command (注释) 重命名或禁用危险命令
protected-mode yes 保护模式:无密码且无 bind 时仅本地访问
aclfile (注释) ACL 规则文件路径(6.0+)

重命名危险命令示例

# 禁用危险命令
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command DEBUG ""

# 重命名为不易猜测的名字
rename-command FLUSHDB e2d3c_flushdb
rename-command KEYS d4e5f_keys

🚨 陷阱rename-command 设置为空字符串会完全禁用该命令。某些 Redis 管理工具依赖这些命令进行运维——例如 Sentinel 使用 CONFIG。谨慎禁用。

客户端配置

参数 默认值 说明
maxclients 10000 最大客户端连接数
client-output-buffer-limit (见下方) 客户端输出缓冲区限制

慢查询日志配置

参数 默认值 说明
slowlog-log-slower-than 10000 慢查询阈值(微秒),负数表示禁用
slowlog-max-len 128 慢查询日志最大条数(队列,先进先出)
# 在线调整慢查询阈值为 5 毫秒
redis-cli CONFIG SET slowlog-log-slower-than 5000

# 查看慢查询日志
redis-cli SLOWLOG GET 10
redis-cli SLOWLOG LEN
redis-cli SLOWLOG RESET

精简 redis.conf 模板

以下是一个生产可用的精简配置模板:

# redis.conf — 精简生产配置模板

# === 基本配置 ===
bind 0.0.0.0
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16

# === 网络配置 ===
tcp-backlog 1024
timeout 300
tcp-keepalive 60

# === 内存配置 ===
maxmemory 2gb
maxmemory-policy allkeys-lru

# === RDB 持久化 ===
save 3600 1
save 300 100
save 60 10000
dbfilename dump.rdb
dir /var/lib/redis
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes

# === AOF 持久化 ===
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
no-appendfsync-on-rewrite no

# === 客户端 ===
maxclients 10000

# === 慢查询 ===
slowlog-log-slower-than 10000
slowlog-max-len 128

# === 安全 ===
# 设置密码
requirepass YourStrongPasswordHere

# 禁用危险命令
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command KEYS ""
rename-command CONFIG ""

# === ACL 文件(6.0+,与 requirepass 互斥)===
# aclfile /etc/redis/users.acl

CONFIG 命令

Redis 允许在运行时通过 CONFIG SET/CONFIG GET 动态修改和查看配置,无需重启实例。

查看配置

# 查看所有配置
redis-cli CONFIG GET "*"

# 查看特定配置(支持通配符)
redis-cli CONFIG GET "maxmemory-*"
redis-cli CONFIG GET "append*"
redis-cli CONFIG GET "slowlog*"

# 查看单个配置
redis-cli CONFIG GET maxmemory
redis-cli CONFIG GET requirepass

动态修改配置

# 动态调整内存上限
redis-cli CONFIG SET maxmemory 4gb

# 动态调整慢查询阈值
redis-cli CONFIG SET slowlog-log-slower-than 5000

# 动态修改日志级别
redis-cli CONFIG SET loglevel debug

# 动态设置密码
redis-cli CONFIG SET requirepass "newpassword"

# 动态修改淘汰策略
redis-cli CONFIG SET maxmemory-policy allkeys-lfu

# 动态调整 AOF 刷盘策略
redis-cli CONFIG SET appendfsync always

持久化配置到文件

# 将运行时修改的配置写回配置文件
redis-cli CONFIG REWRITE

执行 CONFIG REWRITE 后,Redis 会将运行时变更的配置写回到原生配置文件(redis.conf),确保重启后配置仍然生效。

⚠️ 注意:CONFIG REWRITE 会对配置文件进行格式化,原有的注释会丢失。建议保留原始配置文件的备份。

不能动态修改的参数

以下参数只能在配置文件中设置,或通过启动参数指定,运行时不可修改:

参数 原因
daemonize 进程启动模式,启动后无法更改
port 端口绑定发生在启动时
databases 数据库数量在启动时确定
dir 持久化目录在启动时确定
appendfilename AOF 文件名在启动时确定
dbfilename RDB 文件名在启动时确定
pidfile PID 文件在启动时创建
logfile 日志文件在启动时打开
bind 网络绑定发生在启动时
rename-command 命令注册发生在启动时

🚨 常见陷阱

1. bind 127.0.0.1 的误区

# ❌ 只绑定本地回环地址
bind 127.0.0.1

bind 127.0.0.1 只能接受来自本地的连接,远程客户端无法访问。但许多人误解为"只能来自 127.0.0.1 才能连接"这种 IP 白名单机制。

# 允许所有网络接口
bind 0.0.0.0

# 允许特定网卡
bind 192.168.1.100

# 允许本地和特定网卡
bind 127.0.0.1 192.168.1.100

bind 绑定的是本机网卡接口地址,不是客户端的来源 IP。限制来源 IP 需要通过防火墙实现。

2. 生产环境不设置密码

# ❌ 危险:全网可访问且无密码
bind 0.0.0.0
# requirepass 未设置

这个配置配合一个公网 IP,可能几分钟内就被恶意扫描并植入挖矿脚本。Redis 的 CONFIG SET dirCONFIG SET dbfilename 组合曾被广泛利用来写入 SSH 公钥,实现远程控制。

# ✅ 安全的配置组合
bind 0.0.0.0
requirepass aV3ryStr0ngP@ssw0rd
protected-mode yes

3. protected-mode 的作用

protected-mode yes(默认)的保护逻辑:

  • 如果没有设置 requirepass,且
  • bind 未设置为显式网卡地址(仅绑定 127.0.0.1 或未设置 bind),则
  • Redis 只接受来自 127.0.0.1::1 和 Unix socket 的连接

这在实际中意味着:

场景 protected-mode yes 结果
bind 0.0.0.0 + 无密码 仅接受本地连接
bind 0.0.0.0 + 有密码 接受远程连接(有密码验证)
bind 127.0.0.1 + 无密码 仅接受本地连接
bind 0.0.0.0 + 无密码 危险:全网可无密码访问

🚨 切勿关闭 protected-mode 的同时又没设置密码。

4. daemonize 与 Docker 的冲突

# ❌ Docker 中错误配置
daemonize yes

Docker 以 PID 1 启动 Redis 主进程。如果设置 daemonize yes,Redis 会 fork 出子进程后父进程退出,导致 Docker 认为容器已经终止,容器立即退出。

# ✅ Docker 中正确配置
daemonize no

所有容器化的 Redis 都应保持前台运行,由容器运行时(Docker / Kubernetes / Podman 等)负责进程管理。

5. 编译安装时忘记安装编译工具

# ❌ 直接 make 报错
make
# fatal error: cc: No such file or directory

# ✅ 先安装依赖
sudo apt install build-essential    # Debian/Ubuntu
sudo yum groupinstall "Development Tools"  # CentOS/RHEL

6. AOF 文件持续增长不触发重写

AOF 文件会随着写入操作持续增长。如果发现 AOF 文件变得异常大,检查:

# 检查 AOF 积压
redis-cli INFO persistence | grep aof

常见原因:

  • auto-aof-rewrite-percentageauto-aof-rewrite-min-size 设置不合理
  • 手动执行 BGREWRITEAOF 被定期调度的任务打断
# 手动触发 AOF 重写
redis-cli BGREWRITEAOF

7. maxmemory 配置为 0 导致 OOM

# ❌ 不限制内存使用
maxmemory 0

当 Redis 作为缓存时不设 maxmemory 上限,系统内存耗尽后会触发 OS OOM Killer,可能导致整个 Redis 进程被杀死,数据丢失。

# ✅ 明确设置内存上限
maxmemory 2gb
maxmemory-policy allkeys-lru

💡 计算 maxmemory 的公式参考:总物理内存 - 操作系统预留(约 1-2GB)- 其他服务内存。例如一台 8GB 的服务器,Redis 的 maxmemory 建议设置为 4-5GB。

8. 配置修改后忘记持久化

# 运行时修改了配置
redis-cli CONFIG SET maxmemory 4gb

# ❌ 重启后配置丢失!
# 因为修改只在内存中,重启后恢复为配置文件中的值

# ✅ 修改后及时持久化
redis-cli CONFIG REWRITE

9. 使用 KEYS 命令扫描全量 Key

# ❌ 阻塞整个 Redis 实例
redis-cli KEYS "user:*"

KEYS 命令会遍历所有 Key 并返回匹配结果,在 Key 数量多时(百万级)会严重阻塞 Redis,导致其他请求超时。

# ✅ 使用 SCAN 渐进式遍历
redis-cli --scan --pattern "user:*"

# 按类型扫描
redis-cli --scan --pattern "user:*" --type hash

10. 密码通过命令行明文传递

# ❌ 密码出现在 ps 输出中
redis-cli -a mypassword PING

# ✅ 通过环境变量传递
export REDISCLI_AUTH=mypassword
redis-cli PING

# ✅ 交互式认证
redis-cli
127.0.0.1:6379> AUTH mypassword
OK