一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Redis基础篇之特性、使用场景与配置指南实用指南

时间:2026-10-17 08:34:01 编辑:袖梨 来源:一聚教程网

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“Redis基础篇之特性、采用场景与配置指南”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

一、Redis 是什么

理解这一步时,Redis(Remote Dictionary Server,远程字典服务)是一个开源的、基于内存的 key-value 型(键值对)NoSQL 数据库在这个场景下,。它把主要数据放在内存中操作,读写速度极快,同时提供丰富的数据结构、持久化、复制和集群能力,在分布式系统中被广泛用作缓存、计数器、排行榜、消息队列、分布式锁等。

二、Redis 的八大特性

2.1 速度快

Redis 单机可达十万级 QPS,原因有四个,不能只归因于"内存":

  1. 纯内存操作:数据主要在内存中,读写是纳秒/微秒级,比 SSD/磁盘快几个数量级;
  2. C 语言实现:离操作系统近、运行时开销小;
  3. 核心命令单线程 + IO 多路复用:这是最容易被误解的一点;
  4. 高效的数据结构:SDS、跳表、字典、压缩列表等都针对场景做了优化。

为什么单线程反而快

Redis 的命令执行(操作内存数据的核心逻辑)一直是单线程,这非但不是瓶颈,反而是优势:

  • 单条命令都是内存操作,执行时间极短,瓶颈通常在网络 IO 和内存带宽,而不是 CPU,单核都用不满;
  • 单线程没有锁竞争、没有上下文切换、没有竞态问题,数据结构也无需加锁;
  • 配合 IO 多路复用(Linux 下 epoll)+ Reactor 模型在这个场景下,,单线程能够同时管理海量连接:连接没数据时不阻塞、有数据时才处理,不会因为某条连接卡住而等待。

版本演进

版本时间重要变化
早期—命令处理单线程模型
3.02015引入 Redis Cluster 集群(分片),不是多线程
4.02017RDB+AOF 混合持久化、PSYNC2、部分后台线程(异步删除)
5.02018新增 Stream 数据类型
6.02020引入网络 IO 多线程(处理 socket 读写和协议解析),但命令执行仍然是单线程;RESP3
7.02022Functions、多部分 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-binarydeb 格式版本号
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教程适合结合实际项目边做边理解。先抓住核心思路,再逐步补上细节和边界处理,最后效果会更稳定,也更容易复用。

热门栏目