- 基础篇:讲解Redis常用数据结构
- 实战篇:黑马点评实战
- 高级篇:Redis高级知识点
- 原理篇:Redis原理
- 面试篇:Redis八股
⭕️第一章:基础篇⭕️
1. Redis介绍
Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样。最重要的是5种基本类型。String, Hash, List, Set和SortedSet。
Redis通用命令:
2. String
String类型,也就是字符串类型,是Redis中最简单的存储类型。
- String
- string: 普通字符串
- int: 整数类型,可以做自增、自减操作
- float: 浮点类型,可以做自增、自减操作
不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m。
String类型常见的命令:
3. Hash
4. List
5. Set
6. SortedSet
7. Redis的Java客户端
7.1 客户端对比
- Spring擅长整合,SpringDataRedis底层既可以用Jedis实现,也可以用Lettuce实现。
- 很多企业喜欢用旧的Jedis
- 如果要实现分布式锁,会用到Redisson
因此,后面主要介绍三种Redis的Java客户端:
- Jedis:传统Redis的Java客户端
- SpringDataRedis: 整合了传统的Jedis和Lettuce
- Redisson:分布式锁使用
7.2 Jedis
7.2.1 Jedis使用的基本步骤
- 引入Jedis依赖
- 创建Jedis对象,建立连接
- 使用Jedis,方法名与Redis命令一致
- 释放资源
(1)创建Maven工程,引入Jedis依赖
<dependencies><!--jedis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version></dependency><!--单元测试--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.7.0</version><scope>test</scope></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-launcher</artifactId><version>1.7.0</version><scope>test</scope></dependency>
</dependencies>
(2)使用Jedis对象操作Redis
package com.heima.test;import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;public class JedisTest {private Jedis jedis;@BeforeEachvoid setUp(){// 1. 建立连接jedis = new Jedis("192.168.31.20", 6379);// 2. 设置密码jedis.auth("123456");// 3. 选择库jedis.select(4);}@Testvoid testString(){// 存入数据String result = jedis.set("name", "xxx");System.out.println("result = " + result);// 获取数据String name = jedis.get("name");System.out.println("name = " + name);}@AfterEachvoid tearDown(){if (jedis != null){jedis.close();}}
}
7.2.2 Jedis的连接池
Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用Jedis连接池代替Jedis的直连方式。
7.3 SpringDataRedis
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:https://spring.io/projects/spring-data-redis
- 提供了对不同Redis客户端的整合(Lettuce和Jedis)
- 提供了RedisTemplate统一API来操作Redis
- 支持Redis的发布订阅模型
- 支持Redis哨兵和Redis集群
- 支持基于Lettuce的响应式编程
- 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
- 支持基于Redis的JDKCollection实现
SpringDataRedis快速入门:
(1)创建SpringBoot项目
创建SpringBoot工程的时候,引入Lombok和Spring Data Redis依赖
(2)引入依赖
注意:spring-boot-starter-data-redis依赖在上一步创建SpringBoot工程时已经引入。
(3)配置文件
spring:data:redis:host: 192.168.31.20port: 6379password: 123456database: 5lettuce:pool:max-active: 8 # 最大连接max-idle: 8 # 最大空闲连接min-idle: 0 # 最小空闲连接max-wait: 100 # 连接等待时间
(4)使用
@SpringBootTest
class RedisSemoApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;@Testvoid testString(){// 写入一条String数据redisTemplate.opsForValue().set("name", "虎");// 获取String数据Object name = redisTemplate.opsForValue().get("name");System.out.println(name);}
}
Java默认采用JdkSerializationRedisSerializer来序列化。
7.3.2 RedisSerializer
- GenericJackson2JsonRedisSerializer:建议value使用该序列化器,将 Java 对象序列化为 JSON 字符串 存入 Redis。
- StringRedisSerializer: 建议key使用该序列化器,直接将
String
编码为 UTF-8 字节流,反向解码也简单。 - JdkSerializationRedisSerializer:使用 Java 原生序序列化机制将对象(
ObjectOutputStream
/ObjectInputStream
)序列化为二进制字节流。
RedisTemplate有两种序列化实践方案:自定义RedisTemplate和使用StringRedisTemplate
7.3.3 自定义RedisTemplate
- key使用string序列化
- value使用json序列化
缺点:
优点:可以直接将Java对象序列化成Json字符串
7.3.4 StringRedisTemplate
缺点:需要手动序列化Java对象为Json字符串
优点:不会带来额外的内存
StringRedisTemplate使用步骤:
@SpringBootTest
class RedisSemoApplicationTests {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Testvoid testString(){// 写入一条String数据stringRedisTemplate.opsForValue().set("name", "虎哥");// 获取String数据Object name = stringRedisTemplate.opsForValue().get("name");System.out.println(name);}private static final ObjectMapper objectMapper = new ObjectMapper();@Testvoid testSaveUser() throws JsonProcessingException {// 创建Java对象User user = new User("小明",18);// 手动序列化对象String jsonUser = objectMapper.writeValueAsString(user);System.out.println(jsonUser);// 写入数据stringRedisTemplate.opsForValue().set("user", jsonUser);// 获取数据String jsonUser1 = stringRedisTemplate.opsForValue().get("user");// 手动反序列化User user1 = objectMapper.readValue(jsonUser1, User.class);System.out.println(user1);}
}
⭕️第二章:实战篇⭕️
0. 项目环境
- MySQL配置
- ip: 192.168.31.20
- port: 3306
- username: mysql_gtc
- password: gtc123
- Redis配置
- ip: 192.168.31.20
- port: 6379
- password: 123456
- 项目后端配置
- ip: localhost(192.168.31.10)
- port: 8081
- 项目前端配置
- ip: 192.168.31.20
- port: 8080