目录
[一 关系型数据库和 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 内存上限;开启客户端缓存,进一步减少网络往返。
课后防宕机指南:
- 错误现象:MySQL 连接数打满,CPU 100%,服务雪崩
- 原因:热数据未写入 Redis,请求直接打穿数据库
- 排查思路:先执行
show processlist查看 MySQL 活跃连接,再检查业务代码的缓存写入逻辑是否在查询后执行
- 错误现象: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 和扩展性。
课后防宕机指南:
- 错误现象:单表查询超时,磁盘 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 简介
中文官网

官网
生活类比: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 做排行榜
单线程快的底层原理:
- 纯内存操作:所有数据存在内存,无磁盘 IO
- 非阻塞 IO:epoll 多路复用,一个线程处理 10 万 + 网络连接
- 无锁设计:单线程不需要加锁,避免锁竞争和上下文切换
生活类比 :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 商品信息" → "商品信息";"点质评论" → "点赞评论";"息定位)" → "地理信息定位)";"附近大" → "附近的人"
- 场景逐点解析:
- Session 共享:Web 集群中多个服务器共享用户登录状态,避免重复登录
- 缓存:最核心场景,减少数据库查询压力,响应速度从 100ms 降到 1ms
- 计数器:INCR/DECR 原子操作,适合访问量、点赞数、库存统计
- 社交场景:Set 存关注 / 粉丝列表,交集算共同好友,ZSet 做排行榜
- 消息队列:List 或 Stream 实现简单队列,适合日志收集和异步任务
- 地理位置: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 模式(旁路缓存) :这是企业级最常用的缓存模式
- 更新流程:先写数据库,再删缓存(不是更新缓存),避免并发脏数据
- 读取流程:先读缓存,命中直接返回;未命中读数据库,写入缓存后返回
- 为什么删缓存而不是更新缓存?两个线程同时更新数据时,更新缓存会导致脏数据;删除缓存是最简单安全的方式
生活类比:缓存更新就像图书馆借书系统,你借了一本书(更新数据),先在系统登记(写 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"
- 原因:版本号错误或网络无法访问 redis.io
- 排查思路:检查下载地址,使用国内镜像站(如https://mirrors.aliyun.com/redis/)
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
核心代码逐行解析
- 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 的 DNF 包管理器,从 AppStream 仓库搜索 redis 包,自动解决所有依赖(jemalloc、libatomic 等),下载并安装 redis-6.2.7-1.el9.x86_64.rpm;
- 系统仓库版本极旧(RHEL9 自带 6.2.7,最新是 7.4.8),生产环境不推荐
- 默认监听
127.0.0.1,无法远程访问,必须修改bind参数 - 服务名是
redis,不是源码安装的redis_6379
生活类比
RPM 安装就像买成品电脑,开箱即用,厂家组装好所有硬件软件,适合新手和快速测试
企业级生产应用
仅用于测试环境和小型非核心业务;千万级并发的生产环境必须源码安装,性能比 RPM 高 30% 以上
进阶优化空间
- 安装后立即修改
/etc/redis/redis.conf,设置bind 内网IP和requirepass 强密码 - 开启开机自启:
systemctl enable --now redis - 配置防火墙:
firewall-cmd --add-port=6379/tcp --permanent && firewall-cmd --reload
课后防宕机指南
- 错误:
Failed to start redis.service: Unit not found- 原因:Redis 未安装成功或服务名错误
- 排查:
rpm -qa | grep redis检查是否安装,确认服务名是redis
- 错误:
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
核心代码逐行解析
-
[!WARNING] 在一台主机中不能即用rpm安装也用源码安装- 底层动作:两种安装方式会生成不同的配置文件、服务文件和二进制文件,同时安装会导致端口冲突、服务冲突和数据不一致
- 坑点 :如果之前用 RPM 安装过,必须完全卸载:
dnf remove redis -y && rm -rf /etc/redis /var/lib/redis /var/log/redis
-
tar zxf redis-7.4.0.tar.gz- 底层动作:调用 tar 命令解压 gzip 压缩包,生成 redis-7.4.0 目录,包含所有源代码、配置文件和工具脚本
- 参数 :
z=gzip 压缩,x= 解压,f= 指定文件名
-
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,必须指定版本安装,否则脚本报错
- 底层动作 :安装编译依赖:
-
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",编译失败
- 底层动作 :
-
./install_server.sh报错解决- 底层原因:Redis 7.4.0 的 install_server.sh 默认不支持 systemd,检测到 systemd 后直接退出
- 解决原理:注释掉 systemd 检测代码,强制生成 SysV init 脚本,systemd 会通过 sysv-generator 自动转换为 systemd 服务
- 坑点:必须注释整个 if 语句块,不能只注释 exit 1,否则会有残留提示
-
脚本交互配置
- 端口:默认 6379,不建议修改,除非多实例部署
- 配置文件:
/etc/redis/6379.conf,每个实例对应一个配置文件 - 日志文件:
/var/log/redis_6379.log,记录运行日志和错误 - 数据目录:
/var/lib/redis/6379,存储 RDB/AOF 持久化文件
-
vim /etc/redis/6379.conf添加bind *- 底层动作 :修改 Redis 监听地址,
bind *表示监听所有网络接口 - 坑点 :
- 默认
bind 127.0.0.1 -::1,仅监听本地,无法远程访问 - 生产环境绝对不能用
bind *,必须绑定具体内网 IP,如bind 192.168.1.100 - 必须设置
requirepass 强密码,否则会被黑客入侵挖矿
- 默认
- 底层动作 :修改 Redis 监听地址,
-
/etc/init.d/redis_6379 restart- 底层动作:重启 Redis 服务,加载新的配置文件
- 作用:使 bind 配置生效
-
netstat -antlpe | grep redis- 底层动作:查看系统网络连接,过滤 Redis 监听端口
- 输出解读 :
0.0.0.0:6379表示监听所有 IPv4 地址,:::6379表示监听所有 IPv6 地址
-
redis-cli && info- 底层动作:启动命令行客户端连接本地 Redis,执行 info 命令查看运行状态(版本、内存、连接数、持久化等)
- 作用:验证 Redis 安装成功并正常运行
生活类比
源码安装就像自己组装电脑,你可以选择最好的硬件(编译参数),定制需要的功能(模块),性能比成品电脑好很多,但需要一定技术能力
企业级生产应用
千万级并发的大型生产环境必须源码安装,支持多实例部署,一台服务器可运行多个 Redis 实例,充分利用多核 CPU 和大内存
进阶优化空间
- 配置内存限制:
maxmemory 8G,避免 OOM - 开启混合持久化:
aof-use-rdb-preamble yes,兼顾性能和数据安全 - 配置慢查询日志:
slowlog-log-slower-than 10000,记录执行超过 10ms 的命令
课后防宕机指南
- 错误:
This systems seems to use systemd. Please take a look at the provided example service unit files...- 原因:install_server.sh 检测到 systemd
- 解决:注释脚本中的 systemd 检测代码块
- 错误:
(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 脚本,管理更方便;配置日志轮转,避免日志占满磁盘
课后防宕机指南:
- 错误:
Active: inactive (dead)- 原因:Redis 服务未启动
- 解决:
systemctl start redis_6379.service
- 错误:
Permission denied- 原因:非 root 用户执行 install_server.sh
- 解决:切换到 root 用户或使用 sudo
四 Redis 的基本操作
基础命令列表

config get查看配置select 1选择数据库flushdb清空当前数据库flushall清空所有数据库move key 1移动 keydel 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,类型为 StringSET 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,解释是 valueGET:根据关键词查解释DEL:删除词条EXPIRE:给词条设有效期,过期自动撕掉SELECT:换另一本字典FLUSHDB:撕掉一本字典的所有页
企业级生产应用
这些是 Redis 最基础的命令,所有业务都在使用;千万级并发场景下,用 MSET/MGET 批量操作代替单个命令,减少网络往返
进阶优化空间
- 用
SET key value EX seconds NX实现分布式锁,原子性保证 - 用
INCR实现原子计数器,避免并发问题 - 用
SCAN代替KEYS遍历 key,不阻塞服务
课后防宕机指南
- 错误:
(error) WRONGTYPE Operation against a key holding the wrong kind of value- 原因:对非 String 类型的 key 执行 GET,或对 String 执行 HGET
- 排查:用
TYPE key查看 key 类型,使用对应命令操作
- 错误:Redis 服务卡顿,所有命令超时
- 原因:执行了
KEYS *或删除了大 key - 排查:查看慢查询日志,紧急情况下重启 Redis(会丢失未持久化数据)
- 原因:执行了