初识 Redis
1. Redis 是什么
Section titled “1. Redis 是什么”Redis(Remote Dictionary Server) 是一个开源的基于内存的键值型数据库,由 Salvatore Sanfilippo 开发,现由 Redis Ltd. 维护。它将数据存储在内存中,支持持久化到磁盘,兼顾了极高的读写性能与数据安全性。
Redis 的三种主要用途:
| 用途 | 说明 | 典型场景 |
|---|---|---|
| 缓存 | 将热点数据存入内存,减少数据库压力 | 商品详情、用户信息缓存 |
| 分布式存储 | 跨服务共享状态数据 | Session 共享、分布式锁 |
| 消息队列 | 利用 List/Stream 实现轻量级队列 | 异步任务、发布订阅 |
2. Redis vs Memcached
Section titled “2. Redis vs Memcached”Redis 和 Memcached 都是基于内存的缓存中间件,但定位有明显差异:
| 对比项 | Redis | Memcached |
|---|---|---|
| 数据类型 | String / Hash / List / Set / ZSet 等 | 仅 String |
| 持久化 | 支持 RDB + AOF | ❌ 不支持 |
| 集群 | 原生集群 + 哨兵 | 客户端分片 |
| 原子操作 | 支持事务、Lua 脚本 | 仅单命令原子 |
| 发布订阅 | ✅ 支持 | ❌ 不支持 |
| 性能 | 单线程模型,约 10 万 QPS | 多线程,高并发略优 |
| 适用场景 | 缓存 + 丰富业务场景 | 纯高性能缓存 |
3. 核心概念
Section titled “3. 核心概念”3.1. 整体架构
Section titled “3.1. 整体架构”Client ──▶ Redis Server(单线程事件循环) │ ├── 内存数据库(所有数据) │ ├── db[0] key-value pairs │ ├── db[1] ... │ └── db[15] │ ├── 持久化模块(RDB / AOF) │ └── 复制模块(主从 / 哨兵 / 集群)3.2. 数据类型一览
Section titled “3.2. 数据类型一览”Redis 数据类型├── 基础类型│ ├── String → 字符串、数字、二进制│ ├── Hash → 字段-值的映射(类似 Java HashMap)│ ├── List → 有序可重复列表(双端队列)│ ├── Set → 无序不重复集合│ └── ZSet → 有序不重复集合(按 score 排序)│└── 高级类型 ├── Bitmap → 位图,适合签到、状态标记 ├── HyperLogLog → 基数统计(UV 统计) ├── Geo → 地理坐标,支持距离计算 └── Stream → 消息流,支持消费者组3.3. 单线程模型
Section titled “3.3. 单线程模型”Redis 的命令执行是单线程的(6.0 后网络 I/O 引入多线程,但命令执行仍单线程),这是它高性能的关键之一:
客户端请求 ──▶ I/O 多路复用(epoll)──▶ 事件队列 ──▶ 单线程执行命令 │ 无锁、无上下文切换 约 10 万 QPS4. 环境搭建(Docker)
Section titled “4. 环境搭建(Docker)”4.1. docker-compose.yml
Section titled “4.1. docker-compose.yml”version: '3'services: redis: image: redis:7.0 container_name: redis ports: - "6379:6379" command: redis-server --requirepass 123456 --appendonly yes volumes: - redis_data:/data
volumes: redis_data:4.2. 启动
Section titled “4.2. 启动”docker-compose up -d4.3. 验证
Section titled “4.3. 验证”# 进入容器docker exec -it redis redis-cli -a 123456
# 测试连通性ping # → PONG
# 基本读写SET hello "Redis" # → OKGET hello # → "Redis"
# 查看服务信息INFO server5. SpringBoot 快速接入
Section titled “5. SpringBoot 快速接入”5.1. 添加依赖
Section titled “5.1. 添加依赖”<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- 连接池(推荐) --><dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId></dependency>5.2. application.yml 配置
Section titled “5.2. application.yml 配置”spring: data: redis: host: localhost port: 6379 password: 123456 database: 0 # 使用第 0 号数据库 lettuce: pool: max-active: 8 # 最大连接数 max-idle: 8 # 最大空闲连接 min-idle: 0 # 最小空闲连接 max-wait: 100ms # 获取连接最大等待时间5.3. 快速验证
Section titled “5.3. 快速验证”@Autowiredprivate StringRedisTemplate stringRedisTemplate;
@Testpublic void testRedis() { stringRedisTemplate.opsForValue().set("hello", "Redis"); String value = stringRedisTemplate.opsForValue().get("hello"); System.out.println(value); // → Redis}6. 核心概念速查
Section titled “6. 核心概念速查”| 概念 | 一句话总结 |
|---|---|
| 内存数据库 | 数据存内存,读写速度约为磁盘的 100 倍 |
| 单线程执行 | 命令串行执行,无锁,约 10 万 QPS |
| 持久化 | RDB 快照 + AOF 日志,保证重启不丢数据 |
| 过期机制 | 惰性删除 + 定期删除,到期不立即清理 |
| 主从复制 | 数据同步到 Slave,实现读写分离 |
| 哨兵 / 集群 | 高可用方案,自动故障转移 |