赞
踩
目录
2.2、 application.yml中设置redis服务器的信息:
2.3、使用RedisTemplate(StringRedisTemplate ):
三、StringRedisTemplate和RedisTemplate的对比:
4.1、使用RedisTemplate,在存取值之前,设置序列化:
4.2、提问:如果我只设置Key为String序列化,不设置Value的序列化呢:
4.3、结论:那就意味着Value的值默认就是JDK序列化,是个二进制数据,不能直接读:
4.4、StringRedisTemplate的Key、Value都设置好了,都是字符串序列化:
5.2、IDEA快捷创建serialVersionUID
首先我们要知道Redis是什么:
Redis一个NoSQL数据库,redis性能好,常用作缓存使用( cache ),用户访问应用,如果找数据的话会先访问redis,如果redis中有数据的话就直接返回发给用户,如果redis中没有的话我们再去查数据库,找到了数据之后一方面存到redis中,另一方面再反馈给用户,目的是说如果用户下次再访问类似的数据的话,redis中就有了。
Redis中的数据是存在内存中的,你可以通过内存来拿到我们期望的数据,redis性能好,常用来做缓存使用,减少对数据库的直接访问,redis中最常见的有五种数据类型:
string、hash、set、zset、list
Redis如何启动:双击;客户端双击exit就退出了。
Spring、SpringBoot中有一个RedisTemplate(StringRedisTemplate),处理和Redis的交互,简化对redis的操作,我们只要引入了Reids的起步依赖,就可以直接在项目中使用 RedisTemplate(StringRedisTemplate):
Spring、SpringBoot中有一个RedisTemplate(StringRedisTemplate ),这个类可以处理和Redis的交互,简化对redis的操作,它底层用的是lettuce客户端(核心),由lettuce客户端来真正的和redis服务器来进行数据的交互:
- server:
- port: 9001
- servlet:
- context-path: /myredis
-
- spring:
- redis:
- host: localhost
- port: 6379
- #password: 用的本机的redis,并且我没有设置redis密码
常见的设置:
spring: redis: # Redis服务器地址 host: 19.1.5.11 # Redis服务器端口号 port: 6379 # 使用的数据库索引,默认是0 database: 0 # 连接超时时间 timeout: 1800000 # 设置密码 password: "123456" lettuce: pool: # 最大阻塞等待时间,负数表示没有限制 max-wait: -1 # 连接池中的最大空闲连接 max-idle: 5 # 连接池中的最小空闲连接 min-idle: 0 # 连接池中最大连接数,负数表示没有限制 max-active: 20
springboot框架创建RedisTemplate对象的名字默认就是redisTemplate,所以你也叫这个名字,这样的话,你在用@Resource自动注入时,按名称注入就会找到这个名称的redisTemplate对象,并且给这个对象的属性赋值:
我们用@Resource/@Autowired注入:RedisTemplate(StringRedisTemplate )
- @RestController // @Controller + @ResponseBody
- public class RedisController {
- @Resource
- private RedisTemplate redisTemplate;
- //向redis中添加String类型的数据
- @PostMapping("/redis/addString")
- public String addToRedis(String name, String value){
- ValueOperations valueOperations = redisTemplate.opsForValue();
- valueOperations.set(name,value);
- return "向redis中添加String类型的数据";
- }
-
- //从redis中获取数据
- @GetMapping("/redis/getk")
- public String getData(String k){
- ValueOperations valueOperations = redisTemplate.opsForValue();
- Object v = valueOperations.get(k);
- return "Key的值是:" + k + "对应的Value是:" + v;
- }
- }

Restful风格:
- @RestController // @Controller + @ResponseBody
- public class RedisController {
- @Resource
- private RedisTemplate redisTemplate;
- @Resource
- StringRedisTemplate stringRedisTemplate;
- //向redis中添加String类型的数据
- @PostMapping("/redis/addString")
- public String addToRedis(String name, String value){
- ValueOperations valueOperations = redisTemplate.opsForValue();
- valueOperations.set(name,value);
- return "向redis中添加String类型的数据";
- }
-
- //从redis中获取数据
- @GetMapping("/redis/getk")
- public String getData(String k){
- ValueOperations valueOperations = redisTemplate.opsForValue();
- Object v = valueOperations.get(k);
- return "Key的值是:" + k + "对应的Value是:" + v;
- }
-
- @PostMapping("/redis/{k}/{v}")
- public String addString(@PathVariable String k,
- @PathVariable String v){
- stringRedisTemplate.opsForValue().set(k,v);
- return "k的值为:"+ k + ", v的值为:" + v ;
- }
-
- @GetMapping("/redis/getstr/{k}")
- public String getString(@PathVariable String k){
- String v = stringRedisTemplate.opsForValue().get(k);
- return "value的值为:" + v;
- }
- }

序列化∶把对象转化为可传输的字节序列过程称为序列化。
反序列化︰把字节序列还原为对象的过程称为反序列化。
序列化最终的目的是为了数据可以跨平台存储,和进行网络传输。而我们进行跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是字节数组。我们必须在把对象转成字节数组的时候就制定一种规则(序列化),那么我们从IO流里面读出数据的时候再以这种规则把对象还原回来(反序列化)。
什么情况下需要序列化
通过上面我想你已经知道了凡是需要进行"跨平台存储"和"网络传输"的数据,都需要进行序列化。本质上存储和网络传输都需要经过把一个对象状态保存成一种跨平台识别的字节格式,然后其他的平台才可以通过字节信息解析还原对象信息。
序列化只是一种拆装组装对象的规则,那么这种规则肯定也可能有多种多样,比如现在常见的序列化方式有∶JDK(不支持跨语言)、JSON、XML、Hessian、Kryo(不支持跨语言)、Thrift、Protostuff
JDK不支持跨语言,你用java语言序列化了对象,你还得用java语言给它反序列化
JSON 序列化:你可以把你的对象转成一个JSON格式(序列化),然后你可以通过JSON再转换成java对象(反序列化)
JDK的序列化:把java对象转为byte[],二进制数据;
JSON序列化: json序列化能将对象转换为JSON格式或从JSON格式转换对象。例如把一个Student对象转换为JSON字符串{"name":"李四" ,"age":29}),反序列化(将JSON字符串{"name":"李四", "age":29}转换为Student对象);再比如前端ajax,后端java代码, 相当于跨语言,它俩之间传的就是json数据
默认用的是JDK序列化的方式,我们以字符串序列化为例:
你可以单独设置Key、Value的序列化方式,也可以同时设置序列化方式 :
- @RestController // @Controller + @ResponseBody
- public class RedisController {
- @Resource
- private RedisTemplate redisTemplate;
- @Resource
- StringRedisTemplate stringRedisTemplate;
-
-
- @PostMapping("/redis/setk")
- public String setRedis(String key , String value){
- //设置Key使用String序列化
- redisTemplate.setKeySerializer(new StringRedisSerializer());
- //设置Value使用String序列化
- redisTemplate.setValueSerializer(new StringRedisSerializer());
- redisTemplate.opsForValue().set(key,value);
- return "定义了RedisTemplate的key、value序列化";
- }
- }

- @PostMapping("/redis/setk")
- public String setRedis(String key , String value){
- redisTemplate.setKeySerializer(new StringRedisSerializer());
- // redisTemplate.setValueSerializer(new StringRedisSerializer());
- redisTemplate.opsForValue().set(key,value);
- return "定义了RedisTemplate的key、value序列化";
- }
- public class Student implements Serializable {
- @Serial
- private static final long serialVersionUID = -6382035984102281702L;
- private Integer id;
- private Integer age;
- private String name;
-
- @RestController // @Controller + @ResponseBody
- public class RedisController {
- @Resource
- private RedisTemplate redisTemplate;
- @Resource
- private StringRedisTemplate stringRedisTemplate;
-
-
- @PostMapping("/redis/addJson")
- public String addJson(){
- Student student = new Student();
- student.setName("李四");
- student.setAge(22);
- student.setId(1001);
- redisTemplate.setKeySerializer(new StringRedisSerializer());
- redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));
- redisTemplate.opsForValue().set("mystudent",student);
- return "json序列化";
- }
-
- @GetMapping("/redis/getJson")
- public String getJson(String name){
- redisTemplate.setKeySerializer(new StringRedisSerializer());
- redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));
- //会自动反序列化把json格式的数据转为student对象
- Object obj = redisTemplate.opsForValue().get(name);
- return "json反序列化:" + obj;
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。