【spring boot】2.0 配置@cacheable 自定義序列化方式 快取資料到redis
阿新 • • 發佈:2019-02-04
一·背景描述
spring 的 @cacheable 已成為我們比較常用的快取資料的方式,但是把非String物件快取到redis後在使用RedisDesktopManager等軟體檢視快取的資料的時候 展示的是HEX 資料,觀察起來比較不方便,所以我們這裡自定義了FastJsonRedisSerializer 序列化物件後快取到redis,可以更 方便的觀察快取資料。
二·引入jar包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastJson</artifactId> <version>1.2.17</version> </dependency>
三·程式碼
1·自定義序列化方式
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; import java.nio.charset.Charset; /** * 說明:自定義redis序列化方式 * * @author WangBin * @version V1.0 * @since 2018.03.22 */ public class FastJsonRedisSerializer<T> implements RedisSerializer<T> { public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); private Class<T> clazz; public FastJsonRedisSerializer(Class<T> clazz) { super(); this.clazz = clazz; } @Override public byte[] serialize(T t) throws SerializationException { if (t == null) { return new byte[0]; } return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET); } @Override public T deserialize(byte[] bytes) throws SerializationException { if (bytes == null || bytes.length <= 0) { return null; } String str = new String(bytes, DEFAULT_CHARSET); return JSON.parseObject(str, clazz); } }
2·配置
import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.serializer.RedisSerializationContext; import java.time.Duration; /** * * @author WangBin * @version V1.0 * @date 2017.12.05 */ @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { /** * 設定 redis 資料預設過期時間 * 設定@cacheable 序列化方式 * @return */ @Bean public RedisCacheConfiguration redisCacheConfiguration(){ FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig(); configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer)).entryTtl(Duration.ofDays(30)); return configuration; } }