第 1 章:Redis 入门
学习目标
- 理解 Redis 是什么、为什么快
- 安装并启动 Redis 服务
- 掌握 String、Hash、List 三种基础数据结构
- 用 Spring Boot 连接 Redis
一、Redis 是什么
Redis(Remote Dictionary Server)是一个基于内存的键值数据库,支持多种数据结构(String、Hash、List、Set、ZSet),常用于:
- 缓存(减轻数据库压力)
- 排行榜(ZSet)
- 分布式锁
- 计数器(原子自增)
- 限流、消息队列
二、安装 Redis
Windows
bash
# 方法 1:WSL2(推荐)
wsl --install # 启用 WSL
wsl # 进入 Linux 子系统
sudo apt install redis-server # 安装
redis-server # 启动(默认 6379 端口)
# 方法 2:Docker
docker run -d -p 6379:6379 --name redis redis:7-alpinemacOS / Linux
bash
# macOS
brew install redis
redis-server
# Ubuntu/Debian
sudo apt install redis-server
sudo systemctl start redis三、验证与基础命令
bash
redis-cli ping # 期望返回 PONG,说明连接成功
redis-cli SET name "tom"
redis-cli GET name # "tom"
redis-cli DEL name
redis-cli EXISTS name # 0(已删除)⚠️ 坑 1:Redis 默认无密码,只在本地访问没问题;上生产/暴露公网必须设密码:
requirepass yourpassword。 ⚠️ 坑 2:redis-server启动后是前台进程,Ctrl+C 就停了。要后台运行用redis-server --daemonize yes或&。
四、为什么 Redis 这么快
| 特性 | 说明 |
|---|---|
| 内存读写 | 不走磁盘,ns 级响应 |
| 单线程执行 | 避免锁竞争和上下文切换 |
| IO 多路复用 | epoll 模型处理高并发连接 |
| C 语言实现 | 接近底层,无虚拟机开销 |
⚠️ 坑 3:Redis 6.0 后 IO 读取多线程化,但命令执行仍是单线程 —— 所以慢命令会阻塞所有请求(
KEYS *、FLUSHDB在大库里要禁用)。
五、Spring Boot 整合 Redis
引入依赖
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>配置(application.yml)
yaml
spring:
redis:
host: 127.0.0.1
port: 6379
password: # 无密码留空
timeout: 2000ms # ⚠️ 坑 4:单位是 Duration,写 2000 会报转换错误
lettuce:
pool:
max-active: 8 # 连接池最大数
max-idle: 8
min-idle: 0注入使用
java
@Service
public class UserCache {
@Autowired
private StringRedisTemplate redis; // StringRedisTemplate = key/value 都是 String
public void save(Long userId, String name) {
redis.opsForValue().set("user:" + userId, name, Duration.ofMinutes(30));
}
public String get(Long userId) {
return redis.opsForValue().get("user:" + userId);
}
}⚠️ 坑 5:
RedisTemplate<String, Object>默认用 JDK 序列化,key 会带\xac\xed前缀,人类不可读。建议直接用StringRedisTemplate+ 手动 JSON 序列化。
六、Key 设计规范
text
业务名:数据类型:业务ID
例:
user:profile:1001
order:detail:20240101001
sms:code:13800138000- 用
:分层,便于按前缀扫描 - 不要用过长 key(占内存、影响查找)
- 统一命名,避免
user_1001和u:1001并存
七、过期时间
java
// 设置 30 分钟过期
redis.opsForValue().set("token:abc", "xxx", Duration.ofMinutes(30));
// 查看剩余 TTL(秒)
Long ttl = redis.getExpire("token:abc", TimeUnit.SECONDS);⚠️ 坑 6:
EXPIRE只能设在已存在的 key 上;新建 key 直接SET key value EX 30一步到位,避免中间无过期窗口。
八、本章小结
| 要点 | 关键 |
|---|---|
| Redis 定位 | 基于内存的 KV 数据库,支持丰富数据结构 |
| 启动方式 | 本地 redis-server 或 Docker |
| 连接命令 | redis-cli ping 验证 |
| Spring 整合 | spring-boot-starter-data-redis + StringRedisTemplate |
| Key 规范 | 业务:类型:ID,冒号分层 |
| 慢命令 | KEYS *、FLUSHDB 会阻塞,生产禁用 |
动手练习
- 用 Docker 启动 Redis,
redis-cli ping验证连通 - 写一个
UserCache类,提供save(userId, name)和get(userId),过期 10 分钟 - 观察
redis-cli KEYS "*"和redis-cli TTL user:profile:1001的输出
下一章:第 2 章:Redis 数据结构 →