
说实话在银河麒麟系统上装 Redis 这件事光看标题会觉得没啥好写的。毕竟 Redis 是纯 C 写的源码一编译扔到哪个 Linux 上都能跑。但真正到我上手的时候问题就变得很现实不同版本的银河麒麟对应不同的包管理方式自带的软件源里未必有 Redis网上搜到的教程不是照搬 CentOS 就是照搬 Ubuntu执行到一半不是缺依赖就是服务起不来。这篇是我从头到尾亲测的记录包含源码编译、配置文件调整、systemd 守护、远程连接和排错照着操作能少折腾几个小时。不管你是要在银河麒麟 V10 服务器版上跑业务缓存还是想在虚拟机里研究 Redis 主从、可视化管理工具这篇文章都适用。1. 先把机器底细摸清版本、架构和包管理现状1.1 银河麒麟的系统版本可能骗过你很多刚接触银河麒麟的同学第一反应就是“这不就是 CentOS 吗”。其实银河麒麟 V10 有桌面版和服务器版不同的版本底子可能完全不一样有的基于 RPM 体系能用 yum/dnf有的基于 Debian 体系能用 apt。如果你不先确认这一点后面安装依赖的时候会非常被动。我上手后的第一件事不是急着下载 Redis而是先看系统信息cat /etc/os-release uname -m hostnamectl我这边输出的核心内容大致是这样的NAMEKylin VERSIONV10 IDkylin PRETTY_NAMEKylin V10架构是x86_64。如果你的机器是aarch64ARM 架构后面的编译参数不需要特殊处理Redis 对这两种架构都支持得很好只是下载源码包时不需要区分源码编译会自动适配。1.2 先探一下包管理器里有没有现成的 Redis确定系统版本后我习惯先看一眼包管理器的底牌。这一步不是多余的因为有的银河麒麟源里确实收录了 redis-server但版本可能比较旧有的源里干脆就没有。which yum dnf apt apt-get 2/dev/null然后分别试一下yum list redis 21 | tail -n 10 apt-cache search redis-server 2/dev/null在我这台服务器上yum list redis返回的是“没有匹配的软件包”也就是官方源里根本没有 Redis。这种情况下如果你还继续等 yum 安装多半是浪费时间。所以接下来的思路就很清晰了走源码编译这条路不仅能拿到新版本还能自己控制安装路径和配置细节。1.3 评估一下机器配置Redis 本身算是很轻量的服务1 核 CPU、1G 内存的机器也能正常跑起来甚至可以做简单的生产缓存。但如果你要编译源码建议机器能剩出至少 1G 磁盘空间编译过程中的临时文件比较多。另外如果内存特别小比如 512M编译时用make -j2就好不要开太多并行任务否则内存会被直接吃满。2. 为什么我一上来就走源码编译不只是因为没得选2.1 自带源的版本往往落后几个大版本就算你的银河麒麟源里能找到 Redis版本大概率也停留在 3.x 或者 4.x。Redis 3.x 和 4.x 在现在这个时间点已经有点跟不上节奏了很多实用的特性都用不上。比如ACL 用户权限体系Redis 6 才正式引入可以给不同的业务配置不同的账号权限避免所有人共用一条requirepass。多线程 I/ORedis 6 之后在网络读写层面支持了多线程对高并发场景提升比较明显。Stream 数据类型Redis 5 引入适合做消息队列、事件流存储。RESET 命令、客户端缓存、更好的集群管理工具等。如果你的业务要用到这些能力老版本包完全帮不上忙。而从源码编译我完全可以挑一个稳定的长期支持版本比如 6.2.5 或者更新的 7.x 系列。2.2 源码编译在银河麒麟上的实际优点源码编译听上去麻烦其实在 Redis 这个项目上一点也不复杂。Redis 对依赖的要求很低基本就是gcc和make不像编译某些大型软件还要装一堆devel包。编译完之后你可以把整个 Redis 安装到自定义目录不污染系统环境的默认路径。另外自己编译还能选择内存分配器。Redis 默认用的是 jemalloc某些系统环境编译时如果缺少对应头文件可以用make MALLOClibc切换到 glibc 自带的内存分配器。这种灵活性是二进制包给不了的。2.3 把编译环境准备到“刚刚好”的状态在银河麒麟上装编译工具链命令要看你前面确认的包管理器类型。如果是 RPM 系yum groupinstall Development Tools -y如果是 Debian 系apt update apt install build-essential -y我用的是 RPM 系所以直接执行了第一行。装完以后用gcc --version和make --version验证一下只要能看到版本号就说明编译环境已经 OK 了。注意如果机器没有外网也没配置好本地源yum groupinstall可能会失败。这种情况建议先用挂载的系统镜像配置一个本地 yum 源再把Development Tools装上优先级最高。3. 从下载 Redis 6.2.5 源码到 make install 的完整过程3.1 拿到源码包并放到计划目录我习惯把源码统一放在/usr/local/src目录下解压、编译都在同一个地方后面清理也方便。cd /usr/local/src wget https://download.redis.io/releases/redis-6.2.5.tar.gz如果你的服务器访问国外站点很卡或者根本下不动可以换用国内的镜像源常见的镜像站都有 Redis 源码包。下载完以后强烈建议校验一下文件完整性。Redis 官网发布页面会给出对应的 SHA256 值你可以用sha256sum redis-6.2.5.tar.gz把计算出来的哈希值和官网页面上的值比对。不比对也能用但生产环境下这是一个非常值得养成的习惯省得拿到被篡改过的包还不知道。3.2 解压、编译以及最常见的两个报错解压命令没什么特别tar xzf redis-6.2.5.tar.gz cd redis-6.2.5编译前我先说两个很容易踩的坑因为这两个坑几乎每个照着我这篇教程走的人都会碰到。第一个坑gcc: command not found。原因很简单编译工具链没装或者不完整。返回去执行第 2.3 节里的groupinstall命令装完重开一个终端再试。第二个坑编译时报错zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory。这是因为 Redis 默认启用了 jemalloc 内存分配器但系统里没有对应的头文件。这时候不需要去装什么 jemalloc 开发包直接强制使用 libc 分配器就行make MALLOClibc -j$(nproc)-j$(nproc)的意思是开启和 CPU 核数一致的并行编译速度会快很多。如果你不知道机器是几核可以用nproc命令查看。编译成功以后输出最后会提示你运行make test来跑测试套件。我建议你至少把make test跑一遍这个过程会验证 Redis 在你这套环境下是否都正常通常需要几分钟。如果提示缺少tcl安装一下即可yum install tcl -y # 或者 apt install tcl -y3.3 安装并做一次最小化启动验证测试通过后执行安装make install默认会安装到/usr/local/bin目录下这样redis-server、redis-cli、redis-benchmark这些命令在任意目录下都能直接用。验证一下版本redis-server --version接着启动一个最原始的 Redis 实例试试手先不加载任何配置文件redis-server --port 6379 --daemonize yes --save 这条命令的意思是监听 6379 端口以后台守护进程方式启动并且不落盘。然后验证redis-cli -p 6379 ping如果返回PONG说明 Redis 在这台银河麒麟机器上已经能正常运行了。测试完以后把这个临时实例关掉redis-cli -p 6379 shutdown nosave4. 别急着 start先把 redis.conf 改成你想要的样子4.1 准备独立的配置、数据和日志目录Redis 源码目录里自带一份redis.conf但它更像一份完整的手册里面的注释非常多。我习惯的做法是新建一个专门的配置目录把能用的配置精简到一份生产配置里。mkdir -p /etc/redis mkdir -p /var/lib/redis mkdir -p /var/log/redis cp /usr/local/src/redis-6.2.5/redis.conf /etc/redis/6379.conf这样配置、数据、日志三个目录互不干扰。后面如果同一个机器上要跑多个 Redis 实例只需要复制多份配置分别改端口和目录即可。4.2 七个我每次都要改的参数以下这份表格是我在银河麒麟上部署 Redis 时最关心的配置项每个参数我都有实际调整过不是网上随便抄来的配置项我这次用的值说明bind0.0.0.0允许外部机器访问前提是已做好密码保护port6379默认端口如果没有冲突不用改protected-modeyes安全保护开关必须设置密码不能关daemonizeno交给 systemd 管理时一定写 norequirepass你自己设的强密码外部访问的密码dir/var/lib/redisRDB 和 AOF 文件的存放目录appendonlyyes开启 AOF 持久化日志式落盘appendfsynceverysec每秒刷一次盘性能和可靠性的平衡点maxmemory根据服务器实际内存调整防止 Redis 把内存吃光建议至少留 1G 给系统打开配置文件vim /etc/redis/6379.conf直接搜索这几个参数改成上面的值。这里我特意强调一下daemonize这个参数后面用 systemd 管理 Redis 的时候如果这里写了yesRedis 会自己 fork 出一个守护进程systemd 会认为主进程已经退出然后出现“服务启动失败”或者“进程号对不上”的奇怪现象。所以我的建议是daemonize no让 systemd 直接管住前台进程。protected-mode yes这个参数在 Redis 6.2 里仍然默认开启。当 Redis 没有设置密码、并且绑定的不是本机回环地址时外部客户端连进来会被拒绝。很多人在这一步抓狂其实只要设置了强密码再显式配置bind就不会触发保护机制。密码建议用类似Kx9#pL2mRq7v这种足够长的随机串别用123456否则内网扫端口的人分分钟爆破。4.3 关于“改完配置立刻生效”的说法很多人以为改完redis.conf马上就能用其实不是。Redis 的配置加载只发生在启动阶段运行期间你还可以用CONFIG SET临时修改但要想让配置文件里的内容持久化还是需要重启服务。我习惯在改完配置后先校验一下配置有没有语法错误redis-server /etc/redis/6379.conf --test-memory 512--test-memory会做一次内存自检顺便把配置解析之后的报错暴露出来避免启动到一半才发现问题。内存自检不要在生产大内存机器上随便跑它会把内存全部写一遍有一定延迟。5. 用 systemd 把 Redis 服务化开机自启一个不落5.1 编写 redis.service 单元文件很多人编译装完 Redis就是手动redis-server /etc/redis/6379.conf把它跑起来这样一旦机器重启Redis 不会跟着启动而且日志、进程管理都很乱。正确做法是把它交给 systemd。在/etc/systemd/system/目录下创建redis.service文件vim /etc/systemd/system/redis.service内容如下[Unit] DescriptionRedis Server 6379 Afternetwork.target [Service] Typesimple Userredis Groupredis ExecStart/usr/local/bin/redis-server /etc/redis/6379.conf ExecStop/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 -a 你的密码 shutdown Restartalways RestartSec3 [Install] WantedBymulti-user.target这个文件里最关键的是Userredis。Redis 官方不建议用 root 用户直接运行服务否则一旦有命令执行漏洞攻击者直接拿到 root 权限。所以我单独创建一个低权限用户useradd -s /sbin/nologin redis chown -R redis:redis /var/lib/redis /var/log/redis /etc/redis/6379.conf注意/var/lib/redis和/var/log/redis必须让 redis 用户可以写不然启动后会立刻报权限错误而且这个问题特别容易在这个环节出现。5.2 启动、设置开机自启和状态检查配置文件写好后先重载 systemdsystemctl daemon-reload systemctl enable --now redis然后看一下服务状态systemctl status redis -l如果一切正常你会看到Active: active (running)。再用客户端验证一次redis-cli -h 127.0.0.1 -p 6379 -a 你的密码 ping这里-a后面直接跟密码命令执行后会有一条警告信息提示密码出现在命令行里这是正常的不会影响运行。想看更详细的信息可以用ss -lntp | grep 6379确保LISTEN状态没问题说明 Redis 已经作为常驻服务跑起来了。5.3 重启验证不是什么“仪式感”配置完 systemd 之后我强烈建议执行一次systemctl restart redis为什么因为很多问题只在重启时才会暴露。之前就有同事遇到ExecStop命令里的密码配错平时好好的一重启就停不掉服务最后只能kill -9。提前重启一遍确认它能自己停下、自己起来后面再遇到机器重启就不会手忙脚乱。6. 远程连接、防火墙和可视化客户端Windows/跨机访问不再折腾6.1 防火墙放行 6379 端口很多人按照教程配好 Redis然后在自己电脑上用客户端连接结果一直超时。第一反应是 Redis 配置错了实际上八成是服务器防火墙把端口拦了。在银河麒麟上检查防火墙状态systemctl status firewalld如果防火墙是开启的放行 6379 端口firewall-cmd --permanent --add-port6379/tcp firewall-cmd --reload如果你发现这个机器用的是ufw命令换成ufw allow 6379/tcp如果业务要求比较严格只允许特定网段的机器连接可以这样写firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.10.0/24 port protocoltcp port6379 accept firewall-cmd --reload这样比直接对所有 IP 开放更安全。6.2 调整 bind 与访问权限的正确姿势在配置文件里我建议bind 0.0.0.0但这只是在“配合防火墙 强密码”前提下的选择。有些教程一上来就让大家用protected-mode no我特别不推荐。因为一旦关掉保护模式并且没有密码公网 Redis 漏洞扫描工具几分钟就能扫到你的服务器接着就是写定时任务挖矿。最稳妥的组合是protected-mode yesbind 0.0.0.0requirepass设置为高强度的随机密码防火墙只放行内网网段如果你的机器 IP 是192.168.1.10只允许内网访问也可以把bind写成具体 IPbind 192.168.1.10这样 Redis 只监听这个内网地址外网连不进来安全等级又提高了一档。6.3 可视化客户端实测Another Redis Desktop ManagerRedis 本身是命令行工具但排查数据、查看 key 分布的时候图形界面确实方便很多。网上比较多的是 Redis Desktop Manager但它的新版已经转成商业收费了。我更推荐开源的 Another Redis Desktop Manager也就是大家常说的 ARDM。在 Windows 上使用很简单下载对应的 exe 安装包打开后新建连接填写地址你银河麒麟机器的 IP端口6379密码配置文件里设置的 requirepass 值连接成功后你会看到 Redis 里所有的 key可以按数据类型筛选能看到 String、Hash、List、Set、Sorted Set 等类型的完整内容。这个工具对新手特别友好也是一种直观理解 Redis 数据类型的方式。如果你不想装图形界面命令行里这样远程连接redis-cli -h 192.168.1.10 -p 6379 -a 你的密码进入交互模式后输入info可以看到服务端详细信息输入dbsize可以看当前库有多少 key。这里补充一个实际经验多台客户端机器用同一个账号连接没问题但生产环境建议用 Redis 6 以后的 ACL 功能为每个业务账号单独授权别全挤在requirepass这一层。7. 排错记录银河麒麟下最容易翻车的几个场景7.1 服务启动“秒退”或状态一直 failed这是排错里出现频率最高的问题。Redis 启动后立刻退出systemctl status里面显示failed。这时候先别急着怀疑系统直接用前台方式跑一下配置真实错误会立刻打在屏幕上/usr/local/bin/redis-server /etc/redis/6379.conf我遇到过的问题是dir参数指向的/var/lib/redis目录权限不对导致 Redis 无法写入持久化文件进程启动后自动退出。用ll /var/lib/redis查看权限确保 owner 是redis。还有一个很误导人的情况配置里有daemonize yessystemd 启动后显示“单元退出”但 redis-server 进程其实还在后台跑着。这时候我已经在 4.2 节里反复强调过使用 systemd 管理时一定把daemonize改成no。7.2 外部客户端被拒绝连接Protected Mode 报错在远程用 ARDM 或者 redis-cli 连接时如果返回类似这样的信息DENIED Redis is running in protected mode because protected mode is enabled and no password is set for the default user.说明当前 Redis 处于保护模式同时没有设置密码或者你没把bind配置成对外可见的地址。解决方法很简单配置requirepass并重启服务。注意重启时必须在systemctl restart redis后重新测试很多远程连接问题都是因为改了配置但没重启。7.3 编译阶段 jemalloc 报错和内核参数警告编译报 jemalloc 头文件不存在的问题我前面已经给过命令make MALLOClibc。但这里还有一个延伸问题Redis 启动时可能会有这样一个警告WARNING overcommit_memory is set to 0! Background save may fail under low memory condition.这是系统内核参数vm.overcommit_memory的问题Redis 在做后台持久化时需要系统允许一定程度的内存超额申请。临时生效sysctl vm.overcommit_memory1永久生效需要修改/etc/sysctl.conf在文件末尾加上vm.overcommit_memory 1 net.core.somaxconn 511然后执行sysctl -p加载。第二个参数somaxconn是为了优化高并发连接下的 TCP 队列长度没有改的话在压力测试下也可能出现连接延迟。7.4 目录权限和 SELinux 的坑银河麒麟服务器版默认可能会开启 SELinux这种情况下即使你的dir目录权限正确Redis 也可能无法写文件日志里会看到类似Permission denied的报错。用下面命令确认getenforce如果返回Enforcing说明 SELinux 在强制模式。快速验证是不是它造成的问题setenforce 0然后重启 Redis。如果确实能正常工作了说明就是 SELinux 策略拦的。内网测试环境临时关掉可以但生产环境建议还是按安全策略给 Redis 目录打上正确的 SELinux 标签不要图省事一关了之。7.5 养成看日志的好习惯日志是排错的第一入口。在 Redis 配置文件里设置logfile /var/log/redis/redis.log然后一旦遇到问题第一时间执行tail -n 50 /var/log/redis/redis.log比到处瞎猜强得多。Redis 的日志写得其实很清楚启动失败原因通常就在前面几行。8. 用 redis-benchmark 实测一遍顺便聊聊后续扩展8.1 本地压测看看到底能跑多少 QPSRedis 装好、服务跑起来以后我习惯用自带压测工具做一次快速验证顺便确认这台机器的基本性能。redis-benchmark -h 127.0.0.1 -p 6379 -a 你的密码 -c 50 -n 10000 -t set,get -q解释一下参数-c 50表示模拟 50 个并发客户端-n 10000表示总共发送 10000 次请求-t set,get只压测 SET 和 GET 两种命令-q让输出更精简。在我这台银河麒麟 V10 测试机上结果稳定在每秒 8 万以上请求延迟中位数在 1 毫秒以内。如果你测试结果在几万甚至几千先别急着怀疑 Redis看看是不是机器 CPU 频率太低、虚拟化环境性能受限或者开启了太多其他服务占用了 CPU。8.2 从“装上”到“用好”常用命令和数据类型的实战理解压测通过之后Redis 就算真正能用了。但安全性、稳定性和业务价值还需要进一步规划和理解。至少下面这几个新手上路必须会dbsize查看当前库的 key 数量info memory查看内存使用情况keys *列出所有 key仅限测试环境生产环境慎用key 很多时会卡住整个实例type key名查看某个 key 对应的数据类型ttl key名查看 key 剩余过期时间这里也顺便说一说 Redis 各种数据类型对应的典型场景这也是面试和工作里绕不开的点String最基础适合做计数器、缓存、分布式锁里的SETNX操作Hash适合存对象比如用户信息、商品信息内存使用比 String 存 JSON 更省List适合简单消息队列、最新消息列表Set适合去重、共同好友等集合运算Sorted Set适合排行榜、延迟队列每个元素带一个分数天然按分数排序StreamRedis 5 之后更专业的消息队列支持消费者组8.3 数据备份和日常维护要提前想好Redis 数据全在内存里一旦机器磁盘损坏、误删实例持久化文件就是你唯一的退路。我在银河麒麟上的建议是开启 RDB 快照默认配置里已经有save 3600 1这类规则表示 1 小时内至少 1 次写入变更时才触发快照。开启 AOF 日志appendonly yes并且appendfsync everysec。如果业务对数据完整性要求极高可以改成always但写入性能会明显下降。定期把/var/lib/redis/dump.rdb和 AOF 文件复制到其他机器或者备份盘上。备份命令很简单cp /var/lib/redis/dump.rdb /backup/redis/dump-$(date %F).rdb如果是重要业务建议同时用redis-cli BGSAVE手动触发一次快照确保备份文件尽量新。恢复时把备份文件放到dir对应的目录重启 Redis 即可自动加载。8.4 有条件的话用 Docker 或主从架构做升级我这次是直接在银河麒麟裸机上编译安装的这也是最通用、最可控的方案。但如果你所在的团队已经普及 Docker也可以考虑用官方镜像跑 Redis。Redis 官方镜像本身也是基于 Debian 构建的在银河麒麟的 Docker 环境中运行完全没问题关键是要做好数据目录的卷挂载和端口映射。如果你后续要搭建 Redis 主从架构或者哨兵集群建议先把单机版这套 systemd 管理方式吃透。因为主从配置的核心就是 replicaof 主节点IP 6379 这一行配置文件的路径、权限、目录管理逻辑和单机版完全一样。等主从起来以后再去研究哨兵和集群思路会顺畅很多。 最后再分享一个我个人的习惯每次改完 Redis 配置先在测试环境 systemctl restart redis然后跑一遍 redis-cli ping 和 redis-benchmark确认没有任何异常后才动生产。Redis 的配置项很多但真正影响线上运行的核心就那么几个把基础的持久化、内存上限、访问控制和防火墙守好这台银河麒麟上跑 Redis 就稳了。