这里主要讲述SpringBoot集成Redis的使用,因此不再详述Redis,如果需要请自行百度
博主也有写过Redis文章,如下
Redis入门简介
Redis(Remote Dictionary Server)译为“远程字典服务”
Redis是一个用C语言编写的、开源的、基于内存运行并支持持久化的、高性能的NoSQL数据库、key-value 数据库,也是当前热门的NoSQL数据库之一
NoSQL =?Not Only SQL(不仅仅是SQL,而不是“不使用 SQL”)
泛指?non-relational?(非关系型数据库)
Redis通常也被称为数据结构服务器,这是因为它可以存储多种数据类型,比如 string(字符串),hash(哈希散列),list(列表),set(集合)和 sorted set(有序集合)等
首先我们需要启动 Redis 服务端
在pom.xml文件中加入Redis依赖
<dependencies>
<!--redis起步依赖:
SpringBoot中使用 RedisTemplate(StringRedisTemplate) 模版类操作 Redis
data-redis使用的 lettuce 客户端库
SpringBoot中使用 RedisTemplate类的方法 操作redis数据, 实际就是调用的 lettuce 客户端的中的方法
-->
<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>
Java中比较著名的客户端: Jedis , lettuce , Redisson
SpringBoot中使用 RedisTemplate(StringRedisTemplate) 模版类操作 Redis data-redis
使用lettuce 客户端库 SpringBoot中使用 RedisTemplate类的方法 操作redis数据, 实际就是调用lettuce 客户端的中的方法
application.yml文件配置
server:
port: 8081
servlet:
context-path: /myredis
spring:
# redis 配置
redis:
# 地址
host: localhost
# 端口,默认为6379
port: 6379
# 数据库索引
database: 0
# 密码
password:
# 连接超时时间
timeout: 10s
#Java中著名客户端: Jedis,lettuce,Redisson
lettuce:
pool:
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中的最大空闲连接
max-idle: 8
# 连接池的最大数据库连接数
max-active: 8
# #连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
在Controller中测试
@RestController
public class RedisController {
/**
* SpringBoot中使用 RedisTemplate(StringRedisTemplate) 模版类操作 Redis
* 注入RedisTemplate
*
* RedisTemplate 泛型三种方式
* RedisTemplate<String,String>
* RedisTemplate<Object,Object>
* RedisTemplate
*/
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
// 添加数据到redis
@PostMapping("/redis/addstring")
public String addToRedis(String key, String value){
// 操作Redis中string类型的数据, 先获取ValueOperations对象
ValueOperations valueOperations = redisTemplate.opsForValue();
//添加数据到redis
valueOperations.set(key,value);
return "向redis添加string类型的数据";
}
// 从redis获取数据
@GetMapping("/redis/getkey")
public String getData(String key){
ValueOperations valueOperations = redisTemplate.opsForValue();
String value = (String) valueOperations.get(key);
return "key是" + key + ",值是:" + value;
}
@PostMapping("/redis/addstr/{key}/{value}")
public String addStringKV(@PathVariable String key,
@PathVariable String value){
// 使用StringRedisTemplate对象
ValueOperations valueOperations = stringRedisTemplate.opsForValue();
valueOperations.set(key,value);
return "使用StringRedisTemplate对象";
}
@GetMapping("/redis/getstr/{key}")
public String getStringValue(@PathVariable String key){
ValueOperations valueOperations = stringRedisTemplate.opsForValue();
String value = (String) valueOperations.get(key);
return "key是" + key + ",值是:" + value;
}
/** 设置 RedisTemplate 序列化
* 可以设置 key 的序列化,可以设置value的序列化;也可以同时设置 key 和 value的序列化
*/
@PostMapping("/redis/addjsonstr")
public String addString(String key,String value){
// 使用RedisTemplate
// 设置 key 使用String的序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 设置 value 的序列化
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.opsForValue().set(key,value);
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(16);
// 设置 key 使用String的序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 设置 value 的序列化
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));
redisTemplate.opsForValue().set("myStudent",student);
// 把值作为json序列化
return "json序列化";
}
@GetMapping("/redis/getjson")
public String getJson(){
// 设置 key 使用String的序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 设置 value 的序列化
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));
// 把值作为json序列化
Object obj = redisTemplate.opsForValue().get("myStudent");
return "json反序列化=" + obj;
}
}
StringRedisTemplate : 把key,value?都是作为String处理, 使用的是String的序列化?
RedisTemplate : 把key,value 经过了序列化存到redis。 key,value 是序列化的内容, 不能直接识别
序列化:把对象转化为可传输的字节序列过程称为序列化
反序列化:把字节序列还原为对象的过程称为反序列化
序列化最终的目的是为了对象可以跨平台存储,和进行网络传输。进行跨平台存储和网络传输的方式就是IO,IO支持的数据格式就是字节数组。必须在把对象转成字节数组的时候就制定一种规则(序列化),从IO流里面读出数据的时候再以这种规则把对象还原回来(反序列化)
只要是需要进行“跨平台存储”和”网络传输”的数据,都需要进行序列化。 本质上存储和网络传输 都需要经过 把一个对象状态保存成一种跨平台识别的字节格式,然后其他的平台才可以通过字节信息解析还原对象信息。
序列化的方式 序列化只是一种拆装组装对象的规则,这种规则肯定也可能有多种多样
比如现在常见的序列化方式有:
JDK(不支持跨语言)、JSON、XML、Hessian、Kryo(不支持跨语言)、Thrift等
Student( name=zhangsan, age=20) ---- { "name":"zhangsan", "age":20 }
Java的序列化: 把Java对象转为byte[], 二进制数据
json序列化:json序列化功能将对象转换为 JSON 格式或从 JSON 格式转换对象。
例如把一个Student对象转换为JSON字符串{"name":"李四", "age":29} )
反序列化(将JSON字符串 {"name":"李四", "age":29} 转换为Student对象)
如果要使用JSON序列化,则需要实现序列化接口
import java.io.Serializable;
public class Student implements Serializable {
private static final long serialVersionUID = 7902017519895562501L;
}
且Java对象实现serializable接口后会有一个序列化版本号,在IDEA中设置如下
Settings----> Inspections ----> 搜索“serializable” ,勾选上serializable class without 'serialVersionUID'
然后在具体的Java类中 添加序列化ID 即可
|