基于黑马点评项目写的笔记
一、初识Redis
1.1 什么是NoSQL
| 对比项 | 关系型数据库(SQL) | 非关系型数据库(NoSQL) |
|---|---|---|
| 数据结构 | 结构化,表结构固定 | 非结构化,灵活松散 |
| 关联关系 | 有关联(外键) | 无关联 |
| 查询方式 | SQL语句 | 特定API |
| 事务支持 | 支持 | 部分支持 |
1.2 Redis简介
-
全称:Remote Dictionary Server(远程词典服务器)
-
特点:
- 基于内存的键值型NoSQL数据库
- 使用C语言开发
- 读写速度极快(毫秒级延迟,每秒百万级读写)
- 支持多种数据结构
- 支持持久化
二、Redis数据结构与命令
2.1 五大基本数据类型
| 数据类型 | 说明 | 典型场景 |
|---|---|---|
| String | 字符串,最基本类型 | 缓存、计数器、分布式锁 |
| Hash | 哈希,键值对集合 | 存储对象信息 |
| List | 列表,双向链表 | 消息队列、最新列表 |
| Set | 集合,无序去重 | 好友关系、共同关注 |
| SortedSet | 有序集合,带分数 | 排行榜 |
2.2 常用命令
1. 通用命令:
查看所有key ----- KEYS *
删除key ----- DEL key
判断key是否存在 ----- EXISTS key
设置过期时间(秒) ----- EXPIRE key
查看剩余过期时间 ----- TTL key
2. String命令:二进制安全,可存储任何数据
设置值 ----- SET key value
获取值 ----- GET key
设置值+过期时间 ----- SET key value EX seconds
自增 1 ----- INCR key
自增指定数值 ----- INCRBY key 数值
3. Hash命令:存储对象,比String更节省空间;可单独修改字段,无需整体序列化
设置字段值 ----- HSET key field value
获取字段值 ----- HGET key field
获取所有字段值 ----- HGETALL key
删除字段 ----- HDEL key field
4. List命令:有序、可重复、头尾操作O(1)
左/右插入 ----- LPUSH/RPUSH key value
左/右弹出 ----- LPOP/RPOP key
获取所有元素 ----- LRANGE key 0 -1
5. Set命令:无序、去重、支持集合运算
添加成员 ----- SADD key member
获取所有成员 ----- SMEMBERS key
求交集 ----- SINTER key1 key2
求并集 ----- SUNION key1 key2
6. SortedSet命令:有序、去重、每个元素关联一个分数
添加成员及分数 ----- ZADD key score member
获取前10名(倒序) ----- ZREVRANGE key 0 9
删除成员 ----- ZREM key member
三、Redis的Java客户端
3.1 客户端类型对比
| 客户端 | 特点 | 使用场景 |
|---|---|---|
| Jedis | 经典,API直接对应Redis命令 | 早期项目 |
| Lettuce | 现代化,基于Netty,支持异步 | SpringBoot默认 |
| Redisson | 分布式服务封装,功能丰富 | 分布式锁等高级功能 |
| SpringDataRedis | 对以上封装,提供RedisTemplate | 推荐 |
3.2 SpringDataRedis使用
引入依赖:
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.13.6</version>
</dependency>
配置文件:
redis:
host: localhost
port: 6379
password:
lettuce:
pool:
max-active: 10
max-idle: 10
min-idle: 1
time-between-eviction-runs: 10s
database: 1
四、RedisTemplate 和 StringRedisTemplate是何方神圣?
在 Spring Boot 整合 Redis 时,RedisTemplate 和 StringRedisTemplate 是最常见的两个工具类。很多人刚开始觉得它们只是名字不同,但真正的核心差异其实是:序列化和反序列化策略不同。
1. 特点
- RedisTemplate:更通用,可以操作任意对象,但一定要重视序列化/反序列化问题。
- StringRedisTemplate:继承RedisTemplate,专门面向字符串场景,默认更适合日常业务开发。
2. 为什么要关注序列化和反序列化?
Redis 底层只能存储二进制数据,也就是 byte。
所以 Java 中的对象、字符串、数字,写入 Redis 之前都要先进行序列化(如果不进行序列化则会出现乱码);读取出来以后,还要再进行反序列化。
- 序列化:Java 对象 -> Redis 可存储的字节数据
- 反序列化:Redis 字节数据 -> Java 对象
3. RedisTemplate 的特点
RedisTemplate 是一个通用模板,支持操作各种类型的数据,比如:
@Autowired
private RedisTemplate<String, Object> redisTemplate;
它的优点是灵活,什么都能存(Object),但它也有一个很常见的问题:如果你不自己配置序列化器,默认序列化结果通常并不友好。
比如你直接存一个对象:
redisTemplate.opsForValue().set("user:1", user);
虽然程序可能能正常运行,但 Redis 中的数据往往不是清晰可读的 JSON,而是一串不直观的二进制内容。所以使用 RedisTemplate 时,一定要重点考虑序列化器配置。
4. StringRedisTemplate 的特点
StringRedisTemplate 本质上可以理解为:RedisTemplate<String, String>
它专门对字符串做了封装,适合存验证码、存token、存缓存JSON等
// user对象序列化
String json = JSON.toJSONString(user);
// 存Redis
stringRedisTemplate.opsForValue().set("cache:user:1", json);
.
.
.
// 从Redis拿数据
String json = stringRedisTemplate.opsForValue().get("cache:user:1");
// 反序列化
User user = JSON.parseObject(json, User.class);