Skip to content
第 1 章 ⏱ 10 分钟阅读

第 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-alpine

macOS / 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 会阻塞,生产禁用

动手练习 ​

  1. 用 Docker 启动 Redis,redis-cli ping 验证连通
  2. 写一个 UserCache 类,提供 save(userId, name) 和 get(userId),过期 10 分钟
  3. 观察 redis-cli KEYS "*" 和 redis-cli TTL user:profile:1001 的输出

下一章:第 2 章:Redis 数据结构 →

本站基于 VitePress 构建 · 由 StackHub 团队维护