平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“Redis基础篇之特性、采用场景与配置指南”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
一、Redis 是什么
理解这一步时,Redis(Remote Dictionary Server,远程字典服务)是一个开源的、基于内存的 key-value 型(键值对)NoSQL 数据库在这个场景下,。它把主要数据放在内存中操作,读写速度极快,同时提供丰富的数据结构、持久化、复制和集群能力,在分布式系统中被广泛用作缓存、计数器、排行榜、消息队列、分布式锁等。
二、Redis 的八大特性
2.1 速度快
Redis 单机可达十万级 QPS,原因有四个,不能只归因于"内存":
- 纯内存操作:数据主要在内存中,读写是纳秒/微秒级,比 SSD/磁盘快几个数量级;
- C 语言实现:离操作系统近、运行时开销小;
- 核心命令单线程 + IO 多路复用:这是最容易被误解的一点;
- 高效的数据结构:SDS、跳表、字典、压缩列表等都针对场景做了优化。
为什么单线程反而快
Redis 的命令执行(操作内存数据的核心逻辑)一直是单线程,这非但不是瓶颈,反而是优势:
- 单条命令都是内存操作,执行时间极短,瓶颈通常在网络 IO 和内存带宽,而不是 CPU,单核都用不满;
- 单线程没有锁竞争、没有上下文切换、没有竞态问题,数据结构也无需加锁;
- 配合 IO 多路复用(Linux 下 epoll)+ Reactor 模型在这个场景下,,单线程能够同时管理海量连接:连接没数据时不阻塞、有数据时才处理,不会因为某条连接卡住而等待。
版本演进
| 版本 | 时间 | 重要变化 |
|---|---|---|
| 早期 | — | 命令处理单线程模型 |
| 3.0 | 2015 | 引入 Redis Cluster 集群(分片),不是多线程 |
| 4.0 | 2017 | RDB+AOF 混合持久化、PSYNC2、部分后台线程(异步删除) |
| 5.0 | 2018 | 新增 Stream 数据类型 |
| 6.0 | 2020 | 引入网络 IO 多线程(处理 socket 读写和协议解析),但命令执行仍然是单线程;RESP3 |
| 7.0 | 2022 | Functions、多部分 AOF 等 |
6.0 的多线程只负责网络读写与协议解析,真正执行命令、改内存数据的依旧是单线程,所以采用层面仍然不需考虑命令并发安全。
2.2 基于键值对的数据结构服务器
理解这一步时,现在几乎所有语言都有字典类型(Java 的 Map、Python 的 dict、C++ 的 unordered_map)。Redis 的 key 永远是字符串,value 不仅能够是字符串,还能够是具体的数据结构,这是它比普通键值数据库强大的地方。
五种基本数据类型:
| 类型 | 说明 |
|---|---|
| String | 字符串(最基础,可存文本、数字、二进制) |
| Hash | 哈希(field-value 映射,适合存对象) |
| List | 列表(双向链表,适合消息、时序) |
| Set | 集合(无序、不重复,兼容交并差集) |
| ZSet | 有序集合(每个元素带 score,按分数排序,适合排行榜) |
在基础类型上衍生/扩展的能力:
- Bitmap(位图):不是独立类型,而是在 String 上的按位操作,适合签到、在线状态、布尔统计;
- HyperLogLog:用来基数统计(去重计数,如 UV),占用极小空间,有极小误差;
- Geo:地理位置,底层基于 ZSet;
- Stream(5.0+):类似消息队列的消息流结构。
2.3 功能丰富
- Lua 脚本:把多条命令打包成一个脚本原子执行(整个脚本执行期间不会被其他命令插入),还能实现复杂逻辑;
- 事务(
MULTI/EXEC)、发布订阅(Pub/Sub)、键过期(EXPIRE)、管道(Pipeline)等。
2.4 轻松稳定
结合项目来看,核心代小、逻辑集中;单线程模型避免了大量同时发 Bug,长期运行稳定。
2.5 多语言客户端
理解这一步时,几乎所有主流语言(Java、Python、C/C++、Go、PHP、Node.js 等)都有成熟的 Redis 客户端库,调用轻松。
2.6 持久化
数据放内存,断电就有丢失风险,Redis 提供两种持久化:
| 方式 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| RDB | 某一时刻的内存快照(bgsave fork 子进程生成紧凑二进制) | 文件小、恢复快,适合备份/灾备 | 可能丢失最后一次快照之后的数据 |
| AOF | 追加记录每一条写命令(文本日志) | 数据更安全 | 文件大、恢复慢;刷盘策略 always/everysec(默认)/no |
| 混合持久化(4.0+) | AOF 重写时前半段是 RDB 快照、后半段是增量命令 | 兼顾恢复速度与安全性 | 格式混合 |
2.7 主从复制
一个主节点(master)可把数据同步到多个从节点(replica):
- 首次同步走全量复制(主节点生成 RDB 发给从节点 + 复制缓冲区补增量);
- 之后走增量复制(复制积压缓冲区 + PSYNC);
- 作用:数据冗余、读写分离(读扩展)、高可用基础。
- 注意:主从复制每个节点都存一份完整数据,不增加总容量(和 MySQL 读写分离同理)。
2.8 高可用与分布式
- Sentinel(哨兵):在主从基础上做坚控、通知和自动故障转移(主挂了自动把从提升为主),解决"主节点单点故障",但不增加容量;
- Redis Cluster(分布式集群):3.0 引入,把数据按 16384 个哈希槽() 分片到多个主节点,每个主节点可有自己的从节点;不同节点存不同数据,从而横向扩展总容量和吞吐。
理解这一步时,Sentinel 解决"高可用",Cluster 解决"容量/分片",二者目标不同。
三、Redis 的典型用途
- 缓存:MySQL 存全量数据,Redis 存热数据(二八原则),最主流用途;
- 排行榜:ZSet 按分数天然有序;
- 计数器:String 的
INCR原子自增(点攒、浏览量、库存); - 社交网络:Set 做共同好友/标签、ZSet 做粉丝排序;
- 消息队列:List 阻塞弹出、Stream、Pub/Sub;
- 其他补充:分布式锁(
SET key value NX PX)、限流、Geo 附近的人、会话缓存(Session)等。
四、Redis 在 Ubuntu 上的安装部署
在这个场景下,Redis 官方不直接兼容 Windows(Windows 上可用 WSL 或第三方移植版),生产环境一律用 Linux。Ubuntu 上:
# 1. 搜索(真正的服务包名是 redis-server)
sudo apt update
apt search redis-server
# 2. 安装
sudo apt install redis-server
# 3. 查看版本
redis-server --version
redis-cli --version
# 4. 服务管理(systemd)
sudo systemctl status redis-server
sudo systemctl restart redis-server
# 5. 验证端口(默认 6379);没有 netstat 可装 net-tools,或用 ss
sudo ss -nltp | grep 6379
# 等价于:sudo netstat -nltp | grep redis
# 6. 用客户端连接并测试
redis-cli
127.0.0.1:6379> ping
PONG
关键信息:
- 默认端口 6379;
- 设置文件:
/etc/redis/redis.conf(默认绑定127.0.0.1,只能本机访问,远程访问需改 bind 同时设置密码/防火墙); - 理解这一步时,若要外部主机访问,建议将protected-mode从yes 设置为 no
- 服务进程名
redis-server,交互客户端redis-cli。
五、Linux 软件包管理知识体系(apt / dpkg / .deb / wget)
5.1 软件源(repository)是什么
软件源就是 apt 去下载软件包的"仓库服务器",里面存放软件包和包的索引清单。Ubuntu 的源地址设置在:
/etc/apt/sources.list(主设置)/etc/apt/sources.list.d/*.list(第三方源,通常放这里)
两个常用命令:
sudo apt update:只刷新源里的包索引清单(让系统知道有哪些包、最新版本是什么),不安装/升级;sudo apt upgrade:按最新索引,升级已安装的软件。
5.2 wget 和 apt 没有关系
wget 只是一个非交互式网络下载工具落到代码里,(名字来自 World Wide Web + get),兼容 HTTP/HTTPS/FTP,兼容断点续传(-c)、递归下载(-r)等。它的作用是"把文件下载下来",不负责安装、不处理依赖。
典型组合:先用 wget 把一个 .deb 下载到本地,再用 dpkg/apt 安装。
5.3 .deb 到底是什么
一个 .deb 解开后主要有三部分:
| 内容 | 作用 |
|---|---|
debian-binary | deb 格式版本号 |
data.tar.xz | 真正的文件内容:编译好的可执行程序、库、设置、文档,安装时按目录结构释放到 /usr/bin、/etc、/usr/lib 等位置 |
control.tar.xz | 控制信息:control(包名、版本、架构、依赖 Depends、描述)、校验和、安装/卸载脚本(pre/post inst/rm) |
5.4 dpkg 与 apt 的关系(关键)
- dpkg:底层包管理工具,能直接安装本地
.deb,但不会自动下载和解决依赖:sudo dpkg -i xxx.deb # 安装本地 deb,缺依赖会报错
sudo apt -f install # 自动补装缺失依赖,修复安装
dpkg -l # 列出已安装的包
dpkg -L 包名 # 查看该包安装了哪些文件 - apt(apt-get):构建在 dpkg 之上的高层包管理器,它会从软件源下载目标包及其所有依赖,再交给 dpkg 依次安装,自动解决依赖关系。
类比:dpkg 像"手动安装器"(只装你给的这一个包),apt 像"应用商店"(自动找源、连依赖一起装)。
5.5 为什么装 MySQL 时要"先去官网找源"
理解这一步时,Ubuntu 默认源里的 MySQL 版本往往滞后,而且不少版本默认源提供的是 MariaDB(MySQL 的分支)。想要官方最新版,需先添加 MySQL 官方源:
- 在 MySQL 官网拿到
mysql-apt-config_版本_all.deb,可用 wget 下载到服务器; - 安装这个设置包,它会往
/etc/apt/sources.list.d/写入官方源地址:wget [https://repo.mysql.com/mysql-apt-config_0.8.x_all.deb](https://repo.mysql.com/mysql-apt-config_0.8.x_all.deb)
sudo dpkg -i mysql-apt-config_0.8.x_all.deb # 只是配置源 - 刷新索引并从官方源安装:
sudo apt update
sudo apt install mysql-server
这里
.deb充当"源设置器",真正的 mysql-server 之后由 apt 从官方源拉取。
六、核心总结
- Redis 是基于内存的 key-value NoSQL,快的原因是纯内存 + C 实现 + 单线程命令处理配合 epoll IO 多路复用 + 高效数据结构。
- 核心命令始终单线程;3.0 引入的是 Cluster 集群,6.0 才引入网络 IO 多线程(命令执行仍单线程)。
- 五种基本类型:String、Hash、List、Set、ZSet理解这一步时,;Bitmap 是 String 上的位操作,另有 HyperLogLog、Geo、Stream。
- 持久化:RDB(快照、快、可能丢数据)、AOF(命令日志、安全、慢)、4.0+ 混合持久化。
- 主从复制做读写分离和冗余;Sentinel 做自动故障转移(高可用,不增容量);Cluster 用 16384 个槽分片(扩展容量)。
- Ubuntu 安装:
apt install redis-server,默认端口 6379,设置文件/etc/redis/redis.conf,客户端redis-cli。 - Linux 包管理:理解这一步时,apt 是高层工具(自动依赖、从源下载),dpkg 是底层工具(装本地 .deb,不自动解依赖);.deb 是归档包(内含 data 文件 + control 依赖信息),不是可执行程序;wget 只是下载工具,与 apt 无关。
在这个场景下,总的来说,redis教程适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。

