Redis
Redis 是高性能的内存键值数据库,广泛用于缓存、会话管理、消息队列等场景。本文将介绍 Redis 的安装、核心配置、服务管理、命令行工具使用、持久化策略以及安全加固。
各发行版中的版本
Section titled “各发行版中的版本”安装 Redis
Section titled “安装 Redis”使用系统仓库安装(EL 9)
Section titled “使用系统仓库安装(EL 9)”EL 9 的 AppStream 仓库中包含 Redis:
sudo dnf install redis -y使用 Remi 仓库(获取最新版本)
Section titled “使用 Remi 仓库(获取最新版本)”如需安装最新稳定版 Redis:
sudo dnf install epel-release -ysudo dnf install https://rpms.remirepo.net/enterprise/remi-release-$(rpm -E %{rhel}).rpm -ysudo dnf module reset redis -ysudo dnf module enable redis:remi-7.2 -ysudo dnf install redis -ysudo systemctl start redissudo systemctl enable redissudo systemctl status redis验证 Redis 是否正常运行:
redis-cli ping如果返回 PONG,则说明 Redis 已正常运行。
Redis 的主配置文件位于 /etc/redis/redis.conf(部分系统为 /etc/redis.conf)。
redis-cli CONFIG GET dirfind /etc -name "redis.conf" 2>/dev/null修改配置前建议先备份:
sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.bak绑定地址(bind)
Section titled “绑定地址(bind)”默认 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 没有设计为直接面对公网。
设置密码(requirepass)
Section titled “设置密码(requirepass)”生产环境必须设置访问密码:
sudo sed -i 's/^# requirepass foobared/requirepass YourStrongRedisPassword!/' /etc/redis/redis.conf也可以直接在配置文件中添加:
echo 'requirepass YourStrongRedisPassword!' | sudo tee -a /etc/redis/redis.conf设置密码后的连接方式:
redis-cli -a YourStrongRedisPassword!
# 或者先连接再认证redis-cli# 进入后执行:AUTH YourStrongRedisPassword!sudo sed -i 's/^port 6379/port 6380/' /etc/redis/redis.conf设置最大内存
Section titled “设置最大内存”限制 Redis 使用的最大内存和内存满时的淘汰策略:
sudo tee -a /etc/redis/redis.conf << 'EOF'
# 最大内存限制maxmemory 256mb
# 内存淘汰策略# allkeys-lru: 从所有 key 中淘汰最近最少使用的# volatile-lru: 只从设置了过期时间的 key 中淘汰# noeviction: 不淘汰,内存满时写入报错maxmemory-policy allkeys-lruEOF应用配置更改
Section titled “应用配置更改”sudo systemctl restart redissystemctl 服务管理
Section titled “systemctl 服务管理”# 启动 Redissudo systemctl start redis
# 停止 Redissudo systemctl stop redis
# 重启 Redissudo systemctl restart redis
# 查看状态sudo systemctl status redis
# 设置开机自启sudo systemctl enable redis
# 取消开机自启sudo systemctl disable redis
# 查看 Redis 日志sudo journalctl -u redis -f查看 Redis 运行信息
Section titled “查看 Redis 运行信息”redis-cli INFO
# 查看特定章节redis-cli INFO serverredis-cli INFO memoryredis-cli INFO clientsredis-cli INFO statsredis-cli 基础操作
Section titled “redis-cli 基础操作”redis-cli 是 Redis 的命令行客户端工具。
redis-cli
# 设置键值SET name "CentOS Fan"SET counter 100
# 获取值GET nameGET counter
# 设置过期时间(秒)SET session:abc123 "user_data" EX 3600
# 查看剩余过期时间TTL session:abc123
# 自增/自减INCR counterDECR counterINCRBY counter 10# 设置哈希字段HSET user:1 name "张三" email "zhangsan@example.com" age 30
# 获取单个字段HGET user:1 name
# 获取所有字段和值HGETALL user:1
# 删除字段HDEL user:1 age# 从左端推入LPUSH queue "task1" "task2" "task3"
# 从右端取出RPOP queue
# 查看列表内容LRANGE queue 0 -1
# 列表长度LLEN queue# 添加成员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
# 清空所有数据库(极度危险)# FLUSHALLRDB 与 AOF 持久化
Section titled “RDB 与 AOF 持久化”Redis 提供两种持久化方式,可单独使用也可同时启用。
RDB 快照
Section titled “RDB 快照”RDB 以指定的时间间隔将内存数据快照写入磁盘。文件紧凑、恢复速度快,但可能丢失最后一次快照之后的数据。
grep -n "^save\|^dbfilename\|^dir" /etc/redis/redis.conf配置文件中的默认 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 快照:
# 阻塞方式(不推荐在生产环境使用)redis-cli SAVE
# 后台异步方式(推荐)redis-cli BGSAVE
# 查看上次快照时间redis-cli LASTSAVEAOF 追加日志
Section titled “AOF 追加日志”AOF(Append Only File)记录每个写操作命令,数据安全性更高,但文件体积较大。
sudo sed -i 's/^appendonly no/appendonly yes/' /etc/redis/redis.confAOF 同步策略配置:
# always - 每个写命令都同步,最安全但最慢# everysec - 每秒同步一次(推荐,平衡性能与安全)# no - 由操作系统决定何时同步appendfsync everysecAOF 重写(压缩)配置:
# 当 AOF 文件大小增长超过上次重写后大小的 100% 时触发重写auto-aof-rewrite-percentage 100# AOF 文件最小 64MB 才触发重写auto-aof-rewrite-min-size 64mb手动触发 AOF 重写:
redis-cli BGREWRITEAOF同时启用 RDB 和 AOF(推荐)
Section titled “同时启用 RDB 和 AOF(推荐)”sudo tee -a /etc/redis/redis.conf << 'EOF'
# 启用 AOFappendonly yesappendfsync everysec
# RDB 保持默认配置# Redis 重启时优先使用 AOF 恢复数据(因为 AOF 数据更完整)EOFsudo systemctl restart redis备份 Redis 数据
Section titled “备份 Redis 数据”sudo tee /usr/local/bin/redis-backup.sh << 'SCRIPT'#!/bin/bashBACKUP_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 BGSAVEsleep 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} -deletefind "$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禁用危险命令
Section titled “禁用危险命令”部分命令在生产环境中存在极大风险,可以将其重命名为空字符串来禁用:
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 模式下谨慎使用此配置。
限制客户端连接
Section titled “限制客户端连接”sudo sed -i 's/^# maxclients 10000/maxclients 5000/' /etc/redis/redis.conf禁用 Protected Mode 的注意事项
Section titled “禁用 Protected Mode 的注意事项”Redis 默认开启 protected-mode,当没有设置密码且绑定到非 127.0.0.1 地址时会拒绝外部连接。请始终保持此选项开启:
grep "^protected-mode" /etc/redis/redis.conf如果 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使用非特权用户运行
Section titled “使用非特权用户运行”默认情况下 Redis 已经以 redis 用户运行,可以确认:
ps aux | grep redis-server安全检查清单
Section titled “安全检查清单”使用以下命令快速检查 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常用运维命令速查
Section titled “常用运维命令速查”# 启动 / 停止 / 重启sudo systemctl start redissudo systemctl stop redissudo systemctl restart redis
# 连接 Redisredis-cliredis-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 512mbredis-cli CONFIG SET maxmemory-policy allkeys-lru
# 将运行时配置写入配置文件redis-cli CONFIG REWRITE- Nginx 反向代理 — 前端代理配置
- 防火墙 — 访问控制