*Redis 简介

Redis(Remote Dictionary Server)是一个开源的高性能键值对存储系统,通常被称为数据结构服务器。它不仅支持简单的字符串,还支持哈希、列表、集合、有序集合、流、位图、HyperLogLog、地理空间等复杂数据类型。

Redis 使用 C 语言开发,遵守 BSD 协议,是互联网技术中使用最为广泛的中间件之一。随着它在新浪微博等大型互联网公司的使用而逐渐风靡国内,也是中高级后端技术开发工程师技术面试过程中最常问到的知识点。


*Redis 的核心定位

角色 说明
内存数据库 数据存储在内存中,读写速度极快(微秒级延迟)
缓存 最常用的场景,缓解数据库压力,提升应用性能
消息代理 Pub/Sub 发布订阅、Stream 流式消息队列
数据结构服务器 9 种核心数据类型,每种都有丰富的原子操作命令

*为什么叫 Redis?

Redis 的全称是 REmote DIctionary Server(远程字典服务器),由意大利开发者 Salvatore Sanfilippo(网名 antirez)于 2009 年创建。antirez 的博客地址是 antirez.com


*Redis 的主要特点

*1. 极致性能

  • 单机 10万+ QPS,内存操作微秒级延迟
  • 采用单线程事件循环模型,避免了多线程上下文切换和锁竞争
  • Redis 6.0+ 引入多线程 IO,网络读写可并行,进一步提升吞吐量

*2. 丰富的数据类型

Redis 支持 9 种核心数据类型,远超传统 key-value 存储:

数据类型 说明 典型场景
String 字符串、整数、浮点数 缓存、计数器、分布式锁、Session
Hash 键值对集合 对象存储、购物车、用户属性
List 双向链表 消息队列、时间线、最新消息
Set 无序唯一集合 标签、共同好友、去重、抽奖
Sorted Set 有序唯一集合 排行榜、延时队列、范围查询
Stream 日志型消息流 消息队列、消费者组、事件溯源
Bitmap 位数组 用户签到、在线状态、布隆过滤器
HyperLogLog 基数估算 UV 统计、大规模去重计数
Geo 地理坐标 附近的人、距离计算、地理位置服务

*3. 持久化支持

Redis 提供了三种持久化方式,确保数据安全:

方式 说明 特点
RDB 定时快照 紧凑的二进制文件,适合备份和恢复
AOF 日志追加 记录每条写命令,数据安全性更高
混合持久化(4.0+) RDB + AOF 重写时先用 RDB 存储全量数据,再追加增量 AOF,兼顾速度和安全性

*4. 高可用与分布式

  • 主从复制:数据复制到多个从节点,实现读写分离和备份
  • Sentinel 哨兵:自动监控、故障检测和主从切换
  • Cluster 集群:16384 个哈希槽分片,支持横向扩展和自动故障转移

*5. 原子操作与脚本

  • 所有命令都是原子执行
  • 支持 Lua 脚本(原子执行复杂逻辑)
  • Redis Functions(7.0+):持久化的服务器端脚本,类似于存储过程

*6. 发布/订阅与消息队列

  • Pub/Sub:实时消息推送,支持模式匹配订阅
  • Stream:可靠的消息流,支持消费者组和消息确认(类似 Kafka)
  • Sharded Pub/Sub(7.0+):集群模式下频道绑定到哈希槽,减少节点间消息传递

*Redis 版本演进

版本 发布时间 重大特性
1.0 2009 初始发布,支持 String、List、Set
2.0 2010 引入 Sorted Set、Pub/Sub、Lua 脚本
2.6 2012 Lua 脚本执行、内置集群支持雏形
2.8 2013 Sentinel 哨兵、Scan 命令、HyperLogLog
3.0 2015 Redis Cluster 正式发布
3.2 2016 Geo 地理空间、Lua 脚本调试器
4.0 2017 混合持久化、模块系统、异步删除
5.0 2018 Stream 数据类型、新的集群总线协议
6.0 2020 多线程 IO、ACL 权限控制、SSL/TLS
6.2 2021 RESP3 协议、新增数十个命令
7.0 2022 Redis Functions、改进 ACL、Sharded Pub/Sub、多部分 AOF
7.2 2023 性能优化、新命令、改进集群稳定性
7.4 2024 哈希表内存优化、新模块 API

*Redis 与其他存储的对比

*vs Memcached

特性 Redis Memcached
数据类型 9 种复杂类型 仅字符串
持久化 RDB + AOF 不支持
集群 原生 Cluster 客户端分片
内存管理 LRU/LFU 淘汰策略 LRU
事务 支持 不支持
发布订阅 支持 不支持
性能 相当 相当

结论:除非极端简单的纯缓存场景,否则优先选择 Redis。

*vs MongoDB

特性 Redis MongoDB
存储介质 内存为主 磁盘为主
数据结构 键值 + 数据结构 文档(BSON)
查询能力 按 Key 和范围查询 复杂查询、聚合、索引
适用场景 缓存、实时计算、消息队列 文档存储、复杂查询、大数据

结论:两者互补。Redis 做缓存和实时层,MongoDB 做持久化文档存储。

*vs Kafka

特性 Redis Stream Kafka
定位 内存消息流 分布式日志系统
持久化 AOF/RDB 磁盘日志
吞吐量 高(单机) 极高(分布式)
消息保留 受内存限制 可长期保留
消费者组 支持 支持
适用场景 实时消息、小队列 大数据流处理、事件溯源

结论:小规模实时消息用 Redis Stream,大规模日志处理用 Kafka。


*Redis 架构

Redis 主要由两个程序组成:

  • Redis 客户端 redis-cli — 命令行工具,用于连接服务器并执行命令
  • Redis 服务器 redis-server — 服务端程序,提供 Redis 服务

客户端和服务器可以位于同一台计算机,也可以分布在两台不同的计算机中,通过网络通信。

*典型部署架构

┌─────────────────────────────────────────┐
│              应用层 (Application)          │
│         ┌─────────┐  ┌─────────┐        │
│         │  App 1  │  │  App 2  │        │
│         └────┬────┘  └────┬────┘        │
└──────────────┼────────────┼─────────────┘
               │            │
         ┌─────┴────────────┴─────┐
         │     Redis Cluster      │
         │  ┌─────┐  ┌─────┐      │
         │  │ M1  │  │ M2  │      │  ← 主节点
         │  └──┬──┘  └──┬──┘      │
         │     │        │        │
         │  ┌──┴──┐  ┌──┴──┐     │
         │  │ S1  │  │ S2  │     │  ← 从节点
         │  └─────┘  └─────┘     │
         └────────────────────────┘

*核心应用场景

场景 数据类型 说明
缓存 String 热点数据缓存,减轻数据库压力
会话存储 Hash / String 分布式 Session,支持过期自动清理
排行榜 Sorted Set 实时排名,支持范围查询和排序
计数器 String 原子 incr/decr,如点赞数、阅读数
分布式锁 String SET key value NX EX seconds
消息队列 List / Stream 异步任务处理、事件驱动架构
实时系统 Pub/Sub 实时推送、在线聊天、股票行情
地理位置 Geo 附近的人、距离计算、地理位置服务
布隆过滤器 Bitmap 海量数据去重判断
限流器 Sorted Set 滑动窗口限流

*快速上手

*安装 Redis

# Ubuntu/Debian
sudo apt-get install redis-server

# macOS
brew install redis

# Docker
docker run -d --name redis -p 6379:6379 redis:latest

*启动服务

redis-server

*连接客户端

redis-cli
127.0.0.1:6379> PING
PONG

*基本操作

# String
127.0.0.1:6379> SET name "Redis"
OK
127.0.0.1:6379> GET name
"Redis"

# Hash
127.0.0.1:6379> HSET user:1 name "Alice" age 25
(integer) 2
127.0.0.1:6379> HGETALL user:1
1) "name"
2) "Alice"
3) "age"
4) "25"

# List
127.0.0.1:6379> LPUSH queue "task1"
(integer) 1
127.0.0.1:6379> RPOP queue
"task1"

*谁在使用 Redis?

Redis 被全球数以万计的公司使用,包括:

  • Twitter — 时间线缓存、实时分析
  • GitHub — 作业队列、会话存储
  • Stack Overflow — 缓存、计数器
  • 新浪微博 — 国内早期大规模采用 Redis 的公司
  • 阿里巴巴 — 电商缓存、秒杀系统
  • 美团 — 地理位置服务、实时推送

*相关资源