[001-03-007].第28节:SpringBoot整合Redis:
6.1.Redis的介绍:
- 1.Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
- 2.它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。
- 3.Redis 内置了 复制(replication),
LUA脚本(Lua scripting)
, LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
6.2.Redis自动配置:
a.修改pom.xml文件,引入依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bjpowernode</groupId>
<artifactId>021-springboot-redis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--redis起步依赖: 直接在项目中使用RedisTemplate(StringRedisTemplate)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
b.自动配置分析:
- 1.如下可知,Redis默认使用的是lettuce客户端,所以说
在程序中使用RedisTemplate类的方法 操作redis数据
,实际就是调用的lettuce 客户端的中的方法
- 2.Redis的自动配置:
- RedisAutoConfiguration 自动配置类。RedisProperties 属性类 -->
spring.redis.xxx
是对redis的配置 - 连接工厂是准备好的。
LettuceConnectionConfiguration
、JedisConnectionConfiguration
自动注入了RedisTemplate<Object, Object>
: xxxTemplate;自动注入了StringRedisTemplate
:k:v都是String- key:value
- 底层只要我们使用 StringRedisTemplate、RedisTemplate就可以操作redis
- RedisAutoConfiguration 自动配置类。RedisProperties 属性类 -->
c.更改配置文件application.properities
,配置redis连接的信息
server.port=9001
server.servlet.context-path=/myredis
#指定redis (host ,ip, password)
spring.redis.host=localhost
spring.redis.port=6379
#spring.redis.password=123
d.创建controller,
package com.bjpowernode.controller;
import com.bjpowernode.vo.Student;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class RedisController {
/**
* 注入RedisTemplate
*
* RedisTemplate 泛型
* RedisTemplate<String,String>
* RedisTemplate<Object,Object>
* RedisTemplate
*
* 注意: RedisTemplate对象的名称 redisTemplate
*/
@Resource
private RedisTemplate redisTemplate;
@Resource
private StringRedisTemplate stringRedisTemplate;
// 添加数据到redis
@PostMapping("/redis/addstring")
public String addToRedis(String name, String value){
// 操作Redis中string类型的数据, 先获取ValueOperations对象
ValueOperations valueOperations = redisTemplate.opsForValue();
//添加数据到redis
valueOperations.set("myname","lisi");
return "向redis添加string类型的数据";
}
// 从redis获取数据
@GetMapping("/redis/getk")
public String getData(String k){
ValueOperations valueOperations = redisTemplate.opsForValue();
Object v = valueOperations.get(k);
return "key是"+k+",他的值是:"+v;
}
@PostMapping("/redis/{k}/{v}")
public String addStringKV(@PathVariable String k,
@PathVariable String v){
// 使用StringRedisTemplate对象
stringRedisTemplate.opsForValue().set(k,v);
return "使用StringRedisTemplate对象";
}
@GetMapping("/redis/getstr/{k}")
public String getStringValue(@PathVariable String k){
String v = stringRedisTemplate.opsForValue().get(k);
return "k的value:"+v;
}
/** 设置 RedisTemplate 序列化
* 可以设置 key 的序列化, 可以设置value的序列化
* 可以同时设置 key 和 value的序列化
*/
@PostMapping("/redis/addstr")
public String addString(String k,String v){
// 使用RedisTemplate
// 设置 key 使用String的序列化
redisTemplate.setKeySerializer( new StringRedisSerializer());
// 设置 value 的序列化
redisTemplate.setValueSerializer( new StringRedisSerializer());
redisTemplate.opsForValue().set(k,v);
return "定义RedisTemplate对象的key,value的序列化";
}
/**
* 使用json 序列化, 把java对象转为json存储
*/
@PostMapping("/redis/addjson")
public String addJson(){
Student student = new Student();
student.setId(1001);
student.setName("zhangsan");
student.setAge(20);
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 把值作为json序列化
redisTemplate.setValueSerializer( new Jackson2JsonRedisSerializer(Student.class) );
redisTemplate.opsForValue().set("mystudent", student);
return "json序列化";
}
@PostMapping("/redis/getjson")
public String getJson(){
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 把值作为json序列化
redisTemplate.setValueSerializer( new Jackson2JsonRedisSerializer(Student.class) );
Object obj = redisTemplate.opsForValue().get("mystudent");
return "json反序列化="+ obj;
}
}
e.Postman测试:
6.3.对比StringRedisTemplate 和 RedisTemplate
a.两者的对比:
StringRedisTemplate
: 把k,v 都是作为String处理,使用的是String的序列化 , 可读性好
RedisTemplate
:把k,v 经过了序列化存到redis
。 k,v 是序列化的内容, 不能直接识别,默认使用的jdk序列化
, 可以修改为前提的序列化;- 序列化:
把对象转化为可传输的字节序列过程称为序列化
。 - 反序列化:把
字节序列还原为对象的过程称为反序列化
- 序列化:
b.为什么需要序列化
- 序列化最终的
目的是为了对象可以跨平台存储,和进行网络传输
。而我们进行跨平台存储和网络传输的方式就是IO
,而我们的IO支持的数据格式就是字节数组。我们必须在把对象转成字节数组的时候就制定一种规则(序列化),那么我们从IO流里面读出数据的时候再以这种规则把对象还原回来(反序列化)
c.什么情况下需要序列化:
- 通过上面已经知道了
凡是需要进行“跨平台存储”和”网络传输”的数据,都需要进行序列化
。 - 本质上存储和网络传输 都需要经过 把一个对象状态保存成一种跨平台识别的字节格式,然后其他的平台才可以通过字节信息解析还原对象信息。
d.序列化的方式
- 序列化
只是一种拆装组装对象的规则
,那么这种规则肯定也可能有多种多样,比如现在常见的序列化方式有:JDK(不支持跨语言)、JSON、XML、Hessian、Kryo(不支持跨语言)、Thrift、Protofbuff、
;
e.json序列化:
- json序列化功能
将对象转换为 JSON 格式
或从 JSON 格式转换对象
。例如把一个Student对象转换为JSON字符串{“name”:“李四”, “age”:29} ),反序列化(将JSON字符串 {“name”:“李四”, “age”:29} 转换为Student对象)
6.4.Redis环境搭建(学习学习各种云是什么)
1、阿里云按量付费redis。经典网络
2、申请redis的公网连接地址
3、修改白名单 允许0.0.0.0/0 访问
6.4.IDEA生成序列化版本号:
- 1.IDEA中的设置步骤:
- 2.找到实体类,添加UID;