跳到主要内容

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 完全兼容:

  1. 访问 https://www.memurai.com/
  2. 下载并安装 Memurai
  3. 安装完成后自动启动服务

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

图形化工具

  1. RedisInsight(官方推荐)

  2. Another Redis Desktop Manager

  3. Medis

  4. Redis Commander

常见问题排查

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 errorAOF 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)
  • 设置告警规则
  • 定期检查慢查询日志

小结

  1. 安装方式:支持包管理器、源码编译、Docker 等多种安装方式
  2. 配置文件:通过 redis.conf 配置网络、内存、持久化、安全等选项
  3. 运行时配置:使用 CONFIG SET/GET 命令动态修改配置
  4. 客户端工具redis-cli 是最常用的命令行工具
  5. 图形化工具:RedisInsight、Another Redis Desktop Manager 等
  6. 故障排查:掌握常见问题的排查和解决方法
  7. 生产部署:按检查清单逐项确认

练习

  1. 使用 Docker 安装 Redis 并配置持久化
  2. 修改 Redis 配置文件,设置密码和最大内存
  3. 使用 redis-cli 连接 Redis 并执行基本操作
  4. 模拟一个内存不足问题并解决
  5. 配置 Redis 开机自启动