RedisTemplate重寫序列化和Cache重寫序列化
阿新 • • 發佈:2021-01-11
技術標籤: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元件 } }