1. 项目概述:为什么要在CentOS上部署Redis?
如果你是一名后端开发者、运维工程师,或者正在搭建自己的应用服务,那么“数据缓存”和“会话存储”这两个词对你来说一定不陌生。在众多缓存解决方案中,Redis以其惊人的性能、丰富的数据结构和出色的稳定性,成为了事实上的标准选择。无论是电商秒杀场景下的库存扣减,还是社交应用里的最新动态推送,Redis都扮演着至关重要的角色。而CentOS,作为企业级Linux发行版的常青树,以其稳定和长生命周期支持,是生产环境部署的可靠基石。将Redis部署在CentOS上,是一个经典且高频的组合。
这个项目标题“CentOS安装Redis及redis启动与关闭、配置(详细)”,直指一个非常具体且刚需的场景:在一台全新的或已有的CentOS服务器上,从零开始,完整地部署、配置并管理一个Redis服务。它解决的不仅仅是“安装”这个动作,更涵盖了后续的日常运维操作(启动、关闭)和关键的个性化配置,确保Redis服务能够安全、稳定、高效地运行起来,真正为你的应用提供支撑。无论你是刚接触Linux的新手,还是需要快速为项目搭建环境的资深工程师,这篇内容都将提供一个清晰、可复现的路径。
2. 核心思路与方案选型:源码编译 vs 包管理器
在CentOS上安装软件,通常有两条主流路径:通过系统自带的YUM包管理器安装,或者下载源码手动编译安装。对于Redis,这两种方式各有优劣,选择哪一种,取决于你的具体需求和对环境的控制程度。
2.1 YUM安装:追求快速与稳定
YUM(或它的新一代工具DNF)是CentOS的默认包管理器。它的最大优点是便捷。一条命令就能解决依赖、下载、安装和配置,非常适合需要快速搭建测试环境或对版本要求不苛刻的场景。
然而,YUM仓库中的Redis版本往往不是最新的。CentOS的官方仓库以稳定性优先,其软件版本通常会落后于上游社区的最新发布。例如,当Redis 7.0已经发布一段时间后,YUM仓库里可能还只提供Redis 6.2。如果你的应用依赖某些新版本才有的特性(比如Redis 7.0的ACL增强、多线程IO),那么YUM安装就无法满足需求。
此外,YUM安装的Redis,其配置文件、数据目录、日志文件等位置都遵循CentOS的打包规范(如配置文件在/etc/redis.conf,数据目录在/var/lib/redis),虽然规范,但定制化程度相对较低。
2.2 源码编译安装:追求灵活与控制
手动下载Redis源码包,在服务器上编译安装,是另一种更主流、更推荐用于生产环境的方式。它的核心优势在于完全的控制权。
- 版本自由:你可以自由选择任何一个历史版本或最新版本,轻松应对特定版本的依赖或升级需求。
- 定制编译:你可以通过编译参数(如
make时的OPTIMIZATION选项)针对当前服务器的CPU架构进行优化,理论上能获得更好的性能。 - 目录清晰:你可以自定义安装路径(
PREFIX),将所有相关文件(二进制文件、配置文件、数据文件)集中管理,便于维护和迁移。 - 理解深入:编译安装的过程本身,能让你更清楚地了解Redis的组成,对后续的问题排查有帮助。
它的缺点也很明显:步骤稍多,需要手动处理依赖(主要是GCC编译器),并且后续的启停管理需要自己配置(比如配置成systemd服务)。
结论与选型:对于学习、测试或对版本无特殊要求的环境,YUM安装足够快。但对于生产环境或需要特定版本的场景,源码编译安装是更专业、更推荐的选择。本文将重点详解源码编译安装的全流程,因为掌握了它,YUM安装就变得轻而易举。同时,我们会涵盖如何将编译安装的Redis配置成系统服务,实现和YUM安装一样便捷的systemctl管理方式。
3. 前期准备:环境检查与依赖安装
在开始编译安装之前,我们需要为服务器做好准备。这就像盖房子前要平整土地、准备建材一样。
3.1 系统更新与基础检查
首先,通过SSH连接到你的CentOS服务器。建议先更新系统已有的软件包,这是一个好习惯:
sudo yum update -y接下来,检查系统版本,确认我们是CentOS 7或8(本文以CentOS 7为例,CentOS 8及Rocky Linux/AlmaLinux等衍生版操作类似):
cat /etc/redhat-release然后,检查是否已经安装了旧版本的Redis,避免冲突:
redis-cli --version # 如果未安装,会提示命令未找到 rpm -qa | grep redis # 通过rpm检查是否通过包管理器安装过如果发现旧版本,并且你确定要替换它,需要先卸载。如果是YUM安装的,使用sudo yum remove redis。
3.2 安装编译工具与依赖
编译Redis源码需要C语言编译器。CentOS 7默认可能没有安装完整的开发工具集。我们需要安装gcc、make等。
sudo yum groupinstall “Development Tools” -y sudo yum install wget tcl -y这里解释一下:
“Development Tools”:这是一个软件包组,包含了gcc,make,autoconf等一整套编译工具。wget:用于从网络下载Redis源码包。tcl:一个脚本语言,Redis的官方测试套件make test依赖于它。虽然不运行测试可以不装,但建议安装,以便在安装后能进行基本的功能验证。
安装完成后,验证gcc是否成功安装:
gcc --version3.3 规划安装目录
在编译前,规划好安装路径是个好习惯。我个人的习惯是,将自行编译的软件安装在/usr/local/目录下,因为这是Linux系统约定俗成的“本地软件”安装位置。
我们将为Redis创建一个专属目录:
sudo mkdir -p /usr/local/redis这个/usr/local/redis目录将作为我们安装的“根目录”。后续的二进制文件、配置文件、数据文件、日志文件都可以规划在其子目录下,结构清晰。例如:
/usr/local/redis/bin:存放可执行文件(redis-server,redis-cli等)。/usr/local/redis/conf:存放配置文件。/usr/local/redis/data:存放持久化数据(RDB/AOF文件)。/usr/local/redis/logs:存放日志文件。
当然,你也可以选择其他路径,但保持一致性很重要。
4. 核心安装与配置实战
准备工作就绪,现在进入核心环节:下载、编译、安装和配置Redis。
4.1 下载与解压源码
首先,访问Redis官网(redis.io)或其在GitHub的发布页面,找到最新的稳定版(Stable)下载链接。本文以Redis 7.2.4为例(请以官网最新稳定版为准)。
我们切换到/usr/local/src目录,通常用于存放源码包:
cd /usr/local/src使用wget下载源码压缩包:
sudo wget https://download.redis.io/releases/redis-7.2.4.tar.gz注意:下载链接中的版本号
7.2.4请替换为你实际需要的版本。务必从官方源下载,以确保代码安全。
下载完成后,解压源码包:
sudo tar -xzvf redis-7.2.4.tar.gz解压后会生成一个redis-7.2.4的目录,进入它:
cd redis-7.2.44.2 编译与安装
现在,开始编译源码。这个过程就是将人类可读的C代码转换成机器可执行的二进制文件。
编译:在源码目录下,直接运行
make命令。这个过程会持续几分钟,取决于服务器性能。sudo make如果一切顺利,你会在最后看到类似“It‘s a good idea to run ‘make test’ ;)”的提示。
make命令会调用我们之前安装的gcc等工具,完成编译。实操心得:如果编译过程中出现错误,最常见的原因是
gcc版本过低或依赖缺失。CentOS 7默认的gcc版本是4.8.5,而编译Redis 6.0+可能需要更高版本。如果报错,可以尝试安装devtoolset-9或更高版本(例如scl enable devtoolset-9 bash切换到高版本GCC环境),或者考虑安装稍旧一点的Redis版本。运行测试(可选但推荐):编译完成后,强烈建议运行内置测试,以确保编译出的Redis在当前系统环境下基本功能正常。
sudo make test测试过程会比较长(可能超过10分钟)。如果看到大量的
[ok]和最终的\o/ All tests passed without errors!,就说明测试通过了。如果有个别测试失败,可以暂时忽略,但大量失败则需要排查环境问题。安装:测试通过后,执行安装命令。这里我们需要指定安装前缀(
PREFIX),也就是我们之前规划的目录。sudo make PREFIX=/usr/local/redis install这个命令会将编译好的可执行文件(主要是
redis-server和redis-cli)复制到/usr/local/redis/bin目录下。
安装完成后,可以验证一下:
ls /usr/local/redis/bin/你应该能看到redis-server、redis-cli、redis-benchmark等文件。
4.3 核心配置文件详解与定制
Redis的强大与灵活,很大程度上体现在其配置文件上。默认的配置文件就在我们刚才解压的源码目录里,名为redis.conf。我们需要将它复制到我们规划的配置目录,并对其进行修改。
创建目录并复制配置文件:
sudo mkdir -p /usr/local/redis/conf sudo cp /usr/local/src/redis-7.2.4/redis.conf /usr/local/redis/conf/ cd /usr/local/redis/conf备份原始配置:在修改前,先备份原始文件是个好习惯。
sudo cp redis.conf redis.conf.bak编辑配置文件:使用
vi或nano编辑器修改redis.conf。下面是一些生产环境必须或建议修改的关键参数:sudo vi redis.conf绑定IP与保护模式:默认只监听本地回环地址
127.0.0.1,且保护模式开启。这意味着只有本机可以访问。如果你需要从其他服务器访问,需要修改。# 找到 bind 127.0.0.1 -::1 # 如果你想允许所有IP访问(生产环境慎用,最好结合防火墙),可以改为: # bind 0.0.0.0 # 或者,指定允许的服务器IP,例如: # bind 192.168.1.100 127.0.0.1 # 如果绑定了非127.0.0.1的IP,但想保持一定安全,可以设置密码并关闭保护模式(不推荐,优先用防火墙) # protected-mode no重要安全提示:生产环境中,绝不建议将Redis直接暴露在公网或使用
bind 0.0.0.0且无密码。最佳实践是:bind内网IP,通过防火墙限制访问来源,并务必启用密码认证。端口号:默认端口是6379,你可以根据需要修改。
port 6379守护进程模式:默认Redis不作为守护进程运行。我们需要让它后台运行。
daemonize yes密码认证:这是最重要的安全设置之一。找到
# requirepass foobared这一行,取消注释,并将foobared改为一个强密码。requirepass YourStrongPassword123!数据持久化:Redis默认使用RDB快照。根据你的数据重要性,配置RDB和/或AOF。
# RDB配置:在900秒内至少有1个key变化,则保存 save 900 1 save 300 10 save 60 10000 # AOF配置:开启AOF持久化,推荐使用每秒同步 appendonly yes appendfsync everysec数据目录:指定RDB和AOF文件的存放位置。我们规划在
/usr/local/redis/data。dir /usr/local/redis/data记得创建这个目录:
sudo mkdir -p /usr/local/redis/data日志文件:指定日志输出文件,便于排查问题。
logfile /usr/local/redis/logs/redis.log同样,创建日志目录:
sudo mkdir -p /usr/local/redis/redis/logs最大内存限制:防止Redis占用过多内存导致系统崩溃。根据你的服务器内存设置,例如设置为4GB。
maxmemory 4gb maxmemory-policy allkeys-lru # 内存满时的淘汰策略
修改完成后,保存退出。
4.4 配置Systemd服务实现便捷管理
到目前为止,我们已经可以通过/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf来启动Redis了。但这不够优雅,也无法实现开机自启、方便的状态查看和停止。我们需要将其配置为systemd服务。
创建服务单元文件:
sudo vi /etc/systemd/system/redis.service写入以下内容:请根据你的实际路径修改
ExecStart、ExecStop和配置文件的路径。[Unit] Description=Redis In-Memory Data Store After=network.target [Service] Type=forking User=redis Group=redis # 创建redis用户和组(如果不存在) # sudo groupadd -r redis && sudo useradd -r -g redis redis # 将数据目录和日志目录的所有权给redis用户 # sudo chown -R redis:redis /usr/local/redis/data /usr/local/redis/logs ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf ExecStop=/usr/local/redis/bin/redis-cli -p 6379 -a YourStrongPassword123! shutdown # 注意:上面的ExecStop使用了密码,如果密码中有特殊字符,可能需要转义或使用`--pass`选项。更安全的方式是使用`redis-cli`连接后发送`shutdown`命令,但systemd配置稍复杂。也可以考虑不配置ExecStop,直接使用`systemctl stop redis`发送SIGTERM信号。 Restart=always RestartSec=10 LimitNOFILE=65535 [Install] WantedBy=multi-user.target关键点解析:
User=redis和Group=redis:为了安全,建议使用非root用户运行Redis。你需要先创建这个用户/组,并授权相关目录。ExecStop:这里演示了使用redis-cli带密码关闭的方式。注意,在服务文件中明文密码存在安全风险。一种更安全的做法是:不配置ExecStop,让systemd发送SIGTERM信号来停止服务(Redis会优雅关闭),或者将密码放在一个只有redis用户可读的文件中,通过--passfile引用。Restart=always:确保服务崩溃后自动重启,提高可用性。
重新加载systemd配置并启动服务:
sudo systemctl daemon-reload sudo systemctl start redis sudo systemctl enable redis # 设置开机自启检查服务状态:
sudo systemctl status redis如果看到
active (running),并且下面没有红色的错误日志,恭喜你,Redis服务已经成功启动并托管给systemd了!
5. 启动、关闭与基本操作验证
服务配置好后,日常操作就变得非常简单。
5.1 使用Systemd管理服务
- 启动Redis:
sudo systemctl start redis - 停止Redis:
sudo systemctl stop redis - 重启Redis:
sudo systemctl restart redis - 查看状态:
sudo systemctl status redis - 查看日志:
sudo journalctl -u redis -f(实时查看)或sudo tail -f /usr/local/redis/logs/redis.log
5.2 使用Redis-CLI连接验证
服务启动后,我们需要验证它是否正常工作。使用redis-cli命令行工具进行连接和测试。
本地连接(无密码或密码在配置中):如果Redis运行在本机且未设置密码,或者使用了
redis用户运行(服务文件中已配置环境),可以直接连接。/usr/local/redis/bin/redis-cli带密码连接:如果设置了密码,连接时需要认证。
/usr/local/redis/bin/redis-cli -a YourStrongPassword123!注意:在命令行中使用
-a参数会暴露密码,可能被ps命令看到。更安全的方式是先连接,再认证:/usr/local/redis/bin/redis-cli 127.0.0.1:6379> AUTH YourStrongPassword123! OK执行基本测试:连接成功后,你会看到
127.0.0.1:6379>的提示符。可以执行几个简单命令:PING:服务器应返回PONG。SET mykey “Hello Redis”:设置一个键值对。GET mykey:获取刚才设置的值,应返回”Hello Redis”。INFO:查看Redis服务器的详细信息,这是一个非常强大的诊断命令。
5.3 非Systemd方式的启停(备用方案)
了解直接通过二进制文件启停的方式也是有必要的,可用于调试或临时启动。
- 启动:
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf - 关闭:连接到
redis-cli后,执行SHUTDOWN命令,或者直接向进程发送信号:# 使用redis-cli关闭 /usr/local/redis/bin/redis-cli -p 6379 -a YourPassword SHUTDOWN # 或使用kill命令(先找到PID) ps aux | grep redis-server kill -TERM <redis_pid> # 优雅关闭
6. 常见问题与故障排查实录
在实际部署中,你可能会遇到一些问题。这里记录了几个典型问题及其解决方法。
6.1 启动失败:地址已被占用
问题现象:执行systemctl start redis失败,status查看日志显示Error: Address already in use。
原因分析:端口6379已经被其他进程(可能是之前未正确停止的Redis实例)占用。
解决方案:
- 找出占用端口的进程:
sudo netstat -tlnp | grep :6379或sudo ss -tlnp | grep :6379。 - 确认该进程无用后,终止它:
sudo kill -9 <PID>。 - 如果确定是自己之前启动的Redis,但未以服务形式运行,可以用
pkill redis-server强制停止所有Redis进程。
6.2 启动失败:权限问题
问题现象:日志中显示Permission denied,无法写入日志文件、数据文件或启动失败。
原因分析:运行Redis的用户(在redis.service文件中指定,如redis用户)对相关目录(/usr/local/redis/logs,/usr/local/redis/data)没有写权限。
解决方案:
- 确保目录存在:
sudo mkdir -p /usr/local/redis/{logs,data} - 修改目录所有者和权限:
sudo chown -R redis:redis /usr/local/redis/logs /usr/local/redis/data sudo chmod -R 755 /usr/local/redis/logs /usr/local/redis/data - 如果使用自定义的配置文件路径,也要确保redis用户有读权限:
sudo chown redis:redis /usr/local/redis/conf/redis.conf
6.3 客户端无法连接
问题现象:从远程服务器或本地非127.0.0.1地址无法连接Redis,连接超时或被拒绝。
原因排查表:
| 可能原因 | 检查方法 | 解决方案 |
|---|---|---|
| Redis未监听公网IP | 查看redis.conf中bind配置项。 | 修改bind为服务器内网IP或0.0.0.0(生产环境慎用),并重启Redis。 |
| 保护模式开启 | 当bind非127.0.0.1且无密码时,保护模式会拒绝外部连接。查看protected-mode。 | 1. 设置强密码requirepass。2. 或者(不推荐)关闭 protected-mode。 |
| 防火墙未放行 | 检查CentOS防火墙(firewalld/iptables)。sudo firewall-cmd --list-all。 | 添加防火墙规则:sudo firewall-cmd --permanent --add-port=6379/tcp && sudo firewall-cmd --reload。 |
| 密码认证失败 | 连接时未提供密码或密码错误。 | 使用redis-cli -a password或在连接后使用AUTH password命令。确保密码与redis.conf中的requirepass一致。 |
| 网络问题 | 使用telnet <redis_ip> 6379测试网络连通性。 | 排查服务器间网络、安全组(云服务器)设置。 |
6.4 内存使用过高
问题现象:Redis占用了大量内存,接近或超过maxmemory设置,可能导致写操作失败或频繁触发淘汰策略。
排查与优化:
- 检查当前内存使用:在
redis-cli中执行INFO memory,关注used_memory_human和maxmemory_human。 - 分析键空间:执行
INFO keyspace查看各数据库的键数量。使用redis-cli --bigkeys命令(生产环境慎用,可能阻塞)找出占用空间最大的键。 - 优化数据结构:是否使用了大量小Key?是否可以用更节省内存的数据结构(如使用Hash存储对象而非多个独立的String Key)?
- 调整淘汰策略:检查
maxmemory-policy。volatile-lru或allkeys-lru通常是合理的选择。根据业务场景调整。 - 考虑分片:如果单个实例内存确实不足,需要考虑使用Redis Cluster进行分片存储。
6.5 性能问题排查思路
如果感觉Redis响应变慢,可以按以下顺序排查:
- 检查慢查询:在
redis.conf中设置slowlog-log-slower-than 10000(单位微秒,10毫秒),然后通过SLOWLOG GET命令查看慢查询日志,分析是哪些命令耗时。 - 检查持久化影响:RDB的
save规则或AOF的appendfsync策略(特别是always)会阻塞主线程,导致瞬时延迟。根据数据重要性权衡配置。 - 检查系统资源:使用
top、iostat、vmstat等命令,查看服务器CPU、内存、磁盘I/O是否瓶颈。特别是磁盘IO,如果AOF文件过大或磁盘慢,会影响性能。 - 检查连接数:执行
INFO clients,查看connected_clients。连接数过多会消耗资源。检查客户端连接池配置是否合理。 - 使用内省命令:
INFO命令的输出包含了几乎所有运行时信息,是性能排查的宝库。
7. 安全加固与生产环境建议
将Redis部署到生产环境,安全是重中之重。除了前面提到的设置强密码和绑定内网IP外,还有以下几点:
禁用高危命令:在
redis.conf中,使用rename-command指令将一些危险命令重命名或禁用。例如:rename-command FLUSHALL “” rename-command FLUSHDB “” rename-command CONFIG “” rename-command SHUTDOWN “SHUTDOWN_FORBIDDEN”这样,
FLUSHALL和FLUSHDB被彻底禁用(重命名为空字符串),CONFIG命令被禁用,SHUTDOWN命令被重命名,需要输入新名字才能执行,增加了误操作难度。使用非默认端口:将端口从6379改为其他不常见的端口,可以避免一些自动化攻击脚本的扫描。修改
redis.conf中的port参数即可。启用AOF持久化并做好备份:
appendonly yes能提供更好的数据安全性。同时,定期将RDB和AOF文件备份到其他安全的存储位置(如对象存储、另一台服务器)。监控与告警:使用
INFO命令定期收集Redis指标(内存使用、连接数、命中率、持久化状态等),并集成到监控系统(如Prometheus + Grafana)。设置关键指标(如内存使用率>90%、连接数异常增长)的告警。资源限制:在
redis.conf中合理设置maxmemory,并配置maxmemory-policy。在系统层面,可以通过ulimit或systemd的LimitNOFILE等参数限制Redis进程能打开的文件描述符数量。定期更新:关注Redis官方发布的安全更新和稳定版本,在测试环境验证后,有计划地升级生产环境版本。
部署Redis只是第一步,围绕它的监控、备份、高可用(主从复制、哨兵、集群)构成了一个完整的运维体系。从这篇详细的单机部署指南开始,你已经拥有了一个坚实可靠的基础服务节点,可以在此基础上,根据业务增长的需要,逐步探索更复杂的架构。