1.Redis简介66
Spring,在Springbot中,Redistemplatetete(StringRedisTemplate),与redis交互处理与redis交互
Redis是NoSQL数据库,常用于缓存Cache。通过Redis客户端可以使用多种方式
在程序中,语言访问Redis数据。
Redis的数据类型:string,hash,set,zset,list
Redis是一个中间件:一个独立的服务器。
java中著名的客户端:Jedis,lettuce,Redisson
在SpringBoot中使用Redistemplate(Stringredistemplate)模板类操作Redis数据。
1.1需求66需求:根据学生的id完善学生的功能,先从redis缓存中找到。如果找不到,再从数
在数据库中搜索,然后放入redis缓存中
2.配置Windows版redis672.1redis客户端和服务端67Redis-x64-3.2.100.rar解压缩到一个非中文目录
我放在E:\java\tools\Redis
redis-server.exe:服务端,启动后不要关闭(可以最小化)
redis-cli.exe:客户端,访问redis中的数据
我们在客户端输入几个数据,看看是否可以使用。OK没问题
redisclient-win32.x86_64.2.0.jar:Redis图形界面客户端
执行方法:在本文件所在的目录cmd中执行java-jarredisclient-win32.x86_64.2.0.jar
启动成功后,点击左上角的Server---add
3.集成Redis步骤683.1使用Redistemplatepomeplatepomm.xml68lettuce客户端库使用Redistemplate
<!--redis起步依赖: Redistemplatet直接用于项目(StringRedisTemplate)--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>data-使用redis lettuce 客户端库
在程序中,redistemplate类的方法用于操作redis数据,实际上是调用lettuce客户端的方法
aplication核心配置文件.properties69
server.port=9001server.servlet.context-path=/myredis#指定redis (host,ip,password) 69spring.redis.host=localhostspring.redis.port=6379#密码设置没有密码注释#spring.redis.password=
创建Rediscontroler700
package com.bjpowernode.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.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;////演示Redis的使用 70@RestController //复合注释, 是@Controller 与@Responsebody组合。public class RedisController { /** * 注入Redistemplatetet * * RedisTemplate 泛型 * RedisTemplate * RedisTemplate * RedisTemplate * * 注意: Redistemplate对象的名称 redisTemplate */ @Resource //注入Redistemplatetet private RedisTemplate redisTemplate; ///将数据添加到redis中 70 @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中获取数据 71 @GetMapping("/redis/getk") public String getData(String k){ ValueOperations valueOperations = redisTemplate.opsForValue(); Object v = valueOperations.get(k); return “key是”+k+",他的价值是:“+v; }}
启动Redis服务执行SpringBootaplication启动
使用Postman发送71测试71添加数据到redis71
选择post请求输入地址http://localhost:9001/myredis/redis/addstring
name添加参数=myname和value=lisi
发送请求,成功
从redis中获取数据71选择get请求输入http://localhost:9001/myredis/redis/getk
输入参数k=myname,成功
3.2使用Stringredistemplate71rediscontrlerlerlerler
package com.bjpowernode.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.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;////演示Redis的使用 70@RestController //复合注释, 是@Controller 与@Responsebody组合。public class RedisController { @Resource ///注入Stringredistemplateteteteter 71 private StringRedisTemplate stringRedisTemplate; ///使用Stringredistemplatetelatet 71 ///添加数据 71 @PostMapping("/redis/{k}/{v}") public String addStringKV(@PathVariable String k, @PathVariable String v){ // 使用Stringredistemplate对象 stringRedisTemplate.opsForValue().set(k,v); return “使用Stringredistemplate对象”; } ///取出数据 71 @GetMapping("/redis/getstr/{k}") public String getStringValue(@PathVariable String k){ String v = stringRedisTemplate.opsForValue().get(k); return "k的value:"+v; }}
添加数据
取出数据
4.比较StringRedistemplate和Redistemplate71StringRedisTemplate:将k、v作为String处理,使用String序列化,可读性好
RedisTemplate:通过序列化将k、v存储到redis。k,v是序列化的内容,不能直接识别.
JDK序列化默认使用,可以修改为其他序列化
序列化:将对象转换为可传输字节序列的过程称为序列化。
反序列化:将字节序列还原为对象的过程称为反序列化。
4.1为什么需要序列化71序列化的最终目的是跨平台存储和网络传输对象。我们的跨平台存储和网络传输是IO,我们的IO支持的数据格式是字节数组。当我们将对象转换为字节数组时,我们必须制定一个规则(序列化),然后当我们从IO流中读取数据时,我们会恢复对象(反序列化)。
4.2在什么情况下需要序列化71通过以上,我想你已经知道,所有需要“跨平台存储”和“网络传输”的数据都需要序列化。本质上,存储和网络传输需要将对象状态保存到跨平台识别的字节格式中,然后其他平台可以通过字节信息分析恢复对象信息。
4.3序列化方法71序列化只是拆装对象的一种规则,所以这种规则肯定有很多种,比如现在常见的序列化方法有:
JDK(不支持跨语言)、JSON、XML、Hessian、Kryo(不支持跨语言)、Thrift、ProtoStuff
例如:JSON的序列化:Student(name=zs,age=20)----{"name":"zs","age":20}
java序列化:将java对象转换为byte[],二进制数据
4.4json序列化:71json序列化功能将对象转换为JSON格式或从JSON格式转换对象。例如,将Student对象转换为JSON字符串{”name":"李四","age":反序列化(JSON字符串{”)name":"李四","age":29}转换为Student对象)
5.设置key或value的序列化方法725.1设置Redistemplate序列化为StringRedisserializerer在存取值之前设置序列化
RedisController
/** 设置 RedisTemplate 序列化 72 * 可以设置 key 的序列化, value序列化可以设置 * 可同时设置 key 和 value序列化 */ @PostMapping("/redis/addstr") public String addString(String k,String v){ // 使用Redistemplatetet // 设置 key 使用String序列化 redisTemplate.setKeySerializer( new StringRedisSerializer()); // 设置 value 的序列化 redisTemplate.setValueSerializer( new StringRedisSerializer()); redisTemplate.opsForValue().set(k,v); return “定义Redistemplate对象的key,value序列化”; }
在redis中查询没有问题
6.idea生成序列化版本号73设置-检查-无serialVersionUID的可序列化类
然后alt+enter---添加serialversionUID字段
6.1用SON序列化添加数据73-74Student
package com.bjpowernode.vo;import java.io.Serializable;public class Student implements Serializable { private static final long serialVersionUID = 3625244033394044125L; private Integer id; private String name; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; }}
RedisController
/** * 使用json 序列化, 将java对象转化为json存储 74 */ @PostMapping("/redis/addjson") public String addJson(){ Student student = new Student(); student.setId(1001); student.setName("zhangsan"); student.setAge(20); ///将key设置为string序列化 redisTemplate.setKeySerializer(new StringRedisSerializer()); // 把 值 作为json序列化 redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class)); redisTemplate.opsForValue().set("mystudent", student); return “json序列化”; }
6.2反json序列化取出数744
将我们存储的json序列格式的字符串反序列化为原始对象
RedisController
///反json序列化取出值 74 @GetMapping("/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; }