SpringBoot整合Redis之以物件形式快取資料
阿新 • • 發佈:2020-02-04
一,前言
本篇文章主要來實現在如何在SpringBoot中將物件快取到redis中。另外對於SpringBoot整合Redis有不清楚的地方可以檢視這篇文章SpringBoot整合Redis
二,不同序列化方法
1開啟我們引入的Redis自動配置類:
RedisAutoConfiguration,可以看到有兩種方法
- RedisTemplate :以物件的形式來存放資料
- StringRedisTemplate:以字串的形式來存放資料
兩者區別主要在於使用了不同的序列化方法:
- RedisTemplate預設使用JdkSerializationRedisSerializer序列化方法,將物件以序列化後的形式快取
- StringRedisTemplate使用了StringRedisSerializer序列化方法,將資料以字串的形式儲存快取
三,測試:
現有環境:
(使用Mybatis註解版對Mysql資料庫進行操作)
場景測試一:
將查詢出來的student物件使用RedisTemplate快取
class DemoBestStarterTestApplicationTests { @Autowired //操作字串常用,進行序列化 StringRedisTemplate stringRedisTemplate; @Autowired //kv 物件 RedisTemplate redisTemplate; @Autowired RedisTemplate<Object,Student> StudentRedisTemplate; @Test void contextLoads() { //String /* opsForValue()(String 字串) opsForList()(List 列表) opsForSet() (set 集合) opsForHash() (hash ) opsForZSet() (ZSet 有序集合) */ Student student=studentMapper.getStudentById(2,138); redisTemplate.opsForValue().set("x1",student); System.out.println(); } }
結果會報異常:
org.springframework.data.redis.serializer.SerializationException: Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.best.demobeststartertest.Cache.bean.Student]
原因:未對student類進行序列化
2對student類實現序列化介面,在測試:
測試成功,但是我們可以發現,我們的物件是被以序列化之後的形式儲存的,那如果我們為了想要以物件儲存,又該如何實現呢?
答案很簡單,我們可以通過自定義一個RedisTemplate泛型介面實現類,來自定義序列化方法
- 開啟RedisAutoConfiguration,複製RedisTemplate泛型方法
- 檢視RedisTemplate泛型類 檢視該RedisTemplate下的序列化設定:
setDefaultSerializer(),採用的是JdkSerializationRedisSerializer序列化方法 - 開啟RedisSerializer泛型可以發現,該有多種實現類
- 可以看到圖中的Jackson2JsonRedisSerializer類,我們選用該方法,如下程式碼,建立該序列化物件,並賦值給RedisTemplate的序列化設定方法
//自定義序列化方法
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<Object,Student> StudentRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object,Student> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
//序列化器
Jackson2JsonRedisSerializer<Student> ser= new Jackson2JsonRedisSerializer<Student>(Student.class);
template.setDefaultSerializer(ser);
return template;
}
}
#################測試類#############################
@SpringBootTest
class DemoBestStarterTestApplicationTests {
@Autowired //操作字串常用,進行序列化
StringRedisTemplate stringRedisTemplate;
@Autowired
StudentMapper studentMapper;
@Autowired //kv 物件
RedisTemplate redisTemplate;
@Autowired
RedisTemplate<Object,student);
StudentRedisTemplate.opsForValue().set("x2",student);
System.out.println();
}
}
5.測試結果
可以看到圖中,我們插入的x2就是通過Jackson2JsonRedisSerializer序列化方法實現的物件儲存
x1是通過預設序列化方法實現的物件序列化儲存