文章目录
- [一、Redis 是什么?](#一、Redis 是什么?)
-
- [1. 基本定义](#1. 基本定义)
- [2. 内存与持久化](#2. 内存与持久化)
- [3. 支持的数据结构 & 存储模型](#3. 支持的数据结构 & 存储模型)
- [二、Redis 的数据类型详解](#二、Redis 的数据类型详解)
- [三、Redis 常见使用场景](#三、Redis 常见使用场景)
- [四、Java(或 Spring Boot)操作 Redis](#四、Java(或 Spring Boot)操作 Redis)
- [五、Redis vs 传统关系型数据库 / NoSQL 对比](#五、Redis vs 传统关系型数据库 / NoSQL 对比)
一、Redis 是什么?
1. 基本定义
- Redis 是一个开源的内存型键-值(key-value)数据库/数据结构存储系统。
- 全称为 Remote Dictionary Server(远程字典服务)。
- 它由 C 语言编写、遵守 BSD 许可,支持网络访问。
- 与传统关系型数据库不同,Redis 是 NoSQL 数据库 --- 不使用表/行/列模型,也不支持 SQL 查询,而是通过键(key)直接访问对应的值(value)。
2. 内存与持久化
- Redis 的 "驻数据" 默认存储在内存中。由于内存访问远快于磁盘读写,这赋予了 Redis 非常高的读写性能和低延迟。
- 同时 Redis 支持将数据持久化到磁盘 --- 即使服务重启,也能将数据恢复/重载。
- 这种"内存 + 可选持久化"的机制,使 Redis 在兼顾速度和数据安全性之间取得了平衡。
3. 支持的数据结构 & 存储模型
Redis 不只是简单的 key → string,它支持丰富的数据结构:包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set / Zset)等。这些数据结构使得 Redis 在处理复杂数据时,也能保持高性能与灵活性。
每一个存储对象都对应一个 "key" 和 "value" 的键值对。key 通常是字符串(也可以是任意二进制序列),Redis 使用高效的哈希来定位对应 value。
二、Redis 的数据类型详解
下面是 Redis 中常用的数据类型,以及它们适合的应用场景 ------
| 数据类型 | 描述 / 适用场景 |
|---|---|
| String | 最基础的数据类型,适合存储文本、数字、序列化后的 JSON/对象/Token 等。 |
| Hash(Hash-map / dictionary) | 用于存储对象/结构化数据,比如用户信息、配置项,能高效按字段访问子属性。 |
| List(列表) | 有序的元素集合,适合消息队列(queue)、任务队列、日志队列、简单流水线等。 |
| Set(集合) | 无序且元素唯一,适合存储标签集合、不重复元素集合、交并集计算等。 |
| Sorted Set(有序集合 / Zset) | 每个元素关联一个"分数(score)",根据分数排序。适合排行榜、按时间排序、优先队列等场景。 |
底层实现上,Redis 使用不同的数据结构(如哈希表、跳跃表、压缩表、快速链表等)来支持这些类型以兼顾性能与内存使用效率。
Redis 还提供对键空间(keyspace)的管理能力:key 可以设置"过期时间"(TTL, time-to-live),过期后自动删除 --- 这对缓存、会话管理、限时数据非常有用。
三、Redis 常见使用场景
- 缓存(Cache):将频繁访问的数据缓存在 Redis 中,以减少对主数据库(如 MySQL、PostgreSQL 等)的压力,加速响应速度。
- 会话/Session 存储:Web 应用中用户登录状态、Session 信息、临时数据等,可存储在 Redis,提升访问速度并简化横向扩展。
- 消息队列 / 任务队列 / 发布-订阅(Pub/Sub):利用 Redis 的 List、Pub/Sub、Stream(在新版本中)等机制,实现异步任务、事件通知、实时消息推送等功能。
- 排行榜 / 排序 / 计数 / 统计:Sorted Set(有序集合)非常适合做排行榜、分数排序、频率统计(如点赞数、访问量排行榜等)。
- 实时分析 / 实时状态存储:当需要处理大量快速读写、实时更新状态、实时统计时,Redis 的内存速度优势十分明显。
- 微服务 / 分布式系统中共享缓存或共享状态:在分布式系统中,各服务之间可以共享 Redis,用于共享配置、状态、限流、分布式锁等。
四、Java(或 Spring Boot)操作 Redis
java
// 示例基于 Jedis
import redis.clients.jedis.Jedis;
public class RedisDemo {
public static void main(String[] args) {
// 连接本地 Redis 服务(默认端口 6379)
try (Jedis jedis = new Jedis("localhost", 6379)) {
String key = "user:1001:profile";
// 存储字符串
jedis.set(key, "{\"name\":\"Alice\",\"age\":30}");
// 设置过期时间(秒)
jedis.expire(key, 3600);
// 获取
String profile = jedis.get(key);
System.out.println("Profile: " + profile);
// 使用 Hash 存储结构化信息
String userHash = "user:1002";
jedis.hset(userHash, "name", "Bob");
jedis.hset(userHash, "age", "25");
System.out.println("Name: " + jedis.hget(userHash, "name"));
System.out.println("Age: " + jedis.hget(userHash, "age"));
// 列表 --- 简单队列
String listKey = "job_queue";
jedis.lpush(listKey, "task1");
jedis.lpush(listKey, "task2");
String task = jedis.rpop(listKey);
System.out.println("Pop task: " + task);
}
}
}
这个例子展示了使用字符串、Hash、List 三种数据结构,也体现了 Redis 的核心思想 ------ 用 key-value(或结构化 value) + 内存 + 过期机制 + 多种数据类型,快速、高效地存储和获取数据。
五、Redis vs 传统关系型数据库 / NoSQL 对比
| 项目 | Redis | 传统关系型数据库(如 MySQL)/文档型数据库(如 MongoDB) |
|---|---|---|
| 存储方式 | 内存优先 + 可持久化 | 通常以磁盘为主 |
| 数据模型 | 键值 / 数据结构(String、Hash、List、Set、Zset ...) | 表格 / 文档 / 行列 / JSON / BSON |
| 访问速度 / 延迟 | 极快,适合高并发 / 低延迟场景 | 相对较慢,适合复杂查询和事务管理 |
| 查询能力 | 仅通过 key/命令访问,缺乏复杂查询(如 SQL、join、复杂过滤) | 支持 SQL、MQL、复杂查询、多表/集合关联/聚合等 |
| 使用场景 | 缓存、会话存储、实时计数、排行榜、队列、临时数据 | 结构化存储、关系数据、复杂查询、交易型操作、持久化存储 |
因此,Redis 更适合"对速度要求高、结构不复杂、以 key-value 为主 "的场景;对于"数据结构复杂、关系多、需要复杂查询和事务"的场景,传统数据库/文档数据库更合适。许多系统会将 Redis 与传统数据库配合使用:Redis 做缓存/临时存储/高频访问数据,主数据库负责持久化和复杂查询。