跳转到内容
搜索 RunEntLinux 文档

仅搜索 RunEntLinux 通用文档,各发行版文档使用各自的搜索入口。

    浏览当前文档目录

    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 快照触发规则(Redis 6.2+ 的默认值)
    # 3600 秒内至少 1 个 key 被修改
    save 3600 1
    # 300 秒内至少 100 个 key 被修改
    save 300 100
    # 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,备份整个 appendonlydir(Redis 7+ 是多部分 AOF:manifest + base + incr)
    if [ -d "${REDIS_DATA}/appendonlydir" ]; then
    tar -czf "${BACKUP_DIR}/appendonly_${DATE}.tgz" -C "${REDIS_DATA}" appendonlydir
    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