SpringBoot 06: springboot中使用redis

2022-11-15 18:00:25

設定SpringBoot

  • 建立SpringBoot專案時勾選Redis起步依賴
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  • 在程式中主要使用RedisTemplate類的方法操作redis資料。實際就是呼叫lettuce使用者端庫中的方法

  • 在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() {
    }
}
  • 可以為實體類新增序列化版本號:將那個勾挑上

  • 遊標放在實體類上,按alt + 回車,選擇為實體類新增序列號

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