SpringBoot 06: springboot中使用redis
- 2022 年 11 月 15 日
- 筆記
- springboot
配置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;
}
}

