1. 程式人生 > 其它 >RedisTemplate重寫序列化和Cache重寫序列化

RedisTemplate重寫序列化和Cache重寫序列化

技術標籤:redis

Redis預設的是JDK的Serializer序列化方式,這種序列化後的資料是JSON的5倍大小,不利於儲存,太消耗redis的記憶體

所以我們要重寫redisTemplate的序列化方式和cache的序列化方式

將redisTemplate的KeySerializer設定為new StringRedisSerializer()方式

而redisTemplate的ValueSerializer要設定為通用Jackson,通用Jackson反序列化的時候不用指定class型別,比Jackson好使一點,設定為new GenericJackson2JsonRedisSerializer()

下面的模板經過使用沒問題,直接複製就能用

package com.qiangqiang.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;

@Configuration
public class RedisConfiguration {
    /**
     * 重寫Redis序列化方式,使用Json方式:
     * 當我們的資料儲存到Redis的時候,我們的鍵(key)和值(value)都是通過Spring提供的Serializer序列化到Redis的。
     * RedisTemplate預設使用的是JdkSerializationRedisSerializer,
     * StringRedisTemplate預設使用的是StringRedisSerializer。
     * <p>
     * Spring Data JPA為我們提供了下面的Serializer:
     * GenericToStringSerializer、Jackson2JsonRedisSerializer、
     * JacksonJsonRedisSerializer、JdkSerializationRedisSerializer、
     * OxmSerializer、StringRedisSerializer。
     * 在此我們將自己配置RedisTemplate並定義Serializer。
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {

        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //建立一個json的序列化物件
        GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //設定value的序列化方式json
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        //設定key序列化方式string
        redisTemplate.setKeySerializer(new StringRedisSerializer());

        //設定hash key序列化方式string
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        //設定hash value的序列化方式json
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
//        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    //重寫Cache序列化
    @Bean
    public RedisCacheManager employeeRedisCacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                        .entryTtl(Duration.ofDays(1))   // 設定快取過期時間為一天
//                        .disableCachingNullValues()     // 禁用快取空值,不快取null校驗
                        .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                        .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));     // 設定CacheManager的值序列化方式為json序列化,可加入@Class屬性
        return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(redisCacheConfiguration).build();     // 設定預設的cache元件
    }
}