目录

一、Redis简介:

二、Springboot整合Redis举例:

2.1、创建Springboot项目并且加入依赖:

2.2、 application.yml中设置redis服务器的信息:

2.3、使用RedisTemplate(StringRedisTemplate ):

2.4、常用的API:

 三、StringRedisTemplate和RedisTemplate的对比:

3.1、对比: 

3.2、什么是序列化和反序列化

3.3、为什么需要序列化

3.4、序列化的方式   

3.5、JDK序列话和JSON序列化

 四、RedisTemplate序列化:

4.1、使用RedisTemplate,在存取值之前,设置序列化:

4.2、提问:如果我只设置Key为String序列化,不设置Value的序列化呢:

4.3、结论:那就意味着Value的值默认就是JDK序列化,是个二进制数据,不能直接读:

 4.4、StringRedisTemplate的Key、Value都设置好了,都是字符串序列化:

 五、Json序列化

5.1、创建实体类并实现Serializable接口:        

 5.2、IDEA快捷创建serialVersionUID               

 5.3、Json序列化举例:

 5.4、测试结果:


一、Redis简介:

        首先我们要知道Redis是什么:

        Redis一个NoSQL数据库,redis性能好,常用作缓存使用( cache ),用户访问应用,如果找数据的话会先访问redis,如果redis中有数据的话就直接返回发给用户,如果redis中没有的话我们再去查数据库,找到了数据之后一方面存到redis中,另一方面再反馈给用户,目的是说如果用户下次再访问类似的数据的话,redis中就有了。

        Redis中的数据是存在内存中的,你可以通过内存来拿到我们期望的数据,redis性能好,常用来做缓存使用,减少对数据库的直接访问,redis中最常见的有五种数据类型:

        string、hash、set、zset、list

        Redis如何启动:双击;客户端双击exit就退出了。

        

二、Springboot整合Redis举例:
 

2.1、创建Springboot项目并且加入依赖:

         Spring、SpringBoot中有一个RedisTemplate(StringRedisTemplate),处理和Redis的交互,简化对redis的操作,我们只要引入了Reids的起步依赖,就可以直接在项目中使用 RedisTemplate(StringRedisTemplate):

         Spring、SpringBoot中有一个RedisTemplate(StringRedisTemplate ),这个类可以处理和Redis的交互,简化对redis的操作,它底层用的是lettuce客户端(核心),由lettuce客户端来真正的和redis服务器来进行数据的交互:

                                 

2.2、 application.yml中设置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
2.3、使用RedisTemplate(StringRedisTemplate ):

        springboot框架创建RedisTemplate对象的名字默认就是redisTemplate,所以你也叫这个名字,这样的话,你在用@Resource自动注入时,按名称注入就会找到这个名称的redisTemplate对象,并且给这个对象的属性赋值:

        我们用@Resource/@Autowired注入:RedisTemplate(StringRedisTemplate )

2.4、常用的API:

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

http://localhost:9001/myredis/redis/addString  :

 http://localhost:9001/myredis/redis/getk?k=myname : 

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

http://localhost:9001/myredis/redis/stunum/520 :

 http://localhost:9001/myredis/redis/getstr/stunum :

 三、StringRedisTemplate和RedisTemplate的对比:

3.1、对比: 
  • StringRedisTemplate : 把k , v经过String序列化存到redis中,使用的是String的序列化,可读性好        
  •  RedisTemplate:   默认把k ,v经过JDK的序列化存到redis中。k,v是序列化的内容,不能直接识别
3.2、什么是序列化和反序列化

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

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

3.3、为什么需要序列化

        序列化最终的目的是为了数据可以跨平台存储,和进行网络传输。而我们进行跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是字节数组。我们必须在把对象转成字节数组的时候就制定一种规则(序列化),那么我们从IO流里面读出数据的时候再以这种规则把对象还原回来(反序列化)。
        什么情况下需要序列化
        通过上面我想你已经知道了凡是需要进行"跨平台存储"和"网络传输"的数据,都需要进行序列化。本质上存储和网络传输都需要经过把一个对象状态保存成一种跨平台识别的字节格式,然后其他的平台才可以通过字节信息解析还原对象信息。

3.4、序列化的方式
   

     序列化只是一种拆装组装对象的规则,那么这种规则肯定也可能有多种多样,比如现在常见的序列化方式有∶JDK(不支持跨语言)、JSON、XML、Hessian、Kryo(不支持跨语言)、Thrift、Protostuff 

3.5、JDK序列话和JSON序列化

        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数据

 四、RedisTemplate序列化:

        默认用的是JDK序列化的方式,我们以字符串序列化为例:

                        

4.1、使用RedisTemplate,在存取值之前,设置序列化:

        你可以单独设置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序列化";
    }
}

                        ​​​​​​​         

4.2、提问:如果我只设置Key为String序列化,不设置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序列化";
    }
4.3、结论:那就意味着Value的值默认就是JDK序列化,是个二进制数据,不能直接读:

 4.4、StringRedisTemplate的Key、Value都设置好了,都是字符串序列化:

 五、Json序列化

5.1、创建实体类并实现Serializable接口:        

 5.2、IDEA快捷创建serialVersionUID               ​​​​​​​

public class Student implements Serializable {
    @Serial
    private static final long serialVersionUID = -6382035984102281702L;
    private Integer id;
    private Integer age;
    private String name;
 5.3、Json序列化举例:

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

 5.4、测试结果:



 如果去掉会有什么结果: 

 //  http://localhost:8001/myredis/redis/getJson?name=myselef
    @GetMapping("/redis/getJson")
    public Student getJson(String name){
//        redisTemplate.setKeySerializer(new StringRedisSerializer());
//        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));
        //会自动反序列化,把json格式的数据转化为student对象
        Student obj = (Student)redisTemplate.opsForValue().get(name);
        System.out.println("+++++json反序列化");
        System.out.println(obj);
        return obj;
    }

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐