0
点赞
收藏
分享

微信扫一扫

SpringBoot框架详解(六)集成Redis


文章目录

  • ​​SpringBoot框架详解(六)集成Redis​​
  • ​​0.配置本机redis连接​​
  • ​​1. 向redis中添加和获取数据​​
  • ​​1.1 RedisTemplate​​
  • ​​1.2 StringRedisTemplate避免乱码(使用restful风格)​​
  • ​​1.3 对比StringRedisTemplate和RedisTemplate.​​
  • ​​1.4 Redis序列化​​
  • ​​1.5 设置key或value序列化方式​​
  • ​​1.6 序列化版本号​​
  • ​​1.7 使用json序列化对象​​


SpringBoot框架详解(六)集成Redis

起心动念是好的,结果不会差到哪去

Redis: 一个NoSQL数据库,常用做缓存使用(cache)

Redis的数据类型:string,hash,set,zset,list

Redis是一个中间件:是一个独立的服务器。

java中著名的客户端:jedis,lettuce,Redisson

Spring.SpringBoot 中有一个RedisTemplate和StringRedisTemplate,处理和redis交互。

RedisTemplate 使用的 lettuce 客户端库。

<!--    redis起步依赖:直接在项目中使用RedisTemplate(StringRedisTemplate)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

springboot自动创建了RedisTemplate等放到了容器中


data-redis使用的是 lettuce客户端库

在程序中使用RedisTemplate 类的方法 操作redis数据,实际就是调用的lettuce客户端中的方法

0.配置本机redis连接

src/main/resources/application.properties

server.port=9001
server.servlet.context-path=/myredis

# 指定redis (host,IP,password)
spring.redis.host=localhost
spring.redis.port=6379
#spring.redis.password=

1. 向redis中添加和获取数据

1.1 RedisTemplate

package com.firewolf.controller;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.GetMapping;
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;

// 添加数据到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;
}
}

可以通过postman进行测试

  • ​​http://localhost:9001/myredis/redis/addstring?name=myname&value=lisi​​
  • ​​http://localhost:9001/myredis/redis/getk?k=myname​​

为什么post请求可以传get的params呢?

url传参无论是post和get都是可以的,只是post还多出了更多的数据传输通道,不受url长度限制。

存字符串类型的值会有乱码

127.0.0.1:6379> keys *
1) "stunum"
2) "\xac\xed\x00\x05t\x00\x06myname"

1.2 StringRedisTemplate避免乱码(使用restful风格)

@Resource
private StringRedisTemplate stringRedisTemplate;
// 使用rest风格
@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;
}
  • 向数据库传入数据
  • ​​http://localhost:9001/myredis/redis/stunum/100​​
  • 读取数据
  • ​​http://localhost:9001/myredis/redis/getstr/stunum​​

1.3 对比StringRedisTemplate和RedisTemplate.

StringRedisTemplate:把k,v都是作为String处理,使用的是String的序列化,可读性好。

RedisTemplate:把k,v经过了序列化存到redis。k,v是序列化的内容,不能直接识别。

RedisTemplate:默认使用的jdk序列化,可以修改为前提的序列化。

1.4 Redis序列化

序列化:把对象转化为可传输的字节序列过程称为序列化。

反序列化:把字节序列还原为对象的过程称为反序列化。

为什么需要序列化?

序列化的最终的目的是为了对象可以跨平台存储,和进行网络传输。

进行跨平台存储和网络传输的方式就是IO,而IO支持的数据格式是字节数组。

我们把对象转成字节数组需要一种规则,即序列化。

从IO流里面读出数据的时候再以这种规则把对象还原回来,即反序列化。

序列化的方式?

序列化的规则有多种:JDK(不支持跨语言\适用于规模下,没有高并发) \ JSON \ XML \ Hessian \ Kryo (java不支持跨语言) \ Thrift (meta公司)\ Protostuff

Java的序列化

把Java对象转为byte[],二进制数据。

Json的序列化

转化成json格式的对象{“name”:“李四”,“age”:18}

1.5 设置key或value序列化方式

/***
* 设置 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的序列化";

}

idea 快捷键 ctrl+h 打开hierarchy查看源码类的层级机构图

1.6 序列化版本号

idea->setting->editor->inspections->Serialization issues
勾选Serializable class without a serialVersionUID field(生成序列化版本号)

在类名上alt+enter 第一项 add serialVersionUID

import java.io.Serializable;

//类名旁 alte+enter
public class Student implements Serializable {
private static final long serialVersionUID = 7751711337147644023L;
private Integer id;
private String name;
private Integer age;

1.7 使用json序列化对象

/***
* 使用json 序列化 ,把java对象转为json存储
* **/
@PostMapping("/redis/addjson")
public String addJson(){
Student student = new Student();
student.setAge(19);
student.setId(1001);
student.setName("zhangsan");

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;
}

redis_cil 客户端查库验证

127.0.0.1:6379> get mystudent
"{\"id\":1001,\"name\":\"zhangsan\",\"age\":19}"

springboot+redis部分结束,redis基础部分在redis专栏。
Know how to be grateful, know how to be grateful, people will become kind, tolerant and loving

举报

相关推荐

0 条评论