Redis----一个中间件:是一个独立的服务器
Redis是一个NoSQL数据库,意思是not only sql(不仅仅是sql),场用作缓存Cache使用、通过Redis客户端可以使用多种语言在程序中,访问Redis数据。java语言使用的客户端有Jedis,lettuce,Redisson等
Redis的数据类型:string、hash、set、list、zset
在Springboot框架在,使用RedisTemplate、StringRedisTemplate模板类操作Redis
使用Redis的准备工作
安装Redis客户端和服务器端,实现数据的可查询,在Redis的官网中只有linux的版本,该版本为微软改造之后可以在Windows上运行的版本,不是官方版本,解压Redis后打开服务器端和客户端
redisclient-win32.x86_64.2.0.jar是Redis的图形界面的操作客户端。
在文件所在位置打开cmd,执行java -jar redisclient-win32.x86_64.2.0.jar 就可以了
使用Redis
RedisTemplate的使用
创建一个新的Springboot项目,勾选Redis依赖
<!-- Redis起步依赖,添加后可以直接使用RedisTemplate、StringRedisTemplate类对Redis进行操作-->
<!-- RedisTemplate 使用的是lettuce客户端,使用RedisTemplate类的方法就是调用lettuce客户端的方法-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
在application中配置Redis
#设置redis连接的地址
spring.redis.host=localhost
#设置Redis的端口号
spring.redis.port=6379
#设置Redis的密码,没有密码可以注释掉
#spring.redis.password=******
编写controller,向Redis写入数据,和读取数据
package com.ys.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
* */
@Resource
private RedisTemplate redisTemplate;
// 添加数据到Redis
@PostMapping("/addRedis")
public String addRedis(String name,Integer age){
// 操作String中的string类型的数据 创建ValueOperations对象
ValueOperations valueOperations=redisTemplate.opsForValue();
// 添加数据到Redis
valueOperations.set("lisi",23);
return "向Redis添加String类型的数据";
}
// 获取Redis中的数据
@GetMapping("/getRedis")
public String getRedis(String k){
// 操作String中的string类型的数据 创建ValueOperations对象
ValueOperations valueOperations=redisTemplate.opsForValue();
Object v =valueOperations.get(k);
return "k="+k+"v="+v;
}
}
使用PostMan工具,发送请求,查看结果
使用Redis的客户端,查询数据
StringRedisTemplate的使用
package com.ys.controller;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
public class RedisController {
/**
* 在项目中注入RedisTemplate类
* RedisTemplate的泛型
* RedisTemplate<String,String>
* RedisTemplate<Object,Object>
* RedisTemplate
* */
@Resource
private StringRedisTemplate stringRedisTemplate;
// 使用路径变量添加数据和stringRedisTemplate
@PostMapping("/setRedis/{k}/{v}")
public String setRedis(@PathVariable String k,
@PathVariable String v){
stringRedisTemplate.opsForValue().set(k, v);
return "使用stringRedisTemplate添加数据";
}
//获取对象
@GetMapping("/ourRedis")
public String ourRedis(String k){
String s= stringRedisTemplate.opsForValue().get(k);
return k+"的值是:"+s;
}
}
使用postman发送请求,查看结果
使用Redis客户端查看数据
StringRedisTemplate和 RedisTemplate的区别
StringRedisTemplate:把k,v都是作为String处理,使用的是String的序列化,可读性好。默认使用的是字符串的序列化机。
RedisTemplate:把k,v都作了序列化后存到Redis,k,v都是序列化的内容,可读性差。默认的使用的是JDK序列化机制。
序列化
序列化:把对象转化为可传输的字节序列过程
反序列化:把字节序列化还原为对象的过程
序列化的目的:是为了对象可以跨平台存储,和进行网络传输。
序列化的方式:只是一种拆装组装对象的规则,这种规则多种多样,常见的有JDK(不支持跨语言),JSON,XML,Hessian,Kryo,Thrift(不支持跨语言),Protostuff
java序列化:把java对象转化为byte[ ],二进制数据
json序列化:把对象转化为JSON格式{"k1":"v1","k2":"v2"},或者JSON转为对象
修改RedisTemplate的序列化
在使用RedisTemplat时,需要在存取值之前修改序列化
package com.ys.controller;
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.StringRedisSerializer;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
public class RedisController {
/**
* 在项目中注入RedisTemplate类
* RedisTemplate的泛型
* RedisTemplate<String,String>
* RedisTemplate<Object,Object>
* RedisTemplate
* */
@Resource
private RedisTemplate redisTemplate;
/**
* 设置RedisTemplate的序列化
* 可以单独对k,v分别进行设置
* 也可以同时设置
* */
@PostMapping("/addString")
public String addString(String k,String v){
// 修改RedisTemplate的键(k)的序列化为字符串
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 修改RedisTemplate的值(v)的序列化为字符串
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.opsForValue().set(k,v);
return "修改RedisTemplate的序列化";
}
}
postman发送请求
使用客户端查看数据,修改成功
JSON序列化
/**
* 使用json序列化 把java对象转化为json存储
* */
@PostMapping("/setJson")
public String setJson(){
Student student=new Student("chengliu",27);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));
redisTemplate.opsForValue().set("myJson",student);
return "值使用JSON的序列化";
}
postman发生请求
客户端查看数据
JSON反序列化
@GetMapping("/getJson")
public String getJson(){
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));
Object o=redisTemplate.opsForValue().get("myJson");
return "JSON的反序列化:"+o;
}