RedisTemplate-Redis的序列化方案


一、引入Redis

1、項目中集成Redis

service-base模塊中添加redis依賴,Spring Boot 2.0以上默認通過commons-pool2連接池連接Redis

<!-- spring boot redis緩存引入 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 緩存連接池-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

<!-- redis 存儲 json序列化 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

2、添加Redis連接配置

service-core 的 application.yml 中添加如下配置
放到 spring 下面

#spring: 
  redis:
    host: 192.168.100.100
    port: 6379
    database: 0
    password: 123456 #默認為空
    timeout: 3000ms #最大等待時間,超時則拋出異常,否則請求一直等待
    lettuce:
      pool:
        max-active: 20  #最大連接數,負值表示沒有限制,默認8
        max-wait: -1    #最大阻塞等待時間,負值表示沒限制,默認-1
        max-idle: 8     #最大空閑連接,默認8
        min-idle: 0     #最小空閑連接,默認0

3、啟動Redis服務

遠程連接Linux服務器

#啟動服務
cd /usr/local/redis-5.0.7
bin/redis-server redis.conf

二、測試RedisTemplate

1、存值測試

test中創建測試類RedisTemplateTests

package com.atguigu.srb.core;
@SpringBootTest
@RunWith(SpringRunner.class)
public class RedisTemplateTests {
    @Resource
    private RedisTemplate redisTemplate;
    @Resource
    private DictMapper dictMapper;
    @Test
    public void saveDict(){
        Dict dict = dictMapper.selectById(1);
        //向數據庫中存儲string類型的鍵值對, 過期時間5分鍾
        redisTemplate.opsForValue().set("dict", dict, 5, TimeUnit.MINUTES);
    }
}

發現RedisTemplate默認使用了JDK的序列化方式存儲了key和value

2、Redis配置文件

service-base 中添加RedisConfig,我們可以在這個配置文件中配置Redis序列化方案

package com.atguigu.srb.base.config;

@Configuration
public class RedisConfig {


    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {

        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        //首先解決key的序列化方式
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringRedisSerializer);

        //解決value的序列化方式
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);

        //序列化時將類的數據類型存入json,以便反序列化的時候轉換成正確的類型
        ObjectMapper objectMapper = new ObjectMapper();
        //objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        // 將當前對象的數據類型也存入序列化的結果字符串中,以便反序列化
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);

        // 解決jackson2無法反序列化LocalDateTime的問題
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        objectMapper.registerModule(new JavaTimeModule());

        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);


        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        return redisTemplate;
    }
}

再次測試,key使用了字符串存儲,value使用了json存儲

3、取值測試

@Test
public void getDict(){
    Dict dict = (Dict)redisTemplate.opsForValue().get("dict");
    System.out.println(dict);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM