CentOS 安装 Redis 指南 – wiki基地


CentOS 安装 Redis 详细指南:从编译到服务化

目录

  1. 引言:Redis 简介与为何选择 CentOS

    • 什么是 Redis?
    • Redis 的主要特点与应用场景
    • 为何在 CentOS 上安装 Redis?
    • 本文将涵盖的内容
  2. 准备工作与环境要求

    • 系统环境确认 (CentOS 版本)
    • 更新系统与安装基础工具
    • 安装编译所需的依赖
    • 为 Redis 创建独立用户 (推荐)
    • 防火墙配置
  3. 安装方法一:从源码编译安装 (推荐,获取最新版本与最佳性能)

    • 获取 Redis 源码
    • 解压源码包
    • 编译 Redis
    • 运行测试 (可选但推荐)
    • 安装 Redis 可执行文件
    • 配置 Redis 目录与文件权限
    • 配置 Redis:编辑 redis.conf
      • daemonize (后台运行)
      • pidfile (进程ID文件)
      • port (端口)
      • bind (绑定地址)
      • protected-mode (保护模式)
      • requirepass (设置密码)
      • dir (工作目录)
      • logfile (日志文件)
      • 持久化配置 (RDB 与 AOF 简介)
      • 其他重要配置项 (内存限制、慢查询日志等)
    • 配置 systemd 服务化管理 Redis
      • 创建 systemd service 文件
      • 编写 service 文件内容详解
      • 重新加载 systemd 配置
      • 启动、停止、重启 Redis 服务
      • 设置开机自启
  4. 安装方法二:使用 EPEL 仓库安装 (更简单快捷)

    • 启用 EPEL 仓库 (CentOS 7 / CentOS 8+)
    • 通过包管理器安装 Redis
    • Redis 包安装后的文件位置
    • 配置 Redis:编辑 redis.conf (与源码安装类似,但文件路径不同)
    • 使用 systemd 管理 Redis 服务 (与源码安装类似,通常服务文件已存在)
      • 启动、停止、重启服务
      • 设置开机自启
  5. 安装后验证

    • 检查 Redis 进程状态
    • 使用 redis-cli 连接 Redis
    • 执行基本命令 (PING, SET, GET)
    • 验证密码设置 (如果已设置)
  6. 常见配置优化与安全加固

    • 关于 bind 地址和安全
    • protected-mode 的重要性
    • 设置强密码 (requirepass)
    • 重命名或禁用危险命令 (rename-command)
    • 配置持久化 (RDB/AOF)
    • 配置最大内存 (maxmemory)
    • 防火墙放行端口 (仅在需要远程访问时)
  7. 基本 Redis 命令使用

    • 连接与断开
    • 数据类型基本操作 (String, Hash, List, Set, Sorted Set)
    • 键管理 (KEYS, EXISTS, DEL, EXPIRE)
    • 身份认证 (AUTH)
  8. 故障排除

    • 服务无法启动
    • 无法连接 Redis
    • 防火墙问题
    • 配置文件错误
  9. 总结与下一步


1. 引言:Redis 简介与为何选择 CentOS

什么是 Redis?

Redis (Remote Dictionary Server) 是一个开源(BSD许可)的、内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)与范围查询、bitmaps、hyperloglogs、Geospatial 索引以及 Streams。Redis 内置复制(replication)、LUA脚本(Lua scripting)、LRU驱动事件(LRU eviction)、事务(transactions)和不同级别的磁盘持久化(persistence),并通过 Redis Sentinel 和 Redis Cluster 提供高可用性(high availability)和自动分区(automatic partitioning)。

Redis 的主要特点与应用场景

  • 速度极快: 数据存储在内存中,读写速度可达到每秒几十万次。
  • 丰富的数据结构: 支持多种数据结构,满足不同的应用需求。
  • 原子性: Redis 的所有操作都是原子性的,要么完全执行,要么完全不执行。
  • 持久化: 支持 RDB 和 AOF 两种持久化方式,确保数据不丢失。
  • 高可用与分布式: Sentinel 实现高可用,Cluster 实现分布式存储。
  • 功能丰富: 支持发布/订阅、事务、Lua 脚本等高级功能。

Redis 常用于:
* 缓存 (Caching)
* 会话存储 (Session Store)
* 消息队列 (Message Queue)
* 排行榜/计数器 (Leaderboards/Counters)
* 实时分析 (Real-time Analytics)
* 分布式锁 (Distributed Locks)

为何在 CentOS 上安装 Redis?

CentOS (或其后续版本如 Rocky Linux/AlmaLinux) 是一款广泛应用于服务器领域的企业级 Linux 发行版。它以其稳定性、安全性、强大的社区支持和长期的维护周期而闻名。许多企业级应用和基础设施都部署在 CentOS/RHEL 系统上。因此,在 CentOS 上安装和运行 Redis 是非常普遍且稳健的选择,能够充分利用 CentOS 稳定的运行环境来确保 Redis 服务的高可靠性。

本文将涵盖的内容

本文将详细介绍在 CentOS 系统上安装 Redis 的两种主要方法:从源码编译安装和使用 EPEL 仓库进行安装。我们将一步步指导您完成环境准备、软件安装、详细的配置说明,特别是如何将 Redis 配置为系统服务以便于管理,并涵盖一些重要的安全加固措施和基本的故障排除方法。

2. 准备工作与环境要求

在开始安装之前,我们需要做一些准备工作,确保系统环境满足 Redis 的安装和运行需求。

系统环境确认 (CentOS 版本)

本指南适用于 CentOS 7 和 CentOS 8 (或其社区继承版本如 Rocky Linux 8/9, AlmaLinux 8/9)。不同的 CentOS 版本在包管理工具(yum vs dnf)和一些命令上可能略有差异,本文将尽量说明这些差异。您可以通过以下命令查看您的 CentOS 版本:

bash
cat /etc/redhat-release

或者

bash
hostnamectl

更新系统与安装基础工具

首先,确保您的系统是最新状态,这有助于避免潜在的兼容性问题并包含最新的安全补丁。同时,安装一些后续步骤可能需要的基础工具,如 wget (用于下载文件) 和 tar (用于解压)。

对于 CentOS 7:

bash
sudo yum clean all
sudo yum update -y
sudo yum install -y wget tar

对于 CentOS 8+ (Rocky Linux/AlmaLinux):

bash
sudo dnf clean all
sudo dnf update -y
sudo dnf install -y wget tar

注意:在执行需要管理员权限的命令时,请使用 sudo。如果您当前用户不是 sudo 用户,请切换到 root 用户或联系系统管理员。本文档中所有需要管理员权限的命令都将前缀 sudo

安装编译所需的依赖 (仅源码安装需要)

如果您计划从源码编译安装 Redis,需要安装 C 语言编译器 (GCC) 和 make 工具。Redis 的测试组件还需要 Tcl。

对于 CentOS 7:

bash
sudo yum groupinstall "Development Tools" -y
sudo yum install -y tcl

Development Tools 组通常包含了 GCC、make 以及其他编译所需的工具链。

对于 CentOS 8+ (Rocky Linux/AlmaLinux):

bash
sudo dnf groupinstall "Development Tools" -y
sudo dnf install -y tcl

为 Redis 创建独立用户 (推荐)

为了安全起见,不建议以 root 用户直接运行 Redis 服务。创建一个专门的用户(例如 redis)来运行 Redis 进程是最佳实践。

bash
sudo adduser --system --no-create-home --shell /sbin/nologin redis

这条命令创建了一个名为 redis 的系统用户,它没有主目录 (--no-create-home),不能登录 (--shell /sbin/nologin),这增强了安全性。

防火墙配置

如果您的 CentOS 系统启用了防火墙 (默认为 firewalld),并且您需要从外部访问 Redis 服务(默认端口 6379),则需要在防火墙中放行 Redis 端口。请注意: 如果您只打算让 Redis 在本地(例如供同一服务器上的应用访问)运行,且 bind 地址设置为 127.0.0.1,则无需在防火墙中放行 6379 端口,这会更安全。

以下是使用 firewalld 放行 6379 端口的命令:

bash
sudo firewall-cmd --permanent --add-port=6379/tcp
sudo firewall-cmd --reload

请根据您的实际需求决定是否执行此步骤。

3. 安装方法一:从源码编译安装 (推荐,获取最新版本与最佳性能)

从源码编译安装可以确保您安装的是最新版本的 Redis,并且允许您根据需要进行一些编译优化。

获取 Redis 源码

访问 Redis 官方网站 (redis.io) 下载最新稳定版本的源码包。您也可以使用 wget 命令直接下载。例如,要下载 Redis 7.2.4 (请根据官网最新版本替换版本号):

bash
cd /opt/ # 通常建议在 /opt 或 /usr/local/src 存放第三方软件源码
sudo wget http://download.redis.io/releases/redis-7.2.4.tar.gz

解压源码包

使用 tar 命令解压下载的源码包:

bash
sudo tar xzf redis-7.2.4.tar.gz

解压后会生成一个名为 redis-7.2.4 的目录。进入该目录:

bash
cd redis-7.2.4

编译 Redis

在源码目录下执行 make 命令进行编译。这个过程会利用之前安装的 GCC 和 make 工具链。

bash
sudo make

编译过程可能需要几分钟。如果一切顺利,您将看到编译成功的提示。

运行测试 (可选但推荐)

编译完成后,强烈建议运行 Redis 提供的测试套件,以确保编译出的二进制文件是正确的且在您的系统上能正常工作。运行测试需要之前安装的 Tcl。

bash
sudo make test

测试可能需要一些时间。如果所有测试都通过(您会看到类似 “All tests passed” 的输出),说明 Redis 编译成功并且功能正常。如果在测试过程中遇到错误,请检查之前的依赖是否都已正确安装。

安装 Redis 可执行文件

测试通过后,执行 make install 命令将编译好的 Redis 可执行文件安装到系统路径下。默认情况下,会安装到 /usr/local/bin/ 目录。

bash
sudo make install

安装完成后,您可以在 /usr/local/bin/ 目录下找到 redis-server (Redis 服务器程序)、redis-cli (Redis 命令行客户端) 等可执行文件。这些文件应该已经被添加到系统的 PATH 环境变量中,您可以在任何位置直接调用它们。

配置 Redis 目录与文件权限

为了更好地管理 Redis 的配置、数据和日志,我们创建一些标准的目录,并为之前创建的 redis 用户设置适当的权限。

“`bash

创建配置目录

sudo mkdir /etc/redis

创建数据目录 (用于持久化文件 RDB/AOF)

sudo mkdir /var/lib/redis

复制示例配置文件到配置目录

sudo cp redis.conf /etc/redis/

改变数据目录的 ownership 为 redis 用户和组

sudo chown redis:redis /var/lib/redis

改变配置文件的 ownership 为 root (通常配置文件由root管理,但要注意服务运行时读取权限)

sudo chown root:root /etc/redis/redis.conf

设置配置文件权限 (例如:root读写,其他用户只读)

sudo chmod 644 /etc/redis/redis.conf
“`

配置 Redis:编辑 redis.conf

这是安装过程中最关键的一步。我们需要编辑 /etc/redis/redis.conf 文件,配置 Redis 的各项运行参数。使用文本编辑器打开该文件:

bash
sudo vi /etc/redis/redis.conf

或者使用您喜欢的编辑器,例如 nano: sudo nano /etc/redis/redis.conf

以下是一些重要的配置项,您需要根据您的需求进行修改:

  • daemonize yes: 将 Redis 作为守护进程在后台运行。默认可能是 no。在生产环境中通常设置为 yes

    ini
    daemonize yes

  • pidfile /var/run/redis_6379.pid: 指定进程ID文件路径。建议保持默认或指定一个清晰的路径。

    ini
    pidfile /var/run/redis_6379.pid

  • port 6379: Redis 监听的端口。默认是 6379。如果需要修改,请确保新端口没有被占用。

    ini
    port 6379

  • bind 127.0.0.1: 指定 Redis 监听的网络接口。

    • bind 127.0.0.1:只允许本地连接。这是最安全的设置,如果Redis只供本机应用访问,务必这样设置。
    • bind your_server_ip:监听指定的服务器IP地址。
    • bind 0.0.0.0:监听所有可用的网络接口。请谨慎使用此设置,并确保通过防火墙和 requirepass/protected-mode 进行严格的安全控制!
      默认配置可能是 # bind 127.0.0.1 -::1 或类似,取消注释并修改为您需要的地址。

    “`ini
    bind 127.0.0.1

    或者 bind your_server_ip

    或者 bind 0.0.0.0 (不推荐,除非做了额外安全配置)

    “`

  • protected-mode yes: 保护模式。当 Redis 绑定到 0.0.0.0 且没有设置密码时,保护模式会阻止外部客户端连接。强烈建议保持为 yes,或者至少设置 requirepass

    ini
    protected-mode yes

  • requirepass your_very_strong_password: 设置连接 Redis 时需要提供的密码。在任何生产或可从外部访问的环境中,强烈建议设置一个强密码!# requirepass foobared 行前的 # 去掉,并将 foobared 替换为您自己的密码。

    ini
    requirepass your_very_strong_password

  • dir /var/lib/redis: 指定 Redis 工作目录。这是 Redis 存放持久化文件 (RDB/AOF) 的位置。这应该与我们之前创建的目录一致,并且该目录需要 Redis 用户有写入权限。

    ini
    dir /var/lib/redis

  • logfile /var/log/redis_6379.log: 指定日志文件路径。默认可能没有指定或输出到标准输出。将其设置为一个文件路径便于日志查看。同样需要确保运行 Redis 的用户对该文件有写入权限。创建日志文件并设置权限:

    bash
    sudo touch /var/log/redis_6379.log
    sudo chown redis:redis /var/log/redis_6379.log

    然后在配置文件中设置:

    ini
    logfile "/var/log/redis_6379.log"

  • 持久化配置 (RDB 与 AOF 简介)

    • RDB (Redis Database): 在指定的时间间隔内生成数据集的时间点快照。默认是开启的。
      ini
      save 900 1 # 在 900 秒内,如果至少有 1 个 key 发生变化,就执行 BGSAVE
      save 300 100 # 在 300 秒内,如果至少有 100 个 key 发生变化,就执行 BGSAVE
      save 60 10000 # 在 60 秒内,如果至少有 10000 个 key 发生变化,就执行 BGSAVE
    • AOF (Append Only File): 记录服务器接收到的所有写操作命令,并在服务器启动时通过重新执行这些命令来恢复数据。默认是关闭的 (appendonly no)。要开启,需要将 appendonly 设置为 yes
      ini
      appendonly no # 改为 yes 开启 AOF
      appendfsync everysec # AOF 同步策略,everysec 通常是性能与数据安全的较好折衷

      建议根据您的数据重要性和性能需求配置持久化。通常生产环境会开启 AOF,有时也会结合 RDB 使用。
  • 其他重要配置项:

    • maxmemory <bytes>: 设置 Redis 可使用的最大内存量。达到限制后,Redis 会根据 maxmemory-policy 删除键。这对于防止 Redis 占用过多内存导致系统不稳定非常重要。
    • maxmemory-policy noeviction: 当达到 maxmemory 限制时的淘汰策略 (如 volatile-lru, allkeys-lfu, noeviction 等)。
    • slowlog-log-slower-than <microseconds>: 慢查询日志阈值 (微秒)。
    • slowlog-max-len <number>: 慢查询日志列表的最大长度。

修改并保存 redis.conf 文件。

配置 systemd 服务化管理 Redis

为了方便地启动、停止和管理 Redis 进程,我们将其配置为 systemd 服务。

  • 创建 systemd service 文件

    bash
    sudo vi /etc/systemd/system/redis.service

  • 编写 service 文件内容详解

    将以下内容复制到 redis.service 文件中。请注意注释中的解释。

    “`ini
    [Unit]
    Description=Redis In-Memory Data Store

    描述服务

    After=network.target

    在网络服务启动后启动

    [Service]
    User=redis

    指定运行服务的用户,必须是之前创建的 redis 用户

    Group=redis

    指定运行服务的用户组,必须是之前创建的 redis 用户组

    Type=forking

    服务类型,forking 表示 ExecStart 命令会启动一个主进程并由它 fork 出子进程,父进程退出,子进程继续运行

    如果daemonize在redis.conf中设置为no,此处可能需要Type=simple或Type=exec,但通常源码安装并设置为daemonize yes

    PIDFile=/var/run/redis_6379.pid

    指定 PID 文件路径,必须与 redis.conf 中的 pidfile 配置一致

    ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf

    启动服务的命令,指向 redis-server 可执行文件和配置文件

    ExecStop=/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown

    停止服务的命令,使用 redis-cli 连接到本地 Redis 并发送 shutdown 命令

    如果设置了密码,需要加上 AUTH 命令:

    ExecStop=/bin/sh -c “/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 AUTH ‘your_very_strong_password’ shutdown”

    WorkingDirectory=/var/lib/redis/

    设置服务的工作目录,与 redis.conf 中的 dir 配置一致

    Restart=always

    定义服务意外退出时的重启策略,always表示总是重启

    LimitNOFILE=100000

    限制最大文件打开数,Redis 可能需要很多文件句柄

    LimitNPROC=100000

    限制最大进程数

    TimeoutSec=0

    服务启动或停止的超时时间,0表示无限制

    [Install]
    WantedBy=multi-user.target

    定义服务应在哪些目标下启动,multi-user.target 表示多用户命令行界面

    ``
    **请务必根据您的实际配置修改
    PIDFileExecStartExecStop(特别是密码) 和WorkingDirectory中的路径和参数,确保与您的redis.conf` 文件一致。**

    保存并关闭文件。

  • 重新加载 systemd 配置

    通知 systemd 有新的服务文件:

    bash
    sudo systemctl daemon-reload

  • 启动、停止、重启 Redis 服务

    现在您可以使用 systemctl 命令来管理 Redis 服务了:

    bash
    sudo systemctl start redis # 启动 Redis
    sudo systemctl stop redis # 停止 Redis
    sudo systemctl restart redis # 重启 Redis
    sudo systemctl status redis # 查看 Redis 服务状态

  • 设置开机自启

    如果您希望 Redis 在系统启动时自动运行,执行以下命令:

    bash
    sudo systemctl enable redis

    取消开机自启:

    bash
    sudo systemctl disable redis

4. 安装方法二:使用 EPEL 仓库安装 (更简单快捷)

对于不追求最新版本或特定编译优化的用户,通过 EPEL 仓库安装 Redis 是一个更简单快捷的方法,可以直接使用系统的包管理器进行安装和更新。EPEL (Extra Packages for Enterprise Linux) 是一个由 Fedora 社区维护的项目,为 RHEL 及其衍生版本(如 CentOS)提供了许多额外的软件包。

启用 EPEL 仓库

如果您的系统尚未启用 EPEL 仓库,需要先安装它。

对于 CentOS 7:

bash
sudo yum install epel-release -y

对于 CentOS 8+ (Rocky Linux/AlmaLinux):

bash
sudo dnf install epel-release -y

启用 EPEL 后,建议再次更新一下系统软件包列表:

bash
sudo yum update -y # CentOS 7
sudo dnf update -y # CentOS 8+

通过包管理器安装 Redis

启用 EPEL 后,您就可以使用 yumdnf 安装 Redis 软件包了。

对于 CentOS 7:

bash
sudo yum install redis -y

对于 CentOS 8+ (Rocky Linux/AlmaLinux):

bash
sudo dnf install redis -y

这将安装 Redis 服务器和客户端以及相关的依赖。

Redis 包安装后的文件位置

通过包管理器安装的 Redis,其文件位置通常遵循 Linux 文件系统的标准布局:

  • 可执行文件: /usr/bin/redis-server, /usr/bin/redis-cli
  • 配置文件: /etc/redis.conf
  • 数据目录: /var/lib/redis (通常)
  • 日志文件: 可能默认输出到 syslog 或 journald,或在配置文件中指定 /var/log/redis/redis.log (根据具体包的版本和配置有所不同)
  • systemd service 文件: /usr/lib/systemd/system/redis.service/usr/local/lib/systemd/system/redis.service

配置 Redis:编辑 redis.conf

虽然包管理器安装的 Redis 通常自带一个默认的 redis.conf 文件,但您仍然需要根据需求进行修改,特别是安全相关的配置。编辑 /etc/redis.conf

bash
sudo vi /etc/redis.conf

bash
sudo nano /etc/redis.conf

修改的配置项与源码安装时类似,重点关注 daemonize (通常包安装默认已是守护进程,但检查确认)、bindprotected-moderequirepassdirlogfile 等。请参考源码安装部分的配置说明进行修改。

确保 dir 配置的目录 (/var/lib/redis/) 的权限允许运行 Redis 服务的用户写入。通常包管理器安装会自动处理用户和权限,但如果自定义了用户,需要手动调整。

使用 systemd 管理 Redis 服务

通过 EPEL 安装的 Redis 包通常会包含一个预配置好的 systemd service 文件。您可以直接使用 systemctl 命令管理服务。

  • 启动、停止、重启服务

    bash
    sudo systemctl start redis # 启动 Redis
    sudo systemctl stop redis # 停止 Redis
    sudo systemctl restart redis # 重启 Redis
    sudo systemctl status redis # 查看 Redis 服务状态

  • 设置开机自启

    bash
    sudo systemctl enable redis

    取消开机自启:

    bash
    sudo systemctl disable redis

5. 安装后验证

无论您采用哪种安装方法,安装完成后都应该验证 Redis 是否正在运行并可以正常工作。

检查 Redis 进程状态

使用 systemctl status redis 命令检查服务状态:

bash
sudo systemctl status redis

期望的输出应该显示服务是活动的 (active (running))。您也可以使用 ps 命令查看 Redis 进程:

bash
ps aux | grep redis-server

查找类似 redis xxxx 0.3 0.1 154440 8500 ? Ssl HH:MM 0:00 /usr/local/bin/redis-server 127.0.0.1:6379 的行(如果从源码安装且以 redis 用户运行)。如果通过包管理器安装,路径可能是 /usr/bin/redis-server

使用 redis-cli 连接 Redis

使用 Redis 命令行客户端 redis-cli 连接到 Redis 服务器。

如果 Redis 监听在默认的本地地址 (127.0.0.1) 和端口 (6379) 且没有设置密码:

bash
redis-cli

您应该会看到 Redis 的提示符 127.0.0.1:6379>

如果 Redis 监听在其他地址或端口,或者设置了密码,连接时需要指定:

“`bash

连接指定地址和端口

redis-cli -h your_redis_server_ip -p your_redis_port

如果设置了密码

redis-cli -h 127.0.0.1 -p 6379 -a your_very_strong_password

或者连接后使用 AUTH 命令

redis-cli
127.0.0.1:6379> AUTH your_very_strong_password
OK
127.0.0.1:6379>
“`

执行基本命令 (PING, SET, GET)

连接成功后,可以执行一些基本的 Redis 命令测试功能:

“`redis-cli
127.0.0.1:6379> PING
PONG

127.0.0.1:6379> SET mykey “Hello Redis”
OK

127.0.0.1:6379> GET mykey
“Hello Redis”

127.0.0.1:6379> DEL mykey
(integer) 1

127.0.0.1:6379> GET mykey
(nil)

127.0.0.1:6379> QUIT
“`

如果这些命令都能正常执行,说明您的 Redis 服务器已经成功安装并运行。

验证密码设置 (如果已设置)

如果您在 redis.conf 中设置了 requirepass,尝试不带密码或使用错误密码连接:

bash
redis-cli
127.0.0.1:6379> PING
(error) NOAUTH Authentication required.

这表明密码保护已生效。然后使用正确密码进行认证:

bash
redis-cli
127.0.0.1:6379> AUTH your_very_strong_password
OK
127.0.0.1:6379> PING
PONG

6. 常见配置优化与安全加固

安装并验证 Redis 运行后,回顾一些关键的配置项对于生产环境的稳定性和安全性至关重要。

关于 bind 地址和安全

这是 Redis 安全的首要防线。
* 如果 Redis 只供本机应用程序使用,务必将 bind 设置为 127.0.0.1。这样 Redis 只监听本地环回地址,外部网络无法直接连接,大大降低了风险。
* 如果您需要从其他服务器访问 Redis,则需要将 bind 设置为服务器的公共 IP 地址或 0.0.0.0但是,将 bind 设置为 0.0.0.0 并在没有其他安全措施(如防火墙规则、密码、SSL/TLS代理等)的情况下暴露在公网上是极其危险的! 互联网上存在扫描 Redis 弱点的自动化工具。

protected-mode 的重要性

bind 设置为 0.0.0.0 且没有设置 requirepass 时,protected-mode yes 会阻止客户端从本地环回接口以外的地址连接。这是 Redis 4.x 引入的一个额外的安全层。建议始终保持 protected-mode yes 如果您需要外部访问,应设置 requirepass 并可能配置防火墙。

设置强密码 (requirepass)

在任何非本地绑定的 Redis 实例上,设置一个强密码是强制要求。使用 requirepass 配置项,选择一个足够复杂、难以猜测的密码。

重命名或禁用危险命令 (rename-command)

Redis 提供了一些可能被滥用的命令,例如 KEYS (可能阻塞服务器)、FLUSHALL/FLUSHDB (清空数据)、CONFIG (修改配置)、DEBUG (调试)。在生产环境中,可以考虑重命名这些命令或将其设置为空字符串来禁用:

ini
rename-command KEYS "" # 禁用 KEYS 命令
rename-command FLUSHALL RENAME_FLUSHALL # 重命名 FLUSHALL
rename-command CONFIG "" # 禁用 CONFIG 命令

修改后,原来的命令将失效,或者只能使用新的重命名后的命令。

配置持久化 (RDB/AOF)

根据您的数据重要性和对数据丢失的容忍度来配置 RDB 和 AOF。
* RDB: 适用于数据定期备份和灾难恢复。快照文件紧凑,恢复速度快。但两次快照之间的数据变动会丢失。
* AOF: 记录写操作,数据安全性更高(根据 appendfsync 策略),但文件通常比 RDB 大,恢复速度可能较慢。AOF 支持 BGREWRITEAOF 命令(或自动触发)来重写文件,减小文件体积。

生产环境通常会开启 AOF,并结合 RDB 进行定期全量备份。详细配置请参考 redis.conf 文件中的相关注释。

配置最大内存 (maxmemory)

为了防止 Redis 占用过多内存导致系统 OOM (Out Of Memory) 或交换分区 (Swap) 频繁使用,影响性能,建议设置一个合理的 maxmemory 限制。

ini
maxmemory 2gb # 例如,限制 Redis 最多使用 2GB 内存
maxmemory-policy allkeys-lru # 内存达到限制时,使用 LRU 算法移除所有键中最近最少使用的键

选择合适的 maxmemory-policy 也很重要,它决定了内存不足时 Redis 如何腾出空间。

防火墙放行端口 (仅在需要远程访问时)

如前所述,如果您将 bind 设置为非 127.0.0.1 的地址,并且需要从其他机器访问 Redis,请务必在 CentOS 的防火墙中打开 Redis 监听的端口(默认为 6379)。

bash
sudo firewall-cmd --permanent --add-port=6379/tcp
sudo firewall-cmd --reload

再次强调,仅在必要时执行此步骤,并结合其他安全措施 (密码、访问控制列表等)。

7. 基本 Redis 命令使用

掌握一些基本的 Redis 命令可以帮助您管理数据和了解 Redis 的运行状态。通过 redis-cli 连接到 Redis 后,您可以执行以下类型的命令:

  • 连接与断开:

    • redis-cli -h <host> -p <port> -a <password>: 连接到指定的 Redis 实例。
    • AUTH <password>: 在连接后进行身份认证。
    • QUIT: 断开当前连接。
  • 数据类型基本操作:

    • Strings: SET key value, GET key, DEL key, INCR key, DECR key, STRLEN key
    • Hashes: HSET key field value, HGET key field, HGETALL key, HDEL key field
    • Lists: LPUSH key value1 [value2 ...], RPUSH key value1 [value2 ...], LPOP key, RPOP key, LRANGE key start stop, LLEN key
    • Sets: SADD key member1 [member2 ...], SMEMBERS key, SISMEMBER key member, SREM key member1 [member2 ...], SCARD key
    • Sorted Sets: ZADD key score1 member1 [score2 member2 ...], ZRANGE key start stop [WITHSCORES], ZCARD key, ZSCORE key member
  • 键管理:

    • KEYS pattern: 查找匹配模式的键。注意:在生产环境慎用,可能阻塞服务器。
    • EXISTS key: 检查键是否存在。
    • DEL key [key ...]: 删除指定的键。
    • EXPIRE key seconds: 设置键的过期时间 (秒)。
    • TTL key: 查看键的剩余生存时间。
    • TYPE key: 查看键的数据类型。
  • 身份认证:

    • AUTH password: 用于在设置了密码的 Redis 实例中进行身份验证。
  • 服务器信息:

    • INFO [section]: 获取 Redis 服务器信息和统计数据 (如内存使用、客户端连接数、复制状态等)。非常重要的监控命令。
    • ROLE: 查看 Redis 实例的角色 (master, replica, sentinel)。
    • CONFIG GET parameter: 获取 Redis 配置参数的值。
    • CLIENT LIST: 列出所有连接到服务器的客户端。

8. 故障排除

在安装或运行过程中可能会遇到一些问题,以下是一些常见的故障排除方法:

  • 服务无法启动:

    • 检查 Redis 日志文件 (/var/log/redis_6379.loglogfile 配置中指定的路径)。日志通常会包含详细的错误信息。
    • 使用 systemctl status redis 查看服务状态和最近的日志输出。
    • 检查配置文件 /etc/redis.conf 是否存在语法错误或配置项错误。可以使用 redis-server --test-conf /etc/redis.conf 命令来测试配置文件的有效性。
    • 检查端口是否被占用:sudo netstat -tulnp | grep 6379 (或您配置的端口)。
    • 检查运行 Redis 服务的用户 (redis 用户) 是否对 /var/lib/redis (数据目录)、/var/log/redis_6379.log (日志文件) 和 /var/run/redis_6379.pid (pid 文件) 具有写入权限。
    • 如果从源码安装,检查 /usr/local/bin/redis-server 是否存在且有执行权限。
  • 无法连接 Redis:

    • 确认 Redis 服务正在运行 (systemctl status redis)。
    • 检查 Redis 监听的 bind 地址和 port 是否正确 (INFO Command 或查看 redis.conf)。
    • 检查客户端连接时使用的地址、端口和密码是否与服务器配置一致。
    • 检查服务器和客户端之间的防火墙设置,确认 Redis 端口已放行(如果需要远程访问)。使用 firewall-cmd --list-alliptables -L 查看防火墙规则。
    • 如果连接时出现 (error) NOAUTH Authentication required.,说明需要密码认证,请使用 AUTH 命令或在 redis-cli 中使用 -a 参数提供密码。
    • 如果出现 (error) DENIED By CONFIG via TCP: protected mode enabled,说明 protected-mode 开启,但您可能没有设置密码或者连接的客户端不是本地客户端。如果您需要外部连接,请设置密码并确保 bind 地址正确。
  • 配置文件错误:

    • 编辑 redis.conf 时,确保注释行是以 # 开头。
    • 配置项的格式通常是 parameter value
    • 字符串值如果包含空格,可能需要用引号括起来,例如 logfile "/var/log/redis/redis.log"

9. 总结与下一步

恭喜您!通过本指南的详细步骤,您应该已经在 CentOS 系统上成功安装并配置了 Redis 服务器,并将其设置为了 systemd 服务。您现在拥有了一个高性能的内存数据存储系统。

但这只是 Redis 之旅的开始。为了在生产环境中更好地利用和管理 Redis,您可以继续深入学习:

  • Redis 常用命令: 熟悉更多针对不同数据结构的命令以及高级功能(事务、发布/订阅、Lua 脚本)。
  • 性能优化: 学习如何根据您的负载调整 Redis 配置,例如内存管理、网络参数、持久化策略等。
  • 监控: 利用 INFO 命令、Redis Slow Log,或集成专业的监控工具(如 Prometheus + Grafana, RedisInsight)来实时监控 Redis 的运行状态、性能指标和潜在问题。
  • 高可用与扩展: 了解 Redis Sentinel (实现高可用性) 和 Redis Cluster (实现数据分片和分布式)。
  • 客户端库: 在您的应用程序中使用各种编程语言提供的 Redis 客户端库来连接和操作 Redis。

希望这篇详细的指南对您有所帮助。祝您使用 Redis 愉快!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部