Redis 安装与配置
本章将介绍如何在各种操作系统上安装 Redis,以及 Redis 的基本配置和生产环境部署建议。
安装 Redis
Linux 安装
Ubuntu/Debian
# 更新包索引
sudo apt update
# 安装 Redis
sudo apt install redis-server -y
# 启动 Redis 服务
sudo systemctl start redis-server
sudo systemctl enable redis-server
# 验证安装
redis-cli ping
解释:使用 apt 包管理器安装 Redis,systemctl 命令用于管理服务。Ubuntu 仓库中的 Redis 版本可能不是最新,如需最新版本请使用源码编译或官方仓库。
CentOS/RHEL
# 安装 EPEL 源
sudo yum install epel-release -y
# 安装 Redis
sudo yum install redis -y
# 启动 Redis 服务
sudo systemctl start redis
sudo systemctl enable redis
# 验证安装
redis-cli ping
源码编译安装
源码编译可以获取最新版本的 Redis,适合需要特定版本或自定义编译选项的场景:
# 下载 Redis 源码(以 Redis 8.0 为例)
wget https://download.redis.io/redis-stable.tar.gz
# 解压
tar xzf redis-stable.tar.gz
cd redis-stable
# 编译(使用多核加速)
make -j$(nproc)
# 可选:运行测试
make test
# 安装到系统目录
sudo make install
# 创建 Redis 用户和目录
sudo useradd -r -s /bin/false redis
sudo mkdir -p /etc/redis /var/lib/redis /var/log/redis
sudo chown redis:redis /var/lib/redis /var/log/redis
# 复制配置文件
sudo cp redis.conf /etc/redis/
# 启动 Redis
redis-server /etc/redis/redis.conf
编译选项说明:
# 32 位编译(节省内存,但限制最大 4GB)
make 32bit
# 禁用 TLS 支持
make BUILD_TLS=no
# 启用 systemd 支持
make USE_SYSTEMD=yes
# 指定安装路径
make PREFIX=/opt/redis install
macOS 安装
使用 Homebrew
# 安装 Redis
brew install redis
# 启动 Redis 服务
brew services start redis
# 验证安装
redis-cli ping
手动启动
# 前台启动
redis-server
# 指定配置文件启动
redis-server /usr/local/etc/redis.conf
Windows 安装
使用 WSL(推荐)
Windows 上运行 Redis 的推荐方式是使用 WSL(Windows Subsystem for Linux):
# 在 WSL 中安装 Redis
sudo apt update
sudo apt install redis-server -y
# 启动 Redis
sudo service redis-server start
# 验证
redis-cli ping
WSL 配置建议:
# 在 /etc/redis/redis.conf 中修改以下配置
# 确保 WSL 重启后数据持久化
dir /mnt/c/redis-data # 将数据存到 Windows 文件系统
# 或者配置自动启动
echo "redis-server --daemonize yes" >> ~/.bashrc
使用 Memurai(Windows 原生)
Memurai 是 Redis 的 Windows 原生替代品,API 完全兼容:
- 访问 https://www.memurai.com/
- 下载并安装 Memurai
- 安装完成后自动启动服务
Docker 安装
使用 Docker 是最简单的安装方式,适合开发和测试环境:
# 拉取 Redis 镜像
docker pull redis:latest
# 运行 Redis 容器(基础版)
docker run -d \
--name redis \
-p 6379:6379 \
redis:latest
# 运行 Redis 容器(带持久化)
docker run -d \
--name redis \
-p 6379:6379 \
-v /data/redis:/data \
redis:latest \
redis-server --appendonly yes
# 运行 Redis Stack(包含模块)
docker run -d \
--name redis-stack \
-p 6379:6379 \
-p 8001:8001 \
redis/redis-stack:latest
# 验证
docker exec -it redis redis-cli ping
参数说明:
-d:后台运行容器-p 6379:6379:映射 Redis 服务端口-p 8001:8001:映射 RedisInsight 图形界面端口-v /data/redis:/data:挂载数据目录实现持久化--appendonly yes:开启 AOF 持久化
Docker Compose 安装(生产推荐)
创建 docker-compose.yml 文件:
version: '3.8'
services:
redis:
image: redis:7-alpine
container_name: redis
restart: unless-stopped
ports:
- "6379:6379"
volumes:
- ./data:/data
- ./redis.conf:/etc/redis/redis.conf:ro
command: redis-server /etc/redis/redis.conf
environment:
- TZ=Asia/Shanghai
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
deploy:
resources:
limits:
memory: 4G
reservations:
memory: 2G
# 可选:Redis Exporter 用于监控
redis-exporter:
image: oliver006/redis_exporter:latest
container_name: redis-exporter
restart: unless-stopped
ports:
- "9121:9121"
environment:
- REDIS_ADDR=redis://redis:6379
启动服务:
docker-compose up -d
Redis 配置
配置文件位置
Redis 的配置文件通常位于:
- Linux(包管理安装):
/etc/redis/redis.conf - macOS(Homebrew):
/usr/local/etc/redis.conf或/opt/homebrew/etc/redis.conf - 源码编译:
<源码目录>/redis.conf - Windows: Redis 安装目录下
Redis 8.0+ 配置文件变化:
从 Redis 8.0 开始,提供两个配置文件:
redis.conf:仅包含 Redis 服务器核心配置redis-full.conf:包含服务器和所有模块(JSON、Search、TimeSeries、Bloom)配置
核心配置项
网络配置
# 绑定地址
# 生产环境建议只绑定内网地址
bind 127.0.0.1 192.168.1.100
# 端口号
port 6379
# 保护模式(强烈建议开启)
# 开启后,未设置密码且绑定所有接口时只允许本地访问
protected-mode yes
# TCP 连接队列长度(需要配合系统 somaxconn 调整)
tcp-backlog 511
# 客户端空闲超时(0 表示永不超时)
timeout 0
# TCP keepalive(秒)
# 有助于检测死连接,建议开启
tcp-keepalive 300
生产环境网络配置建议:
# 只绑定内网地址
bind 192.168.1.100
# 使用非默认端口(安全考虑)
port 6380
# 开启保护模式
protected-mode yes
内存配置
# 最大内存使用量
# 建议:物理内存 * 60% ~ 80%
maxmemory 4gb
# 内存淘汰策略
# noeviction: 不淘汰,内存满时返回错误(适合数据不能丢失的场景)
# allkeys-lru: 从所有键中淘汰最近最少使用的(适合纯缓存场景)
# volatile-lru: 从有 TTL 的键中淘汰最近最少使用的
# allkeys-lfu: 从所有键中淘汰最不经常使用的(适合访问频率差异大的场景)
# volatile-lfu: 从有 TTL 的键中淘汰最不经常使用的
# volatile-random: 从有 TTL 的键中随机淘汰
# allkeys-random: 从所有键中随机淘汰
# volatile-ttl: 淘汰即将过期的键
maxmemory-policy allkeys-lru
# LRU/LFU 采样数量(越大越精确,但越慢)
maxmemory-samples 5
内存淘汰策略选择指南:
| 场景 | 推荐策略 | 原因 |
|---|---|---|
| 纯缓存(可接受数据丢失) | allkeys-lru | 自动清理冷数据 |
| 缓存 + 持久数据混合 | volatile-lru | 保护无 TTL 的持久数据 |
| 访问频率差异大 | allkeys-lfu | 基于访问频率更合理 |
| 数据有时效性 | volatile-ttl | 优先清理即将过期数据 |
| 数据绝对不能丢失 | noeviction | 需配合应用层限流 |
持久化配置
RDB 持久化:
# 触发快照的条件
save 900 1 # 900 秒内有 1 次变化
save 300 10 # 300 秒内有 10 次变化
save 60 10000 # 60 秒内有 10000 次变化
# 禁用 RDB(注释所有 save 或设置空字符串)
# save ""
# RDB 文件名
dbfilename dump.rdb
# 数据目录
dir /var/lib/redis
# 压缩(默认开启)
rdbcompression yes
# 校验和(默认开启)
rdbchecksum yes
# RDB 文件存储失败时是否停止写入
stop-writes-on-bgsave-error yes
AOF 持久化:
# 启用 AOF
appendonly yes
# AOF 文件名
appendfilename "appendonly.aof"
# AOF 目录(Redis 7.0+ Multi-part AOF)
appenddirname "appendonlydir"
# AOF 同步策略
# always: 每次写入都同步(最安全,最慢)
# everysec: 每秒同步一次(推荐,平衡性能和安全)
# no: 由操作系统决定(最快,最不安全)
appendfsync everysec
# AOF 重写期间是否禁用 fsync
no-appendfsync-on-rewrite no
# AOF 重写触发条件
auto-aof-rewrite-percentage 100 # 文件比上次重写增长 100%
auto-aof-rewrite-min-size 64mb # 文件最小 64MB
# 使用 RDB-AOF 混合格式(Redis 4.0+,强烈推荐)
aof-use-rdb-preamble yes
# 加载损坏的 AOF 文件是否继续
aof-load-truncated yes
Redis 7.0+ Multi-part AOF 说明:
Redis 7.0 重构了 AOF 持久化机制,将单个 AOF 文件拆分为:
- Base AOF:重写时生成的基础快照
- Incremental AOF:增量日志文件
- Manifest File:文件清单
这种设计大幅降低了重写期间的内存压力和文件切换风险。
安全配置
# 设置密码(Redis 6.0 之前方式)
requirepass "your_strong_password_here"
# ACL 文件路径(Redis 6.0+ 推荐)
aclfile /etc/redis/users.acl
# 禁用或重命名危险命令
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command KEYS ""
rename-command CONFIG ""
rename-command DEBUG ""
密码策略建议:
# 生成强密码
openssl rand -base64 32
# 好的密码示例
requirepass "Xk9#mP2$vL5@nQ8!wR3&"
# 避免的密码
requirepass "123456" # 太简单
requirepass "redis" # 包含服务名
requirepass "password" # 常见密码
性能配置
# 最大客户端连接数
maxclients 10000
# 客户端输出缓冲区限制
# format: client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# 慢查询日志
slowlog-log-slower-than 10000 # 微秒(10毫秒)
slowlog-max-len 128
# 定期删除频率
hz 10
# 动态调整 Hz(Redis 6.0+)
dynamic-hz yes
运行时配置
Redis 支持在运行时修改配置:
# 查看配置
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "4294967296"
# 修改配置
127.0.0.1:6379> CONFIG SET maxmemory 8gb
OK
# 查看所有配置
127.0.0.1:6379> CONFIG GET *
# 将当前配置写入文件(持久化配置)
127.0.0.1:6379> CONFIG REWRITE
OK
注意:CONFIG SET 修改的配置在 Redis 重启后会丢失,需要执行 CONFIG REWRITE 写入配置文件才能持久化。
生产环境配置模板
以下是一个生产环境的推荐配置模板:
# ==================== 网络配置 ====================
bind 192.168.1.100
port 6379
protected-mode yes
tcp-backlog 511
timeout 0
tcp-keepalive 300
# ==================== 通用配置 ====================
daemonize yes
supervised systemd
pidfile /var/run/redis/redis-server.pid
loglevel notice
logfile /var/log/redis/redis-server.log
databases 16
# ==================== 内存配置 ====================
maxmemory 4gb
maxmemory-policy allkeys-lru
maxmemory-samples 5
# ==================== 持久化配置 ====================
# RDB
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis
# AOF
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-use-rdb-preamble yes
# ==================== 安全配置 ====================
requirepass "your_strong_password_here"
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command KEYS ""
rename-command DEBUG ""
# ==================== 性能配置 ====================
maxclients 10000
slowlog-log-slower-than 10000
slowlog-max-len 128
hz 10
dynamic-hz yes
# ==================== 客户端缓冲区 ====================
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# ==================== 内存碎片整理(Redis 4.0+) ====================
activedefrag yes
active-defrag-ignore-bytes 100mb
active-defrag-threshold-lower 10
active-defrag-threshold-upper 100
active-defrag-cycle-min 1
active-defrag-cycle-max 25
启动和停止 Redis
启动 Redis
# 使用默认配置启动
redis-server
# 指定配置文件启动
redis-server /etc/redis/redis.conf
# 后台启动(配置文件中设置 daemonize yes)
redis-server /etc/redis/redis.conf
# 使用 systemctl 启动(Linux 系统服务)
sudo systemctl start redis
# 使用 systemd 启动(推荐生产环境)
sudo systemctl start redis-server
# 启动并设置特定参数
redis-server --port 6380 --maxmemory 2gb
停止 Redis
# 使用 redis-cli 停止(推荐,优雅关闭)
redis-cli shutdown
# 指定端口和密码停止
redis-cli -p 6379 -a your_password shutdown
# 使用 systemctl 停止(Linux)
sudo systemctl stop redis
# 强制停止(不推荐,可能导致数据丢失)
pkill redis-server
# 或
kill -9 $(pidof redis-server)
优雅关闭 vs 强制关闭:
| 方式 | 命令 | 数据安全 | 说明 |
|---|---|---|---|
| 优雅关闭 | redis-cli shutdown | 安全 | 保存数据后关闭 |
| 优雅关闭(保存) | redis-cli shutdown nosave | 取决于配置 | 不执行额外保存 |
| 强制关闭 | kill -9 | 危险 | 可能丢失未持久化数据 |
重启 Redis
# 使用 systemctl 重启(Linux)
sudo systemctl restart redis
# 手动重启
redis-cli shutdown
redis-server /etc/redis/redis.conf
# 重新加载配置(部分配置支持)
redis-cli CONFIG REWRITE
验证安装
连接测试
# 连接 Redis
redis-cli
# 测试连接
127.0.0.1:6379> ping
PONG
# 设置值
127.0.0.1:6379> set test "Hello Redis"
OK
# 获取值
127.0.0.1:6379> get test
"Hello Redis"
# 查看服务器信息
127.0.0.1:6379> info
查看版本信息
# 命令行查看
redis-server --version
redis-cli --version
# 连接后查看
127.0.0.1:6379> INFO server | grep redis_version
redis_version:8.0.0
带密码连接
# 方式一:命令行参数
redis-cli -a your_password
# 方式二:交互式认证
redis-cli
127.0.0.1:6379> auth your_password
OK
# 方式三:环境变量(更安全,避免密码出现在命令历史)
export REDISCLI_AUTH=your_password
redis-cli
# 方式四:使用 ACL 用户(Redis 6.0+)
redis-cli --user myuser --pass mypassword
连接指定主机和端口
# 连接指定主机和端口
redis-cli -h 192.168.1.100 -p 6379
# 连接 Unix Socket
redis-cli -s /var/run/redis/redis.sock
# 连接 TLS 端口(Redis 6.0+)
redis-cli --tls -h 192.168.1.100 -p 6380
Redis 客户端工具
命令行工具 redis-cli
# 基本连接
redis-cli
# 执行单个命令
redis-cli get mykey
redis-cli set mykey "value"
redis-cli incr counter
# 管道模式
cat commands.txt | redis-cli
# 监控模式(查看所有命令,慎用)
redis-cli monitor
# 统计信息
redis-cli --stat
# 延迟测试
redis-cli --latency
redis-cli --latency-history
# 大键扫描
redis-cli --bigkeys
# 内存分析
redis-cli --memkeys
# 批量执行命令
redis-cli --eval script.lua key1 key2 , arg1 arg2
图形化工具
-
RedisInsight(官方推荐)
- 官网:https://redis.com/redis-enterprise/redis-insight/
- 功能:可视化数据、监控、CLI、内存分析
- 支持:Redis Stack 所有模块
-
Another Redis Desktop Manager
- GitHub:https://github.com/qishibo/AnotherRedisDesktopManager
- 功能:跨平台、免费开源、SSH 隧道支持
-
Medis
- 官网:https://getmedis.com/
- 功能:macOS 专用、界面美观
-
Redis Commander
- GitHub:https://github.com/joeferner/redis-commander
- 功能:Node.js 实现、Web 界面
常见问题排查
1. 无法连接 Redis
症状:Could not connect to Redis at 127.0.0.1:6379: Connection refused
排查步骤:
# 1. 检查 Redis 是否运行
ps aux | grep redis
systemctl status redis
# 2. 检查端口是否监听
netstat -tlnp | grep 6379
# 或
ss -tlnp | grep 6379
# 3. 检查配置文件中的 bind 设置
grep "^bind" /etc/redis/redis.conf
# 4. 检查防火墙
sudo ufw status
sudo iptables -L -n | grep 6379
# 5. 测试本地连接
redis-cli -h 127.0.0.1 -p 6379 ping
常见原因和解决方案:
| 原因 | 解决方案 |
|---|---|
| Redis 未启动 | sudo systemctl start redis |
| 端口被占用 | 修改端口或停止占用进程 |
| bind 配置限制 | 修改 bind 配置 |
| 防火墙阻止 | 开放端口或添加防火墙规则 |
| 保护模式 | 设置密码或修改 protected-mode |
2. 内存不足
症状:OOM command not allowed when used memory > 'maxmemory'
排查步骤:
# 查看内存使用
redis-cli info memory | grep -E "used_memory_human|maxmemory_human"
# 查看大键
redis-cli --bigkeys
# 查看键数量
redis-cli dbsize
# 查看淘汰策略
redis-cli config get maxmemory-policy
解决方案:
# 方式一:增加内存限制
redis-cli config set maxmemory 8gb
# 方式二:调整淘汰策略
redis-cli config set maxmemory-policy allkeys-lru
# 方式三:清理过期或无用数据
redis-cli --scan --pattern "cache:*" | xargs redis-cli del
# 方式四:手动触发内存整理(Redis 4.0+)
redis-cli memory purge
3. 持久化失败
症状:Background saving error 或 AOF write error
排查步骤:
# 检查持久化状态
redis-cli info persistence
# 检查磁盘空间
df -h /var/lib/redis
# 检查文件权限
ls -la /var/lib/redis
# 检查 RDB 最后保存时间
redis-cli lastsave
解决方案:
# 清理磁盘空间
sudo apt clean
sudo rm -rf /var/log/*.gz
# 修复权限
sudo chown -R redis:redis /var/lib/redis
# 手动触发 RDB 保存
redis-cli bgsave
# 手动触发 AOF 重写
redis-cli bgrewriteaof
4. CPU 使用率过高
排查步骤:
# 检查 QPS
redis-cli info stats | grep instantaneous
# 检查慢查询
redis-cli slowlog get 10
# 检查是否有 MONITOR 运行
redis-cli client list | grep monitor
# 检查连接数
redis-cli info clients
常见原因:
| 原因 | 解决方案 |
|---|---|
| 大量慢查询 | 优化命令(如用 SCAN 替代 KEYS) |
| MONITOR 开启 | 关闭 MONITOR |
| 大键操作 | 拆分大键 |
| 网络带宽瓶颈 | 启用多线程 I/O(Redis 6.0+) |
5. 主从同步延迟
排查步骤:
# 查看主从状态
redis-cli info replication
# 检查同步偏移量
redis-cli info replication | grep offset
解决方案:
- 检查网络延迟
- 检查从库负载
- 调整
repl-timeout配置 - 考虑使用无盘复制:
repl-diskless-sync yes
6. 启动警告处理
Redis 启动时可能出现以下警告:
# 警告一:TCP backlog
# WARNING: The TCP backlog setting of 511 cannot be enforced
echo "net.core.somaxconn = 65535" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 警告二:overcommit_memory
# WARNING overcommit_memory is set to 0!
echo "vm.overcommit_memory = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 警告三:THP
# WARNING you have Transparent Huge Pages (THP) support enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
# 永久禁用(添加到 rc.local)
echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" | sudo tee -a /etc/rc.local
生产部署检查清单
部署到生产环境前,请确认以下事项:
安全配置
- 设置强密码或配置 ACL
- 只绑定内网地址
- 启用保护模式
- 禁用或重命名危险命令
- 配置防火墙规则
性能配置
- 设置合理的
maxmemory - 配置合适的淘汰策略
- 调整
tcp-backlog和系统somaxconn - 配置慢查询日志
持久化配置
- 根据场景选择 RDB/AOF/混合持久化
- 确保磁盘空间充足
- 配置自动备份策略
高可用配置
- 配置主从复制(如需要)
- 部署哨兵(如需要高可用)
- 或部署集群(如需要分片)
监控配置
- 配置监控(Prometheus + Grafana)
- 设置告警规则
- 定期检查慢查询日志
小结
- 安装方式:支持包管理器、源码编译、Docker 等多种安装方式
- 配置文件:通过
redis.conf配置网络、内存、持久化、安全等选项 - 运行时配置:使用
CONFIG SET/GET命令动态修改配置 - 客户端工具:
redis-cli是最常用的命令行工具 - 图形化工具:RedisInsight、Another Redis Desktop Manager 等
- 故障排查:掌握常见问题的排查和解决方法
- 生产部署:按检查清单逐项确认
练习
- 使用 Docker 安装 Redis 并配置持久化
- 修改 Redis 配置文件,设置密码和最大内存
- 使用
redis-cli连接 Redis 并执行基本操作 - 模拟一个内存不足问题并解决
- 配置 Redis 开机自启动