安装与配置
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 redisRHEL / 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 redisArch 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 redismacOS 上 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 listredis-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-lru或allkeys-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.aclCONFIG 命令
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.1bind 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 dir 和 CONFIG SET dbfilename 组合曾被广泛利用来写入 SSH 公钥,实现远程控制。
# ✅ 安全的配置组合
bind 0.0.0.0
requirepass aV3ryStr0ngP@ssw0rd
protected-mode yes3. 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 yesDocker 以 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/RHEL6. AOF 文件持续增长不触发重写
AOF 文件会随着写入操作持续增长。如果发现 AOF 文件变得异常大,检查:
# 检查 AOF 积压
redis-cli INFO persistence | grep aof常见原因:
auto-aof-rewrite-percentage和auto-aof-rewrite-min-size设置不合理- 手动执行
BGREWRITEAOF被定期调度的任务打断
# 手动触发 AOF 重写
redis-cli BGREWRITEAOF7. 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 REWRITE9. 使用 KEYS 命令扫描全量 Key
# ❌ 阻塞整个 Redis 实例
redis-cli KEYS "user:*"KEYS 命令会遍历所有 Key 并返回匹配结果,在 Key 数量多时(百万级)会严重阻塞 Redis,导致其他请求超时。
# ✅ 使用 SCAN 渐进式遍历
redis-cli --scan --pattern "user:*"
# 按类型扫描
redis-cli --scan --pattern "user:*" --type hash10. 密码通过命令行明文传递
# ❌ 密码出现在 ps 输出中
redis-cli -a mypassword PING
# ✅ 通过环境变量传递
export REDISCLI_AUTH=mypassword
redis-cli PING
# ✅ 交互式认证
redis-cli
127.0.0.1:6379> AUTH mypassword
OK