一、Redis
1.1 Redis简介
内存优先存储:核心数据存储于内存中,读写速度可达每秒数万至数十万次,延迟低至毫秒级,远超传统磁盘数据库(机械硬盘读写速度仅为内存的千分之一)。
丰富数据结构支持:原生支持字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等基础结构,还提供位图(Bitmap)、地理空间索引(GEO)、流(Stream)等高级类型,覆盖多样业务场景。
多模式兼容:可作为缓存加速查询、数据库存储核心数据、消息队列实现异步通信,还支持发布 / 订阅、事务、Lua 脚本等高级功能,适配复杂业务需求。
持久化机制:提供 RDB(快照式)和 AOF(日志追加式)两种持久化方式,既保证数据安全性,又可灵活平衡性能与完整性。
分布式特性:原生支持主从复制、哨兵模式和集群(Cluster)部署,具备高可用和水平扩展能力,可应对业务增长带来的负载压力。
1.2 Redis 优势
极致性能:内存存储 + 优化的底层实现,单节点可轻松支撑每秒 10 万 + 请求,远超传统数据库,是高并发场景的首选缓存方案(如电商秒杀、直播弹幕计数)。
开发效率高:丰富的数据结构和简洁的命令集,让复杂功能(如排行榜、去重统计)无需额外编码,直接通过 Redis 命令实现(例:用 Sorted Set 实现游戏排行榜)。
灵活的持久化策略:RDB 适合大规模数据备份与快速恢复(如凌晨低峰期快照),AOF 适合数据完整性要求高的场景(如金融交易),也可组合使用兼顾效率与安全。
高可用与扩展性:主从复制实现读写分离,哨兵模式自动故障转移,集群模式支持数据分片,可通过增加节点横向扩展,避免单点故障和性能瓶颈。
跨平台与生态完善:支持 Windows、Linux、macOS 等系统,提供 Java、Python、Go 等多语言客户端,与 Spring、Django 等主流框架无缝集成,社区活跃且版本迭代迅速。
二、Redis 高并发
Redis 之所以能应对高并发场景(如秒杀活动、热点数据查询),核心依赖其优化的架构设计 —— 单线程模型与 I/O 多路复用技术的结合,从根本上解决了高并发下的性能瓶颈。
2.1 原理
Redis 的高并发能力源于 “内存存储 + 高效 I/O 模型” 的双重保障:
内存存储规避磁盘瓶颈:数据直接在内存中读写,无需磁盘 I/O 的机械操作(如磁头寻道),响应速度提升数个数量级,这是高并发的基础。
事件驱动的非阻塞处理:通过 I/O 多路复用技术监听多个客户端连接,将网络 I/O、命令执行等操作转化为事件,按顺序高效处理,避免了传统阻塞 I/O 的等待开销。
精简的执行流程:单线程模型消除了多线程的上下文切换和竞态条件,命令执行无需锁机制,降低了系统复杂度,提升了执行效率。
实际场景中,当数万客户端同时请求 Redis 时,内存存储保证了数据读写的高速,而 I/O 多路复用让 Redis 能同时处理所有连接的读写事件,单线程则确保命令执行的高效有序,三者协同实现高并发处理能力。
2.2 Redis 的单线程
2.2.1 原因
Redis 选择单线程模型的核心逻辑的是 “聚焦性能瓶颈,简化系统设计”:
规避多线程开销:多线程环境下,线程创建、销毁及上下文切换会消耗大量 CPU 资源,尤其在高并发场景下,频繁切换会严重降低系统吞吐量。单线程无需处理线程调度,减少了不必要的开销。
消除竞态条件:多线程操作共享数据时,需通过锁机制保证线程安全,这会增加代码复杂度且可能导致死锁。单线程按顺序执行命令,天然避免了数据竞争问题,无需锁保护。
核心瓶颈非 CPU:Redis 的性能瓶颈主要在网络 I/O 和内存读写,而非 CPU 运算 —— 即使是单线程,也能轻松处理内存中的命令执行(内存操作耗时微秒级),CPU 不会成为限制因素。
2.2.2 优劣势
优势
性能高效:无线程切换和锁开销,命令执行流程简洁,在内存操作为主的场景下,单线程吞吐量优于多线程。
稳定性强:避免了多线程的死锁、数据不一致等问题,系统故障率低,维护成本低。
实现简单:无需设计复杂的线程同步机制,代码逻辑清晰,便于开发和调试。
劣势
无法利用多核 CPU:单线程只能使用一个 CPU 核心,即使服务器配置多核,也无法充分利用硬件资源(Redis 6.0 后通过网络 I/O 多线程弥补这一缺陷)。
阻塞风险:若执行耗时命令(如 KEYS、HGETALL 遍历大数据集),会阻塞整个事件循环,导致所有客户端请求排队等待,影响服务可用性。
CPU 密集型任务不适用:单线程无法并行处理 CPU 密集型操作(如复杂计算),这类任务会占用线程资源,导致响应延迟增加。
2.3 IO 多路复用技术
2.3.1 定义
I/O 多路复用技术是一种高效的 I/O 事件处理机制,允许单个线程同时监听多个文件描述符(如 Socket 连接),当某个文件描述符就绪(可读 / 可写)时,系统会通知应用程序进行处理。Redis 通过该技术实现了 “单线程处理多客户端连接”,是高并发的关键支撑。
2.3.2 核心原理
Redis 的 I/O 多路复用基于操作系统提供的底层接口实现(Linux 用 epoll,BSD 用 kqueue,Solaris 用 /dev/poll),其工作流程如下:
注册事件:Redis 将所有客户端的 Socket 连接对应的文件描述符,注册到操作系统的 I/O 多路复用器中,并指定监听的事件类型(读事件 / 写事件)。
阻塞等待:Redis 的事件循环进入阻塞状态,等待操作系统通知就绪事件(此时不消耗 CPU 资源)。
事件分发:当多个客户端的 Socket 连接就绪(如客户端发送请求数据、Redis 需向客户端返回结果),操作系统会将就绪的文件描述符列表返回给 Redis。
处理事件:Redis 遍历就绪的文件描述符,依次处理对应的 I/O 操作(如读取客户端请求、执行命令、返回结果),处理完成后继续阻塞等待下一批事件。
2.3.3 优势
高并发连接支持:单线程可同时监听数万甚至数十万客户端连接,无需为每个连接创建线程,大幅降低内存占用和系统开销。
非阻塞高效处理:仅在 I/O 事件就绪时才进行处理,避免了传统阻塞 I/O 中 “等待数据” 的时间浪费,提升了 CPU 利用率。
跨平台适配:Redis 封装了不同操作系统的底层 I/O 多路复用接口,保证了跨平台兼容性,同时不影响上层逻辑。
示例:在电商秒杀场景中,10 万用户同时抢购某商品,Redis 通过 I/O 多路复用监听所有用户的连接请求,当用户发送 “查询库存”“下单扣减” 请求时,系统快速响应并处理,避免了连接阻塞导致的超时问题。