1. 程式人生 > 資料庫 >SpringBoot整合Redis之以物件形式快取資料

SpringBoot整合Redis之以物件形式快取資料

一,前言

本篇文章主要來實現在如何在SpringBoot中將物件快取到redis中。另外對於SpringBoot整合Redis有不清楚的地方可以檢視這篇文章SpringBoot整合Redis

二,不同序列化方法

1開啟我們引入的Redis自動配置類:
RedisAutoConfiguration,可以看到有兩種方法

  1. RedisTemplate :以物件的形式來存放資料
  2. 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泛型介面實現類,來自定義序列化方法

  1. 開啟RedisAutoConfiguration,複製RedisTemplate泛型方法
  2. 檢視RedisTemplate泛型類 檢視該RedisTemplate下的序列化設定:
    setDefaultSerializer(),採用的是JdkSerializationRedisSerializer序列化方法
  3. 開啟RedisSerializer泛型可以發現,該有多種實現類
    在這裡插入圖片描述
  4. 可以看到圖中的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是通過預設序列化方法實現的物件序列化儲存
在這裡插入圖片描述