从 0 到 1 构建高可用企业级 NoSql 数据库 Redis 集群

目录

核心定位解释

[一 关系型数据库和 NoSQL 数据库](#一 关系型数据库和 NoSQL 数据库)

[1.1 数据库主要分为两大类:关系型数据库与 NoSQL 数据库](#1.1 数据库主要分为两大类:关系型数据库与 NoSQL 数据库)

分类与定位解释

[1.2 为什么还要用 NoSQL 数据库呢?](#1.2 为什么还要用 NoSQL 数据库呢?)

核心痛点解释

[1.3 RDBMS 和 NOSQL 的特点及优缺点:](#1.3 RDBMS 和 NOSQL 的特点及优缺点:)

[二 redis 简介](#二 redis 简介)

官网

[2.1 什么是 redis](#2.1 什么是 redis)

核心定义与对比

[2.2 Redis 特性](#2.2 Redis 特性)

特性底层解析

[2.3 Redis 应用场景](#2.3 Redis 应用场景)

场景修正与解析

[2.4 缓存的实现流程](#2.4 缓存的实现流程)

流程修正与解析

[三 Redis 的安装](#三 Redis 的安装)

[一. 安装依赖](#一. 安装依赖)

[二. 源码编译redis](#二. 源码编译redis)

版本选择解释

[3.1 rpm 包方式安装](#3.1 rpm 包方式安装)

核心代码逐行解析

生活类比

企业级生产应用

进阶优化空间

课后防宕机指南

[3.2 源码安装](#3.2 源码安装)

核心代码逐行解析

生活类比

企业级生产应用

进阶优化空间

课后防宕机指南

安装实验

一。安装依赖

[二。源码编译 redis](#二。源码编译 redis)

实验补充解释

[四 Redis 的基本操作](#四 Redis 的基本操作)

基础命令列表

命令示例与逐行解析

[1. 查看配置](#1. 查看配置)

[2. 写入和读取数据](#2. 写入和读取数据)

[3. 查看所有 key](#3. 查看所有 key)

[4. 选择数据库](#4. 选择数据库)

[5. 移动数据](#5. 移动数据)

[6. 改变键名](#6. 改变键名)

[7. 设置过期时间](#7. 设置过期时间)

[8. 删除 key](#8. 删除 key)

[9. 持久化保存](#9. 持久化保存)

[10. 判断 key 是否存在](#10. 判断 key 是否存在)

[11. 清空当前库](#11. 清空当前库)

[12. 清空所有库](#12. 清空所有库)

生活类比

企业级生产应用

进阶优化空间

课后防宕机指南


远程字典服务

在企业存储经常变化的数据,订单,人数,流量;直到不变的才放在数据库中

核心定位解释

生活类比 :Redis 就是超市的前台应急货架,只放最近 1 小时卖得最火的商品(高频变化的热数据),仓库(MySQL/Oracle)放所有商品。顾客买东西先扫前台货架,没有再去仓库调货,整体效率提升 100 倍以上。

企业级生产应用:千万级并发的电商秒杀、直播间在线人数统计、外卖订单实时状态更新,所有 QPS 超过 1000 的高频读写场景,必须用 Redis 扛住第一波流量,否则关系型数据库会直接被打穿宕机。

进阶优化空间:冷热数据自动分层(7 天内访问的热数据放 Redis,冷数据自动下沉到MySQL);使用 Redis Cluster 做分片,突破单节点 128G 内存上限;开启客户端缓存,进一步减少网络往返。

课后防宕机指南

  1. 错误现象:MySQL 连接数打满,CPU 100%,服务雪崩
    • 原因:热数据未写入 Redis,请求直接打穿数据库
    • 排查思路:先执行show processlist查看 MySQL 活跃连接,再检查业务代码的缓存写入逻辑是否在查询后执行
  2. 错误现象:Redis 内存占用持续飙升,触发 OOM
    • 原因:未设置过期时间,冷数据长期占用内存
    • 排查思路:执行redis-cli info memory查看内存使用,用SCAN遍历大 key 并清理

一 关系型数据库和 NoSQL 数据库

1.1 数据库主要分为两大类:关系型数据库与 NoSQL 数据库

关系型数据库,是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库中的数据。主流的 MySQL、Oracle、MS SQL Server 和 DB2 都属于这类传统数据库 (IBM)。

NoSQL 数据库,全称为 Not Only SQL, 意思就是适用关系型数据库的时候就使用关系型数据库,不适用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。主要分为临时性键值存储 (memcached、Redis)、永久性键值存储 (ROMA、Redis)、面向文档的数据库 (MongoDB、CouchDB)、面向列的数据库 (Cassandra 大水牛、HBase), 每种 NoSQL 都有其特有的使用场景及优点。

AI 里有向量数据库:PGsql; 不用硬盘数据 mysql; 一般用内存里的数据库

分类与定位解释

生活类比 :关系型数据库是图书馆分类书架 ,每本书有固定位置和编号,必须按分类查找,严谨但慢;NoSQL 是快递驿站货架,随便放,只要贴个快递单号(键)就能 1 秒找到,适合海量不规则包裹(数据)。

企业级生产应用:RDBMS 存核心事务数据(订单支付、用户账户);Redis 存热数据和计数器;MongoDB 存非结构化数据(商品详情、用户评论);HBase 存 PB 级用户行为日志。

进阶优化空间:混合存储架构,通过 Canal 监听 MySQL binlog 自动同步数据到 Redis,实现缓存最终一致性;使用 TiDB 等分布式关系型数据库,兼顾 ACID 和扩展性。

课后防宕机指南

  1. 错误现象:单表查询超时,磁盘 IO 100%
  • 原因:误用 RDBMS 存海量日志数据,单表数据量超过 1 亿
  • 排查思路:查看慢查询日志,将非结构化数据迁移到 MongoDB/HBase

1.2 为什么还要用 NoSQL 数据库呢?

主要是由于随着互联网发展,数据量越来越大,对性能要求越来越高,传统数据库存在着先天性的缺陷,**即单机 (单库) 性能瓶颈,并且扩展困难。**这样既有单机单库瓶颈,却又扩展困难,自然无法满足日益增长的海量数据存储及其性能要求,所以才会出现了各种不同的 NoSQL 产品,NoSQL 根本性的优势在于在云计算时代,简单、易于大规模分布式扩展,并且读写性能非常高

有意识消费:迫切需求;2.0; 商品进网络。

无意识消费:直播引导;3.0;

新时代数据变得和用户更紧密,不确定性变多;

核心痛点解释

  • 传统 RDBMS 硬上限:单机 MySQL QPS 极限 1000-2000,单表超过 1000 万行后查询性能指数级下降;分库分表复杂度极高,维护成本增加 10 倍
  • NoSQL 核心优势:天生分布式,Redis Cluster 可轻松扩展到 1000 + 节点,单节点 QPS 达 10 万 +,读写延迟 < 1ms
  • 消费时代与数据的关系:2.0 电商时代数据是商品附属;3.0 直播时代数据本身就是商品(用户消费习惯、实时互动数据),对实时性要求从秒级提升到毫秒级,只有 NoSQL 能满足

企业级生产应用:双 11 秒杀每秒 50 万下单请求,必须用 Redis 做库存扣减和限流,否则 MySQL 会在 1 秒内宕机

进阶优化空间:使用 Redis 读写分离,主节点写,从节点读,读性能提升 3-5 倍;使用 Redis Cluster 做数据分片,实现水平扩展

课后防宕机指南

错误现象:Redis 集群部分节点宕机,数据不可访问

  • 原因:主从复制中断,哨兵未触发自动切换
  • 排查思路:执行redis-cli cluster nodes查看集群状态,检查主从复制延迟

1.3 RDBMS 和 NOSQL 的特点及优缺点:

关系数据库 (和钱打交道)

和非关系数据库

昂贵:甲骨文公司,不是按照软件收费的,是按照 CPU 的核心数量收费;银行会用;

有直播就有 redis

数据库类型 核心特点 核心优势 核心劣势 适用场景
关系型数据库(RDBMS) 二维表结构,支持 ACID 事务,强一致性 数据结构清晰,事务完善,SQL 查询强大 单机性能瓶颈,扩展困难,成本高 金融交易、订单系统、用户账户
NoSQL 数据库 键值 / 文档 / 列 / 图存储,最终一致性 读写性能高,易扩展,支持非结构化数据 事务弱,查询功能有限 缓存、计数器、社交网络、消息队列
  • 补充说明:Oracle 按 CPU 核心数授权,8 核 CPU 年授权费约 10 万人民币,银行因合规要求必须使用,成本极高
  • "有直播就有 redis":直播场景有百万级 QPS 的实时数据(在线人数、弹幕、礼物),只有 Redis 能支撑毫秒级读写

生活类比:RDBMS 是银行柜台,只能办固定业务,流程严谨但慢;NoSQL 是便利店自助收银,什么都能买,速度极快,适合高频小额交易

企业级生产应用:银行核心系统用 Oracle,电商直播用 Redis 做实时统计,社交平台用 MongoDB 存用户动态

进阶优化空间:使用 Seata 分布式事务解决 NoSQL 的事务问题;使用数据校验工具保证跨库数据一致性

课后防宕机指南

错误现象:NoSQL 查询超时,响应时间 > 10s

  • 原因:误用 NoSQL 做复杂关联查询
  • 排查思路:将关联数据冗余存储,避免跨表查询

二 redis 简介

中文官网

https://redis.cn

官网

  • 说明:redis.cn是中文镜像站,redis.io 是英文官方站,所有下载和文档以官方站为准;Redis Stack 支持向量数据库和 AI 模型推理,是 AI 应用首选缓存

生活类比:Redis 官网就是汽车 4S 店,你可以在这里买最新款车(下载 Redis)、看说明书(文档)、了解最新技术升级(AI 功能)

企业级生产应用:AI 聊天机器人用 Redis Stack 存储对话历史和向量数据,实现上下文感知和相似度检索

进阶优化空间:使用 Redis Stack 的向量索引功能,AI 检索速度提升 10 倍;使用 RedisAI 部署轻量级模型,实现边缘推理

课后防宕机指南

错误现象:Redis AI 模型加载失败,提示 "Model not found"

  • 原因:模型文件路径错误或 Redis Stack 未安装 AI 模块
  • 排查思路:检查模型文件权限,执行module list查看已加载模块

2.1 什么是 redis

redis MySQL Redis Memcached PostgreSQ

Redis (Remote Dictionary Server)

远程字典服务

在 2009 年发布 (需求导致), 开发者是意大利的萨尔瓦多・桑菲利波普 (Salvatore Sanfilippo), 他本想为自己的公司开发一个用于替换 MySQL 的产品 Redis, 但是没有想到他把 Redis 开源后大受欢迎,短短几年,Redis 就有了很大的用户群体,目前国内外使用的公司众多,比如:阿里,百度,新浪微博,知乎网,GitHub,Twitter 等

2012 年滴滴出来;买消费习惯;美团也是,一餐就 5 毛钱;买消费习惯;

Redis 是一个开源的、遵循 BSD 协议的、基于内存的而且目前比较流行的键值数据库 (key-value database), 是一个非关系型数据库,redis 提供将内存通过网络远程共享的一种服务,提供类似功能的还有 memcached, 但相比 memcached,redis 还提供了易扩展、高性能、具备数据持久性等功能。

Redis 在高并发、低延迟环境要求比较高的环境使用量非常广泛 (直播间)

核心定义与对比

Redis vs Memcached 核心对比

表格

特性 Redis Memcached
数据结构 字符串、哈希、列表、集合、有序集合、GEO、Stream 仅字符串
持久化 RDB+AOF 双持久化 不支持,重启数据丢失
分布式 主从、哨兵、集群原生支持 仅客户端分片
功能 Lua 脚本、发布订阅、事务、Pipeline 仅 get/set
  • 补充说明:2012 年移动互联网爆发,滴滴、美团需要实时存储用户位置和订单状态,Redis 凭借高性能成为首选;"买消费习惯" 指平台通过实时行为数据做精准推荐

生活类比 :Redis 是全网共享的智能字典,你可以用一个关键词存任何东西,任何人都能在 1 毫秒内取出来;Memcached 是一次性字典,重启就清空,只能存简单字符串

企业级生产应用:新浪微博用 Redis 存储 10 亿用户的关注 / 粉丝列表,知乎用 Redis 存储文章点赞评论数,GitHub 用 Redis 做任务队列

进阶优化空间:使用 Pipeline 批量执行命令,减少网络往返;使用 Lua 脚本实现复杂原子操作,避免并发问题

课后防宕机指南

错误现象:Redis 和 Memcached 数据不一致

  • 原因:同时使用两个缓存层,数据更新不同步
  • 排查思路:统一使用 Redis 作为唯一缓存层,下线 Memcached

2.2 Redis 特性

  • 速度快: 10W QPS, 基于内存,C 语言实现
  • 单线程
  • 持久化
  • 支持多种数据结构
  • 支持多种编程语言
  • 功能丰富:支持 Lua 脚本,发布订阅,事务,pipeline 等功能 (内存有多大,功能就有多丰富)
  • 简单:代码短小精悍 (单机核心代码只有 23000 行左右), 单线程开发容易,不依赖外部库,使用简单
  • 主从复制
  • 支持高可用和分布式

get set sadd hget get del get get Redis

单线程为何如此快?

  • 纯内存
  • 非阻塞
  • 避免线程切换和静态消耗

特性底层解析

  • 速度快:单节点 QPS 10 万 +,延迟 < 1ms,C 语言实现比 Java 快 10 倍,内存访问速度是硬盘的 100 万倍
  • 单线程:核心命令执行单线程(6.0 + 引入多线程 IO,仅用于网络解析),无锁竞争,避免线程切换开销
  • 持久化:RDB(内存快照)适合备份,AOF(追加日志)适合数据恢复,生产环境推荐混合持久化
  • 多种数据结构:几乎覆盖所有业务场景,String 存缓存,Hash 存用户信息,List 做队列,Set 做去重,ZSet 做排行榜

单线程快的底层原理

  1. 纯内存操作:所有数据存在内存,无磁盘 IO
  2. 非阻塞 IO:epoll 多路复用,一个线程处理 10 万 + 网络连接
  3. 无锁设计:单线程不需要加锁,避免锁竞争和上下文切换

生活类比 :Redis 单线程就像世界上最快的收银员,一个人处理 10 万个顾客结账,因为他只做结账这一件事,不用和别人抢收银台;多线程就像多个收银员抢一个收银台,反而因为排队变慢

企业级生产应用:秒杀系统用 Redis 单线程原子性实现库存扣减,避免超卖;用发布订阅实现订单状态实时通知

进阶优化空间:开启 Redis 6.0 + 多线程 IO,网络处理能力提升 2 倍;使用 CPU 亲和性,将 Redis 进程绑定到固定核心

课后防宕机指南

错误现象:Redis 单线程 CPU 100%,所有命令超时

  • 原因:执行了慢查询或删除了大 key
  • 排查思路:查看慢查询日志,用redis-cli --bigkeys扫描大 key

2.3 Redis 应用场景

  • Session 共享:常见于 web 集群中的 Tomcat 或者 PHP 中多 web 服务器 session 共享
  • 缓存:数据查询、电商网站商品信息、新闻内容
  • 计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景
  • 微博 / 微信社交场合:共同好友,粉丝数,关注,点赞评论等
  • 消息队列:ELK 的日志缓存、部分业务的订阅发布系统
  • 地理位置:基于 GEO (地理信息定位), 实现摇一摇,附近的人,外卖等功能 (实时)

App Server cache Storage

场景修正与解析

  • 原文修正:"sefso 共享" → "session 共享";"5 商品信息" → "商品信息";"点质评论" → "点赞评论";"息定位)" → "地理信息定位)";"附近大" → "附近的人"
  • 场景逐点解析:
    1. Session 共享:Web 集群中多个服务器共享用户登录状态,避免重复登录
    2. 缓存:最核心场景,减少数据库查询压力,响应速度从 100ms 降到 1ms
    3. 计数器:INCR/DECR 原子操作,适合访问量、点赞数、库存统计
    4. 社交场景:Set 存关注 / 粉丝列表,交集算共同好友,ZSet 做排行榜
    5. 消息队列:List 或 Stream 实现简单队列,适合日志收集和异步任务
    6. 地理位置:GEO 存储经纬度,计算距离,查找附近的人 / 商家

生活类比

  • Session 共享:游乐园通票,任何入口都能进
  • 缓存:把常用书放书桌,不用每次去书架找
  • 计数器:超市收银台计数器,每结一笔加 1
  • 地理位置:地图软件找附近餐厅

企业级生产应用:淘宝用 Redis 存商品库存,微信用 Redis 实现附近的人,抖音用 Redis 做实时排行榜

进阶优化空间:Session 用 Hash 结构存储,设置过期时间自动清理;消息队列用 Stream 实现消费者组,保证消息不丢失

课后防宕机指南

错误现象:用户频繁掉线,Session 失效

  • 原因:Redis 连接池耗尽或 Session 过期时间过短
  • 排查思路:检查 Redis 连接数,调整 Session 过期时间

2.4 缓存的实现流程

数据更新操作流程

写数据 写 mysal 写成功 删除 redis 对应项 写失败返回

数据读操作流程

未读到数据返回 读数据 读 redis 未读到数据 读 mysql 读到数据 读到数据 返回数据 获取数据 写 reds 返回数据

流程修正与解析

  • 原文修正:"写 mysal" → "写 MySQL";"写 reds" → "写 Redis"
  • Cache-Aside 模式(旁路缓存) :这是企业级最常用的缓存模式
    1. 更新流程:先写数据库,再删缓存(不是更新缓存),避免并发脏数据
    2. 读取流程:先读缓存,命中直接返回;未命中读数据库,写入缓存后返回
  • 为什么删缓存而不是更新缓存?两个线程同时更新数据时,更新缓存会导致脏数据;删除缓存是最简单安全的方式

生活类比:缓存更新就像图书馆借书系统,你借了一本书(更新数据),先在系统登记(写 MySQL),然后把书架上的书拿走(删缓存);下次有人借,先看书架(读 Redis),没有就去仓库找(读 MySQL),找到后放回书架(写 Redis)

企业级生产应用:所有电商、新闻、社交平台都使用 Cache-Aside 模式

进阶优化空间:使用延迟双删(更新数据库后,先删缓存,延迟 1 秒再删一次)解决并发脏数据;用 Canal 监听 binlog 自动更新缓存

课后防宕机指南

错误现象:用户看到旧数据,缓存和数据库不一致

  • 原因:更新流程先删缓存再写数据库,或缓存删除失败
  • 排查思路:检查更新流程顺序,添加缓存删除重试机制

三 Redis 的安装

部署三台主机:

一. 安装依赖

bash 复制代码
[root@redis-node1 ~]# dnf install make gcc initscripts -y

二. 源码编译redis

bash 复制代码
[root@redis-node1 ~]# wget https://download.redis.io/releases/redis-7.4.8.tar.gz
[root@redis-node1 ~]# tar zxf redis-7.4.8.tar.gz
[root@redis-node1 ~]# cd redis-7.4.8/
[root@redis-node1 redis-7.4.8]#
[root@redis-node1 redis-7.4.8]# make && make install
​
[root@redis-node1 redis-7.4.8]# cd utils/
[root@redis-node1 utils]# vim install_server.sh
#bail if this system is managed by systemd
#_pid_1_exe="$(readlink -f /proc/1/exe)"
#if [ "${_pid_1_exe##*/}" = systemd ]
#then
#       echo "This systems seems to use systemd."
#       echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!"
#       exit 1
#fi
​
[root@redis-node1 utils]# ./install_server.sh
[root@redis-node1 utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
​
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] /etc/redis/redis.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server]
Selected config:
Port           : 6379
Config file    : /etc/redis/redis.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
​
[root@redis-node1 utils]# systemctl status redis_6379.service
​
[root@redis-node2 utils]# systemctl daemon-reload
[root@redis-node2 utils]# systemctl status redis_6379.service
○ redis_6379.service - LSB: start and stop redis_6379
     Loaded: loaded (/etc/rc.d/init.d/redis_6379; generated)
     Active: inactive (dead)
       Docs: man:systemd-sysv-generator(8)
​
[root@redis-node2 utils]# systemctl start redis_6379.service
[root@redis-node2 utils]# systemctl status redis_6379.service
● redis_6379.service - LSB: start and stop redis_6379
     Loaded: loaded (/etc/rc.d/init.d/redis_6379; generated)
     Active: active (exited) since Sun 2026-03-08 15:24:18 CST; 8s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 35637 ExecStart=/etc/rc.d/init.d/redis_6379 start (code=exited, status=0/SUCCESS)
        CPU: 1ms
​
[root@redis-node2 utils]# netstat -antlpe | grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      0          76854      35530/redis-server
tcp6       0      0 ::1:6379                :::*                    LISTEN      0          76855      35530/redis-server
​

官方下载地址:http://download.redis.io/releases/

以 7 为主:

表格

版本选择解释

  • 原文修正:"D Index o/eleses C download redisio/releases" → "Index of /releases/- download.redis.io/releases";"262 月发布 8.6. 正稳定版" → "2026 年 2 月发布 8.0.6 正式稳定版";"大 / 新目" → "大型项目 / 新项目";"内大降" → "内存占用大幅下降";"热健" → "热键"
  • 版本选择建议:
    • 生产环境优先 Redis 6.2.x,稳定性最高,生态最成熟
    • 新项目选 Redis 7.4.x,性能提升 30%,内存占用减少 20%
    • Redis 8.x 目前快速迭代,仅用于测试环境

生活类比:Redis 版本就像汽车型号,6.2.x 是经典款,皮实耐用跑长途;7.4.x 是新款,配置高性能好;8.x 是概念车,技术先进但未经过市场检验

企业级生产应用:阿里云、腾讯云托管 Redis 主流版本是 6.2.x 和 7.0.x,企业自建集群也使用这两个版本

进阶优化空间 :编译时使用make MALLOC=jemalloc,内存碎片减少 50%;开启 CPU 亲和性,性能提升 15%

课后防宕机指南

错误现象:下载源码失败,提示 "404 Not Found"

3.1 rpm 包方式安装

复制代码
[root@redis-node1 ~]# dnf install redis -y

正在更新 Subscription Management 软件仓库。
无法读取客户身份
This system is not registered with an entitlement server. You can use "rhc" or "subscription-manager" to register.
上次元数据过期检查:0:01:14 前,执行于 2024年08月05日 星期一 13时30分23秒。
依赖关系解决。
软件包
架构 大小
版本
仓库
安装:
redis
x86_64
6.2.7-1.el9
AppStream
1.3 M
事务概要
安装 1 软件包

总计:1.3 M
安装大小:4.7 M
核心代码逐行解析
  1. dnf install redis -y
    • 底层动作 :调用 RHEL9 的 DNF 包管理器,从 AppStream 仓库搜索 redis 包,自动解决所有依赖(jemalloc、libatomic 等),下载并安装 redis-6.2.7-1.el9.x86_64.rpm;-y自动确认所有提示
    • 作用 :一键安装 Redis,自动生成配置文件/etc/redis/redis.conf、日志目录/var/log/redis、数据目录/var/lib/redis和 systemd 服务
    • 坑点(Gotchas)
  • 系统仓库版本极旧(RHEL9 自带 6.2.7,最新是 7.4.8),生产环境不推荐
  • 默认监听127.0.0.1,无法远程访问,必须修改bind参数
  • 服务名是redis,不是源码安装的redis_6379
生活类比

RPM 安装就像买成品电脑,开箱即用,厂家组装好所有硬件软件,适合新手和快速测试

企业级生产应用

仅用于测试环境和小型非核心业务;千万级并发的生产环境必须源码安装,性能比 RPM 高 30% 以上

进阶优化空间
  • 安装后立即修改/etc/redis/redis.conf,设置bind 内网IPrequirepass 强密码
  • 开启开机自启:systemctl enable --now redis
  • 配置防火墙:firewall-cmd --add-port=6379/tcp --permanent && firewall-cmd --reload
课后防宕机指南
  1. 错误:Failed to start redis.service: Unit not found
    • 原因:Redis 未安装成功或服务名错误
    • 排查:rpm -qa | grep redis检查是否安装,确认服务名是redis
  2. 错误:Connection refused
    • 原因:Redis 仅监听本地或防火墙未开放端口
    • 排查:netstat -antlpe | grep redis查看监听地址,firewall-cmd --list-ports检查防火墙

3.2 源码安装

!WARNING 在一台主机中不能即用 rpm 安装也用源码安装

复制代码
#解压源码包
[root@redis-node1 ~]# tar zxf redis-7.4.0.tar.gz
[root@redis-node1 ~]# ls
redis-7.4.0 redis-7.4.0.tar.gz

#安装编译工具
[root@redis-node1 redis-7.4.0]# dnf install make gcc initscripts-10.11.6-1.el9.x86_64 -y

#执行编译命令
[root@redis-node1 redis-7.4.0]# make
[root@redis-node1 redis-7.4.0]# make install

#启动Redis
[root@redis-node1 redis-7.4.0]# cd utils/
[root@redis-node1 utils]# ./install_server.sh

Welcome to the redis service installer
This script will help you easily set up a running redis server
This systems seems to use systemd. #提示系统使用的是systemd的初始化方式
Please take a look at the provided example service unit files in this directory, 
and adapt and install them. Sorry!

# 解决报错问题
[root@redis-node1 utils]# vim install_server.sh

#bail if this system is managed by systemd
#_pid_1_exe="$(readlink -f /proc/1/exe)"
#if [ "${_pid_1_exe##*/}" = systemd ]
#then
# echo "This systems seems to use systemd."
# echo "Please take a look at the provided example service unit files in 
# this directory, and adapt and install them. Sorry!"
# exit 1
#fi

[root@redis-node1 utils]# ./install_server.sh

Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379] #端口号
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] #配置文件
Selected default - /etc/redis/6379.conf 
Please select the redis log file name [/var/log/redis_6379.log] #日志
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] #数据目录
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server] #命令路径
Selected config:
Port           : 6379
Config file    : /etc/redis/6379.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!

#配置redis
[root@redis-node1 utils]# vim /etc/redis/6379.conf
bind * 

[root@redis-node1 utils]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...

[root@redis-node1 utils]# netstat -antlpe | grep redis
0 0 0.0.0.0:6379 0.0.0.0:*               LISTEN      0          67267      38417/redis-server
tcp6       0      0 :::6379                 :::*                    LISTEN      0          67268      38417/redis-server

#查看信息
[root@redis-node1 utils]# redis-cli
127.0.0.1:6379> info
核心代码逐行解析
  1. [!WARNING] 在一台主机中不能即用rpm安装也用源码安装

    • 底层动作:两种安装方式会生成不同的配置文件、服务文件和二进制文件,同时安装会导致端口冲突、服务冲突和数据不一致
    • 坑点 :如果之前用 RPM 安装过,必须完全卸载:dnf remove redis -y && rm -rf /etc/redis /var/lib/redis /var/log/redis
  2. tar zxf redis-7.4.0.tar.gz

    • 底层动作:调用 tar 命令解压 gzip 压缩包,生成 redis-7.4.0 目录,包含所有源代码、配置文件和工具脚本
    • 参数z=gzip 压缩,x= 解压,f= 指定文件名
  3. dnf install make gcc initscripts-10.11.6-1.el9.x86_64 -y

    • 底层动作 :安装编译依赖:
      • make:执行 Makefile 编译指令
      • gcc:C 语言编译器,将源码编译为二进制
      • initscripts:提供 SysV init 支持,install_server.sh 必须依赖
    • 坑点:RHEL9 默认不安装 initscripts,必须指定版本安装,否则脚本报错
  4. make && make install

    • 底层动作
      • make:在 src 目录编译生成 redis-server、redis-cli 等二进制文件
      • make install:将二进制文件复制到/usr/local/bin,实现全局调用
    • 进阶优化make MALLOC=jemalloc CFLAGS="-O3 -march=native",针对当前 CPU 优化,性能提升 30%
    • 坑点:未安装 gcc 会提示 "gcc: command not found",编译失败
  5. ./install_server.sh 报错解决

    • 底层原因:Redis 7.4.0 的 install_server.sh 默认不支持 systemd,检测到 systemd 后直接退出
    • 解决原理:注释掉 systemd 检测代码,强制生成 SysV init 脚本,systemd 会通过 sysv-generator 自动转换为 systemd 服务
    • 坑点:必须注释整个 if 语句块,不能只注释 exit 1,否则会有残留提示
  6. 脚本交互配置

    • 端口:默认 6379,不建议修改,除非多实例部署
    • 配置文件:/etc/redis/6379.conf,每个实例对应一个配置文件
    • 日志文件:/var/log/redis_6379.log,记录运行日志和错误
    • 数据目录:/var/lib/redis/6379,存储 RDB/AOF 持久化文件
  7. vim /etc/redis/6379.conf 添加 bind *

    • 底层动作 :修改 Redis 监听地址,bind *表示监听所有网络接口
    • 坑点
      • 默认bind 127.0.0.1 -::1,仅监听本地,无法远程访问
      • 生产环境绝对不能用bind *,必须绑定具体内网 IP,如bind 192.168.1.100
      • 必须设置requirepass 强密码,否则会被黑客入侵挖矿
  8. /etc/init.d/redis_6379 restart

    • 底层动作:重启 Redis 服务,加载新的配置文件
    • 作用:使 bind 配置生效
  9. netstat -antlpe | grep redis

    • 底层动作:查看系统网络连接,过滤 Redis 监听端口
    • 输出解读0.0.0.0:6379表示监听所有 IPv4 地址,:::6379表示监听所有 IPv6 地址
  10. redis-cli && info

    • 底层动作:启动命令行客户端连接本地 Redis,执行 info 命令查看运行状态(版本、内存、连接数、持久化等)
    • 作用:验证 Redis 安装成功并正常运行
生活类比

源码安装就像自己组装电脑,你可以选择最好的硬件(编译参数),定制需要的功能(模块),性能比成品电脑好很多,但需要一定技术能力

企业级生产应用

千万级并发的大型生产环境必须源码安装,支持多实例部署,一台服务器可运行多个 Redis 实例,充分利用多核 CPU 和大内存

进阶优化空间
  • 配置内存限制:maxmemory 8G,避免 OOM
  • 开启混合持久化:aof-use-rdb-preamble yes,兼顾性能和数据安全
  • 配置慢查询日志:slowlog-log-slower-than 10000,记录执行超过 10ms 的命令
课后防宕机指南
  1. 错误:This systems seems to use systemd. Please take a look at the provided example service unit files...
    • 原因:install_server.sh 检测到 systemd
    • 解决:注释脚本中的 systemd 检测代码块
  2. 错误:(error) NOAUTH Authentication required
    • 原因:Redis 设置了密码但连接时未提供
    • 解决:redis-cli -a 你的密码 或 进入 cli 后执行auth 你的密码

安装实验

一。安装依赖

bash 复制代码
[root@redis-node1 ~]# dnf install make gcc initscripts -y

二。源码编译 redis

bash 复制代码
[root@redis-node1 ~]# wget https://download.redis.io/releases/redis-7.4.8.tar.gz
[root@redis-node1 ~]# tar zxf redis-7.4.8.tar.gz
[root@redis-node1 ~]# cd redis-7.4.8/
[root@redis-node1 redis-7.4.8]# make && make install
[root@redis-node1 redis-7.4.8]# cd utils/
[root@redis-node1 utils]# vim install_server.sh
复制代码
#bail if this system is managed by systemd 不让安装那就注释掉
#_pid_1_exe="$(readlink -f /proc/1/exe)"
#if [ "${_pid_1_exe##*/}" = systemd ]
#then
# echo "This systems seems to use systemd."
# echo "Please take a look at the provided example service unit files in 
# this directory, and adapt and install them. Sorry!"
# exit 1
#
#fi
bash 复制代码
[root@redis-node1 utils]# ./install_server.sh
bash 复制代码
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] 
/etc/redis/redis.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server]
Selected config:
Port           : 6379
Config file    : /etc/redis/redis.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
bash 复制代码
[root@redis-node1 utils]# systemctl status redis_6379.service
[root@redis-node2 utils]# systemctl daemon-reload
[root@redis-node2 utils]# systemctl status redis_6379.service
bash 复制代码
○ redis_6379.service - LSB: start and stop redis_6379
     Loaded: loaded (/etc/rc.d/init.d/redis_6379; generated)
     Active: inactive (dead)
       Docs: man:systemd-sysv-generator(8)
bash 复制代码
[root@redis-node2 utils]# systemctl start redis_6379.service
[root@redis-node2 utils]# systemctl status redis_6379.service
bash 复制代码
● redis_6379.service - LSB: start and stop redis_6379
     Loaded: loaded (/etc/rc.d/init.d/redis_6379; generated)
     Active: active (exited) since Sun 2026-03-08 15:24:18 CST; 8s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 35637 ExecStart=/etc/rc.d/init.d/redis_6379 start (code=exited, status=0/SUCCESS)
      CPU: 1ms
bash 复制代码
[root@redis-node2 utils]# netstat -antlpe | grep redis
复制代码
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      0          76854      35530/redis-server
tcp6       0      0 :::6379                 :::*                    LISTEN      0          76855      35530/redis-server

17225254.10oo) 会适服务器工具 4 会话查看X服务器工具设置发帮助 4 免看 0 Y 松伴息 由 
 717225254206 2
SCRIPTPATH=$(dirname $SCRIPT)

 
-f["$(id-u)"-ne0];then #check for root user acho "You must run this seript as root. Sorry!"
fi
 
echo -Please take a look a th provided l srice it fils i this irctory,and t a
nd install them.Sorry!
fi exit 1
unset pidl exe

/systeml
17225251006)

8
 
212 1722525420 
SCRIPPTH$(dirname $SCRIPT)

 
echo
 #check for root user -f["$(id -u)"-ne0];then ocho "You must run this script as root. Sorry!"
fi
 
#
unset pid l exe

76,1 22%

实验补充解释

  • 原文修正:"17225254.10oo)" → "172.25.254.100";"会适服务器工具" → "会话服务器工具";"acho" → "echo";"seript" → "script";"srice it fils" → "service unit files";"irctory" → "directory";"SCRIPPTH" → "SCRIPTPATH";"ocho" → "echo"
  • 关键步骤说明:
    • systemctl daemon-reload:重新加载 systemd 配置,识别新生成的 redis_6379.service
    • 输出显示 Redis 默认仅监听127.0.0.1,必须修改bind参数才能远程访问
  • 脚本片段解析:
    • SCRIPTPATH=$(dirname $SCRIPT):获取脚本所在目录
    • if [ "$(id -u)" -ne 0 ]; then ... fi:检查是否为 root 用户,非 root 用户无法安装服务

企业级生产应用:这是 Redis 集群节点的标准安装流程,生产环境用 Ansible 批量部署,避免人工错误

进阶优化空间:使用 systemd 原生服务文件代替 SysV 脚本,管理更方便;配置日志轮转,避免日志占满磁盘

课后防宕机指南

  1. 错误:Active: inactive (dead)
    • 原因:Redis 服务未启动
    • 解决:systemctl start redis_6379.service
  2. 错误:Permission denied
    • 原因:非 root 用户执行 install_server.sh
    • 解决:切换到 root 用户或使用 sudo

四 Redis 的基本操作

基础命令列表

  • config get 查看配置
  • select 1 选择数据库
  • flushdb 清空当前数据库
  • flushall 清空所有数据库
  • move key 1 移动 key
  • del key 删除
  • rename oldkey newkey 改名
  • expire key 10 设置过期时间
  • persist key 设置持久化
  • keys user 查询
  • exists key 判断是否存在

命令示例与逐行解析

1. 查看配置
bash 复制代码
127.0.0.1:6379[1]> CONFIG GET bind
1) "bind"
2) "* -::*"

127.0.0.1:6379[1]> CONFIG GET *
  • 底层动作 :从 Redis 内存中读取配置参数,CONFIG GET *返回所有 300 + 配置项
  • 作用:无需重启即可查看运行时配置
  • 坑点CONFIG GET只能查看,修改需要用CONFIG SET(临时生效)或修改配置文件重启(永久生效)
2. 写入和读取数据
bash 复制代码
127.0.0.1:6379> SET name lee
OK
127.0.0.1:6379> GET name
"lee"

127.0.0.1:6379> set name lee ex 5
OK
127.0.0.1:6379> get name
"lee"
# 5秒后再次执行
127.0.0.1:6379> get name
(nil)
  • 底层动作
    • SET name lee:在内存中创建键name,值为lee,类型为 String
    • SET name lee ex 5:同时设置过期时间 5 秒,5 秒后 key 自动删除
    • GET name:从内存中读取name的值,不存在返回nil
  • 坑点:SET 会覆盖任何类型的已有 key,不管原来是什么类型
  • 企业级应用:最常用的缓存命令,90% 的 Redis 操作都是 GET/SET
3. 查看所有 key
bash 复制代码
#如果没有设定数据过期时间会一直存在, /var/lib/redis/6379/dump.rdb内存快照中
127.0.0.1:6379> set name lee
OK
127.0.0.1:6379> KEYS * #查看所有key
1) "name"
  • 底层动作 :遍历 Redis 所有 key,返回匹配*的结果
  • 坑点生产环境绝对禁止使用KEYS * ,当 key 超过 10 万时会阻塞单线程,导致服务宕机;必须用SCAN命令迭代遍历
4. 选择数据库
bash 复制代码
#选择数据库 redisa中有0-15个数据库
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get name
(nil)

127.0.0.1:6379> select 0
OK
127.0.0.1:6379> select 16
(error) ERR DB index is out of range
  • 底层动作:切换到指定数据库,Redis 默认 16 个独立数据库(0-15),数据不共享
  • 坑点:Redis Cluster 不支持多数据库,只能用 db0;生产环境建议只用 db0,用 key 前缀区分业务
5. 移动数据
复制代码
127.0.0.1:6379> set name lee
OK
127.0.0.1:6379> MOVE name 1
(integer) 1
127.0.0.1:6379> GET name
(nil)

127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get name
"lee"
  • 底层动作:将 key 从当前数据库移动到目标数据库,目标库存在同名 key 则失败
  • 坑点:Redis Cluster 不支持 MOVE 命令
6. 改变键名
复制代码
127.0.0.1:6379[1]> RENAME name id
OK
127.0.0.1:6379[1]> get name
(nil)
127.0.0.1:6379[1]> get id
"lee"
  • 底层动作 :将name改名为id,如果id已存在会覆盖
  • 坑点 :覆盖会导致数据丢失,生产环境用RENAMENX(仅当 newkey 不存在时改名)
7. 设置过期时间
复制代码
127.0.0.1:6379> set name lee ex 10000
OK
127.0.0.1:6379> get name
"lee"

127.0.0.1:6379> EXPIRE name 3
(integer) 1
# 3秒后
127.0.0.1:6379> get name
(nil)
  • 底层动作:为 key 设置过期时间,单位秒;过期后通过惰性删除 + 定期删除机制清理
  • 坑点:修改 key 会重置过期时间;过期删除不是实时的,可能有少量过期 key 残留
8. 删除 key
复制代码
127.0.0.1:6379> set name lee
OK
127.0.0.1:6379> get name
"lee"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
  • 底层动作:同步删除 key,释放内存
  • 坑点 :删除大 key(百万元素的 Hash/Set)会阻塞单线程;生产环境用UNLINK异步删除大 key
9. 持久化保存

运行

复制代码
127.0.0.1:6379> PERSIST name
(integer) 0
  • 底层动作:移除 key 的过期时间,变为永久有效
  • 返回值:成功返回 1,key 不存在或无过期时间返回 0
10. 判断 key 是否存在
复制代码
127.0.0.1:6379> EXISTS name
(integer) 1
127.0.0.1:6379> EXISTS lee
(integer) 0
  • 底层动作:检查 key 是否存在于内存中
  • 返回值:存在返回 1,不存在返回 0
11. 清空当前库
复制代码
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> GET name
(nil)
  • 底层动作:原子删除当前数据库所有 key
  • 坑点 :执行极快,一旦执行无法恢复;生产环境必须禁用,配置文件中添加rename-command FLUSHDB ""
12. 清空所有库
复制代码
127.0.0.1:6379[1]> FLUSHALL
OK
  • 底层动作:原子删除所有数据库所有 key,比 FLUSHDB 更危险
  • 坑点 :生产环境必须禁用,配置文件中添加rename-command FLUSHALL ""

生活类比

Redis 基本操作就像字典的使用方法

  • SET:添加词条,关键词是 key,解释是 value
  • GET:根据关键词查解释
  • DEL:删除词条
  • EXPIRE:给词条设有效期,过期自动撕掉
  • SELECT:换另一本字典
  • FLUSHDB:撕掉一本字典的所有页

企业级生产应用

这些是 Redis 最基础的命令,所有业务都在使用;千万级并发场景下,用 MSET/MGET 批量操作代替单个命令,减少网络往返

进阶优化空间

  • SET key value EX seconds NX实现分布式锁,原子性保证
  • INCR实现原子计数器,避免并发问题
  • SCAN代替KEYS遍历 key,不阻塞服务

课后防宕机指南

  1. 错误:(error) WRONGTYPE Operation against a key holding the wrong kind of value
    • 原因:对非 String 类型的 key 执行 GET,或对 String 执行 HGET
    • 排查:用TYPE key查看 key 类型,使用对应命令操作
  2. 错误:Redis 服务卡顿,所有命令超时
    • 原因:执行了KEYS *或删除了大 key
    • 排查:查看慢查询日志,紧急情况下重启 Redis(会丢失未持久化数据)
相关推荐
zincsweet14 小时前
进程间通信入门:匿名管道的使用、阻塞场景与避坑指南
linux
向日的葵00614 小时前
Redis后端分布式与高并发架构演进
redis·分布式·架构
闪电悠米14 小时前
黑马点评-优惠券秒杀-01_redis_global_id
数据库·redis·缓存
坚果的博客14 小时前
AtomCode 助力开源鸿蒙跨平台三方库生态共建
华为·开源·harmonyos
张小姐的猫14 小时前
【Linux】多线程实战 —— 日志类 | 策略模式
linux·运维·服务器·c++·bash·策略模式
GitCode官方14 小时前
《开源友的聊》第二季,回来了。
人工智能·开源·atomgit
学点程序15 小时前
HyperFrames:用 HTML 生成视频的开源渲染框架
前端·开源·html·音视频
qq_4523962315 小时前
第七篇:《Docker 存储:Volume、Bind Mount 与 tmpfs》
运维·docker·容器
love8888_cnsd15 小时前
Git & Linux 速查表
java·linux·git·后端·elasticsearch