SpringBoot 06: springboot中使用redis

配置SpringBoot

  • 创建SpringBoot项目时勾选Redis起步依赖
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  • 在程序中主要使用RedisTemplate类的方法操作redis数据。实际就是调用lettuce客户端库中的方法

image

  • 在application.properties文件中配置Redis服务的信息
#配置springboot服务信息
server.port=9090
server.servlet.context-path=/myredis

#springboot中redis相关配置
spring.redis.host=127.0.0.1
spring.redis.port=6379

StringRedisTemplate 和 RedisTemplate

两者对比

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

  • RedisTemplate:把k,v 经过了序列化存到redis。 k,v 是序列化的内容,不能直接识别。默认使用的jdk序列化,可以修改为其他的序列化方式

序列化

为什么要序列化

  • 序列化最终的目的是为了对象可以跨平台存储,和进行网络传输
  • 而我们进行跨平台存储和网络传输的方式就是IO,且我们的IO支持的数据格式就是字节数组
  • 我们必须在把对象转成字节数组的时候就制定一种转化规则(序列化),那么我们就可以从IO流里面读出数据的时候再以这种规则把对象还原回来(反序列化)

序列化和反序列化

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

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

何时需要序列化

  • 凡是需要进行“跨平台存储”和”网络传输”的数据,都需要进行序列化

  • 本质上存储和网络传输都需要经过把一个对象状态保存成一种跨平台识别的字节格式,然后其他的平台才可以通过字节信息解析还原对象信息

序列化方式

  • 序列化只是一种拆装组装对象的规则

  • 现在常见的序列化方式有:JDK(不支持跨语言)、JSON、XML、Hessian、Kryo(不支持跨语言)、Thrift、Protofbuff

  • 简单的序列化示例:

  • java的序列化:把java对象转为byte[], 二进制数据

  • json序列化:json序列化功能将对象转换为 JSON 格式或从 JSON 格式转换回对象。例如把一个Student对象转换为JSON字符串{"name":"李四", "age":29} ),反序列化(将JSON字符串 {"name":"李四", "age":29} 转换为Student对象)

代码演示

  • 创建实体类
package com.example.model;

import java.io.Serializable;

public class Food implements Serializable {
    //private static final long serialVersionUID = 6071454104230624820L;
    private String name;
    private double price;

    @Override
    public String toString() {
        return "Food{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public Food(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public Food() {
    }
}
  • 可以为实体类添加序列化版本号:将那个勾挑上

image

  • 光标放在实体类上,按alt + 回车,选择为实体类添加序列号

image

  • controller层。 演示StringRedisTemplate和RedisTemplate,以及json格式的序列化
package com.example.redis;

import com.example.model.Food;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
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 {

    @Resource
    StringRedisTemplate stringRedisTemplate;

    @Resource
    RedisTemplate redisTemplate;


    //使用stringRedisTemplate
    @PostMapping("/student/addStu")
    public String addStu(String key, String value){
        stringRedisTemplate.opsForValue().set(key, value);
        return "addStu,使用stringRedisTemplate操作字符串数据 key: " + key + ", value: " + value;
    }

    @GetMapping("/student/getStu")
    public String getStu(String key){
        String value = stringRedisTemplate.opsForValue().get(key);
        return "getStu,使用stringRedisTemplate操作字符串数据, 获取到的value: " + value;
    }

    //使用redisTemplate
    @PostMapping("/fruit/addFru")
    public String addFru(String key, String value){
        //设置序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.opsForValue().set(key, value);
        return "addFru,使用redisTemplate操作字符串数据, key: " + key + ", value: " + value;
    }

    @GetMapping("/fruit/getFru")
    public String getFru(String key){
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        String value = (String) redisTemplate.opsForValue().get(key);
        return "getFru,使用redisTemplate操作字符串数据, 获取到的value: " + value;
    }

    //使用redisTemplate序列化成json格式
    @PostMapping("/food/addFood")
    public String addFood(String name, Double price){
        Food food = new Food();
        food.setName(name);
        food.setPrice(price);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //将value序列化成json格式
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Food.class));
        redisTemplate.opsForValue().set("food", food);
        return "addFood,使用redisTemplate序列化成json格式";
    }

    @GetMapping("/food/getFood")
    public String getFood(String name){
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Food.class));
        //反序列化
        Food food = (Food) redisTemplate.opsForValue().get(name);
        return "getFood,获取到的value: " + food;
    }
}
posted @ 2022-11-15 17:43  nefu_wangxun  阅读(392)  评论(0编辑  收藏  举报