Redis 服务器全方位介绍:从入门到核心原理
一、什么是 Redis?
Redis(Remote Dictionary Server) 是一个开源的 基于内存的数据结构存储系统,由 Salvatore Sanfilippo(antirez) 于 2009 年开发,目前由 Redis Labs 维护。
它以 高性能、丰富的数据类型、支持持久化 等特性而闻名,被广泛用于缓存、消息队列、排行榜、分布式锁等场景。
简单来说:
Redis 就是一款 “用内存存数据、性能极高、功能超多” 的 NoSQL 数据库。
二、Redis 的特点
| 特点 | 说明 |
|---|---|
| ⚡ 高性能 | 所有数据存储在内存中,读写速度极快(可达每秒十万级操作) |
| 🧱 数据结构丰富 | 支持 String、List、Set、Hash、ZSet 等多种数据类型 |
| 💾 支持持久化 | 可将内存数据持久化到磁盘,防止宕机丢失 |
| 🧩 支持事务 | 支持简单事务操作(MULTI / EXEC) |
| ☁️ 分布式与集群 | 支持主从复制、哨兵模式和集群部署 |
| 🔐 多语言支持 | 提供 Java、Python、C、Go、Node.js 等多语言客户端 |
| 🧠 原子操作 | 所有操作都是原子的,保证数据一致性 |
三、Redis 的应用场景
| 场景 | 说明 |
|---|---|
| 📦 缓存系统 | 最常见的使用方式,加快数据访问速度,减轻数据库压力 |
| 🕒 分布式锁 | 利用 SETNX、EXPIRE 实现高效分布式锁机制 |
| 📈 排行榜 | 借助 ZSet(有序集合)轻松实现游戏排行榜等功能 |
| 📮 消息队列 | 使用 List 或 Stream 实现异步任务队列 |
| 👥 会话共享 | 存储用户 Token、Session,实现分布式登录 |
| ⏳ 限流计数器 | 借助 Redis 的原子自增实现 API 限流控制 |
| 🧾 热点数据统计 | 利用 HyperLogLog、Bitmap 实现高效去重与计数 |
四、Redis 的数据类型详解
1️⃣ String(字符串)
最基础的数据类型,可以存储任意类型的值(数字、文本、JSON 等)。
SET name "xiaoxiang"
GET name
INCR views
用途:计数器、缓存、Session、分布式锁。
2️⃣ Hash(哈希)
适合存储对象数据(类似键值对集合)。
HSET user:1 name "Tom"
HSET user:1 age 25
HGETALL user:1
用途:用户信息、配置对象存储。
3️⃣ List(列表)
有序、可重复的字符串列表,支持从两端插入/弹出。
LPUSH tasks "task1"
LPUSH tasks "task2"
RPOP tasks
用途:消息队列、任务调度。
4️⃣ Set(集合)
无序、不重复的元素集合。
SADD online_users "Tom" "Jack"
SMEMBERS online_users
用途:好友列表、标签系统、唯一性统计。
5️⃣ ZSet(有序集合)
带分值的集合,支持按分数排序。
ZADD rank 100 Tom
ZADD rank 200 Jack
ZRANGE rank 0 -1 WITHSCORES
用途:排行榜、按权重排序的数据。
6️⃣ Bitmap / HyperLogLog / Stream(高级结构)
Bitmap:用于记录二进制状态(如签到统计)。
HyperLogLog:用于快速去重计数。
Stream:Redis 5.0 引入的强大消息流结构,可替代消息队列。
五、Redis 的持久化机制
Redis 虽然是内存数据库,但提供了两种 持久化方式 来保证数据不丢失:
模式 | 说明
------- | -------
RDB(快照) | 定期将数据快照保存到磁盘。适合备份、启动恢复。
AOF(追加文件) | 以日志方式记录每次写操作,宕机后可重放恢复。
常见配置:
save 900 1 # 900 秒内有 1 次修改就触发 RDB
appendonly yes # 开启 AOF 模式
Redis 7.0 之后还引入了 混合持久化(RDB + AOF),结合两者优点,启动更快,数据更安全。
六、Redis 的内存淘汰策略
当 Redis 内存占满时,会触发 淘汰策略(Eviction Policy)。
常见策略如下:
策略 说明
noeviction 默认策略,内存满时报错
allkeys-lru 所有键中淘汰最少使用的键(LRU)
volatile-lru 只淘汰设置了过期时间的键
allkeys-random 所有键中随机淘汰
volatile-ttl 淘汰最早要过期的键
七、Redis 性能优化建议
合理设置过期时间(TTL)
避免内存被长期占用。
使用连接池(JedisPool / Lettuce)
减少连接创建销毁开销。
避免大 Key / 热 Key
单个 Key 过大或高频访问可能造成阻塞。
开启持久化异步刷盘
减少写阻塞风险。
使用 Pipeline 管道批量执行命令
减少网络延迟。
监控命令使用情况
使用 INFO、SLOWLOG 分析性能瓶颈。