跳转到内容

Redis

Redis 是高性能的内存键值数据库,广泛用于缓存、会话管理、消息队列等场景。本文将介绍 Redis 的安装、核心配置、服务管理、命令行工具使用、持久化策略以及安全加固。

版本数据实时来自 pkgseek.com

EL 9 的 AppStream 仓库中包含 Redis:

安装 Redis(EL 9)
sudo dnf install redis -y

使用 Remi 仓库(获取最新版本)

Section titled “使用 Remi 仓库(获取最新版本)”

如需安装最新稳定版 Redis:

安装 Remi 仓库
sudo dnf install epel-release -y
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-$(rpm -E %{rhel}).rpm -y
启用 Remi 仓库中的 Redis 模块(EL 9)
sudo dnf module reset redis -y
sudo dnf module enable redis:remi-7.2 -y
sudo dnf install redis -y
启动并启用 Redis
sudo systemctl start redis
sudo systemctl enable redis
sudo systemctl status redis

验证 Redis 是否正常运行:

测试 Redis 连接
redis-cli ping

如果返回 PONG,则说明 Redis 已正常运行。

Redis 的主配置文件位于 /etc/redis/redis.conf(部分系统为 /etc/redis.conf)。

确认配置文件位置
redis-cli CONFIG GET dir
find /etc -name "redis.conf" 2>/dev/null

修改配置前建议先备份:

备份配置文件
sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.bak

默认 Redis 只监听 127.0.0.1,这是最安全的设置。

查看当前绑定地址
grep "^bind" /etc/redis/redis.conf

如果需要让 Redis 接受来自特定网络的连接:

修改绑定地址
sudo sed -i 's/^bind 127.0.0.1.*/bind 127.0.0.1 192.168.1.10/' /etc/redis/redis.conf

注意:绝对不要将 Redis 直接绑定到 0.0.0.0 并暴露到公网,Redis 没有设计为直接面对公网。

生产环境必须设置访问密码:

设置 Redis 密码
sudo sed -i 's/^# requirepass foobared/requirepass YourStrongRedisPassword!/' /etc/redis/redis.conf

也可以直接在配置文件中添加:

追加密码配置
echo 'requirepass YourStrongRedisPassword!' | sudo tee -a /etc/redis/redis.conf

设置密码后的连接方式:

使用密码连接 Redis
redis-cli -a YourStrongRedisPassword!
# 或者先连接再认证
redis-cli
# 进入后执行:AUTH YourStrongRedisPassword!
修改 Redis 端口
sudo sed -i 's/^port 6379/port 6380/' /etc/redis/redis.conf

限制 Redis 使用的最大内存和内存满时的淘汰策略:

配置最大内存与淘汰策略
sudo tee -a /etc/redis/redis.conf << 'EOF'
# 最大内存限制
maxmemory 256mb
# 内存淘汰策略
# allkeys-lru: 从所有 key 中淘汰最近最少使用的
# volatile-lru: 只从设置了过期时间的 key 中淘汰
# noeviction: 不淘汰,内存满时写入报错
maxmemory-policy allkeys-lru
EOF
重启 Redis 使配置生效
sudo systemctl restart redis
Redis 服务管理命令
# 启动 Redis
sudo systemctl start redis
# 停止 Redis
sudo systemctl stop redis
# 重启 Redis
sudo systemctl restart redis
# 查看状态
sudo systemctl status redis
# 设置开机自启
sudo systemctl enable redis
# 取消开机自启
sudo systemctl disable redis
# 查看 Redis 日志
sudo journalctl -u redis -f
查看 Redis 完整信息
redis-cli INFO
# 查看特定章节
redis-cli INFO server
redis-cli INFO memory
redis-cli INFO clients
redis-cli INFO stats

redis-cli 是 Redis 的命令行客户端工具。

字符串(String)操作
redis-cli
# 设置键值
SET name "CentOS Fan"
SET counter 100
# 获取值
GET name
GET counter
# 设置过期时间(秒)
SET session:abc123 "user_data" EX 3600
# 查看剩余过期时间
TTL session:abc123
# 自增/自减
INCR counter
DECR counter
INCRBY counter 10
哈希(Hash)操作
# 设置哈希字段
HSET user:1 name "张三" email "zhangsan@example.com" age 30
# 获取单个字段
HGET user:1 name
# 获取所有字段和值
HGETALL user:1
# 删除字段
HDEL user:1 age
列表(List)操作
# 从左端推入
LPUSH queue "task1" "task2" "task3"
# 从右端取出
RPOP queue
# 查看列表内容
LRANGE queue 0 -1
# 列表长度
LLEN queue
集合(Set)操作
# 添加成员
SADD tags "linux" "centos" "redis"
# 查看所有成员
SMEMBERS tags
# 判断成员是否存在
SISMEMBER tags "linux"
# 集合大小
SCARD tags
键管理操作
# 查看所有键(生产环境慎用)
KEYS *
# 使用 SCAN 安全遍历(推荐)
SCAN 0 MATCH "user:*" COUNT 10
# 检查键是否存在
EXISTS name
# 删除键
DEL name
# 设置过期时间
EXPIRE counter 300
# 查看键的数据类型
TYPE counter
# 查看数据库中键的总数
DBSIZE
# 清空当前数据库(危险操作)
# FLUSHDB
# 清空所有数据库(极度危险)
# FLUSHALL

Redis 提供两种持久化方式,可单独使用也可同时启用。

RDB 以指定的时间间隔将内存数据快照写入磁盘。文件紧凑、恢复速度快,但可能丢失最后一次快照之后的数据。

查看当前 RDB 配置
grep -n "^save\|^dbfilename\|^dir" /etc/redis/redis.conf

配置文件中的默认 RDB 规则:

RDB 快照触发规则
# 900 秒内至少 1 个 key 被修改
save 900 1
# 300 秒内至少 10 个 key 被修改
save 300 10
# 60 秒内至少 10000 个 key 被修改
save 60 10000
# RDB 文件名
dbfilename dump.rdb
# RDB 文件存储目录
dir /var/lib/redis

手动触发 RDB 快照:

手动生成 RDB 快照
# 阻塞方式(不推荐在生产环境使用)
redis-cli SAVE
# 后台异步方式(推荐)
redis-cli BGSAVE
# 查看上次快照时间
redis-cli LASTSAVE

AOF(Append Only File)记录每个写操作命令,数据安全性更高,但文件体积较大。

启用 AOF
sudo sed -i 's/^appendonly no/appendonly yes/' /etc/redis/redis.conf

AOF 同步策略配置:

AOF 同步策略选项
# always - 每个写命令都同步,最安全但最慢
# everysec - 每秒同步一次(推荐,平衡性能与安全)
# no - 由操作系统决定何时同步
appendfsync everysec

AOF 重写(压缩)配置:

AOF 重写配置
# 当 AOF 文件大小增长超过上次重写后大小的 100% 时触发重写
auto-aof-rewrite-percentage 100
# AOF 文件最小 64MB 才触发重写
auto-aof-rewrite-min-size 64mb

手动触发 AOF 重写:

手动触发 AOF 重写
redis-cli BGREWRITEAOF
同时启用 RDB 和 AOF
sudo tee -a /etc/redis/redis.conf << 'EOF'
# 启用 AOF
appendonly yes
appendfsync everysec
# RDB 保持默认配置
# Redis 重启时优先使用 AOF 恢复数据(因为 AOF 数据更完整)
EOF
重启 Redis 使持久化配置生效
sudo systemctl restart redis
创建 Redis 数据备份脚本
sudo tee /usr/local/bin/redis-backup.sh << 'SCRIPT'
#!/bin/bash
BACKUP_DIR="/backup/redis"
DATE=$(date +%Y%m%d_%H%M%S)
REDIS_DATA="/var/lib/redis"
RETENTION_DAYS=7
mkdir -p "$BACKUP_DIR"
# 触发 RDB 快照
redis-cli BGSAVE
sleep 5
# 复制 RDB 文件
cp "${REDIS_DATA}/dump.rdb" "${BACKUP_DIR}/dump_${DATE}.rdb"
# 如果启用了 AOF,也备份 AOF 文件
if [ -f "${REDIS_DATA}/appendonly.aof" ]; then
cp "${REDIS_DATA}/appendonly.aof" "${BACKUP_DIR}/appendonly_${DATE}.aof"
fi
# 清理旧备份
find "$BACKUP_DIR" -name "*.rdb" -mtime +${RETENTION_DAYS} -delete
find "$BACKUP_DIR" -name "*.aof" -mtime +${RETENTION_DAYS} -delete
echo "Redis backup completed: ${BACKUP_DIR}"
SCRIPT
sudo chmod +x /usr/local/bin/redis-backup.sh

已在前文的「设置密码」小节中说明,这里再强调一下重要性。Redis 执行命令的速度极快,弱密码极易被暴力破解。

验证密码已设置
redis-cli CONFIG GET requirepass

部分命令在生产环境中存在极大风险,可以将其重命名为空字符串来禁用:

禁用危险命令
sudo tee -a /etc/redis/redis.conf << 'EOF'
# 禁用危险命令
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command CONFIG "REDIS_CONFIG_b4f2e8a1"
EOF

注意:禁用 CONFIG 命令后,需要使用重命名后的名称来执行该命令。Sentinel 和 Cluster 模式下谨慎使用此配置。

限制最大客户端连接数
sudo sed -i 's/^# maxclients 10000/maxclients 5000/' /etc/redis/redis.conf

Redis 默认开启 protected-mode,当没有设置密码且绑定到非 127.0.0.1 地址时会拒绝外部连接。请始终保持此选项开启:

确认 protected-mode 已启用
grep "^protected-mode" /etc/redis/redis.conf

如果 Redis 需要接受远程连接,必须通过防火墙限制访问来源:

限制 Redis 端口访问来源
# 只允许特定 IP 访问
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="6379" protocol="tcp" accept'
sudo firewall-cmd --reload

不要直接开放 Redis 端口给所有来源:

错误示范(不要这样做)
# 不推荐!不要将 Redis 端口开放给所有人
# sudo firewall-cmd --permanent --add-port=6379/tcp

默认情况下 Redis 已经以 redis 用户运行,可以确认:

确认 Redis 运行用户
ps aux | grep redis-server

使用以下命令快速检查 Redis 安全状态:

Redis 安全状态检查
echo "=== 绑定地址 ==="
redis-cli CONFIG GET bind
echo "=== 密码设置 ==="
redis-cli CONFIG GET requirepass
echo "=== Protected Mode ==="
redis-cli CONFIG GET protected-mode
echo "=== 监听端口 ==="
redis-cli CONFIG GET port
echo "=== 最大内存 ==="
redis-cli CONFIG GET maxmemory
echo "=== 已连接客户端数 ==="
redis-cli INFO clients | grep connected_clients
Redis 日常运维命令
# 启动 / 停止 / 重启
sudo systemctl start redis
sudo systemctl stop redis
sudo systemctl restart redis
# 连接 Redis
redis-cli
redis-cli -a 密码
redis-cli -h 主机 -p 端口 -a 密码
# 查看 Redis 版本
redis-server --version
# 实时监控所有命令(调试用,生产环境慎用)
redis-cli MONITOR
# 查看慢查询日志
redis-cli SLOWLOG GET 10
# 查看内存使用情况
redis-cli INFO memory
# 查看特定 key 占用内存
redis-cli MEMORY USAGE keyname
# 在线修改配置(不需要重启)
redis-cli CONFIG SET maxmemory 512mb
redis-cli CONFIG SET maxmemory-policy allkeys-lru
# 将运行时配置写入配置文件
redis-cli CONFIG REWRITE