You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
4.3 KiB
118 lines
4.3 KiB
/** |
|
* Copyright (C) 2018-2022 |
|
* All rights reserved, Designed By www.yixiang.co |
|
|
|
*/ |
|
package co.yixiang.config; |
|
|
|
import cn.hutool.core.lang.Assert; |
|
import co.yixiang.utils.StringUtils; |
|
import com.alibaba.fastjson.JSON; |
|
import com.alibaba.fastjson.parser.ParserConfig; |
|
import com.alibaba.fastjson.serializer.SerializerFeature; |
|
import lombok.extern.slf4j.Slf4j; |
|
import org.apache.commons.codec.digest.DigestUtils; |
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; |
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; |
|
import org.springframework.boot.autoconfigure.data.redis.RedisProperties; |
|
import org.springframework.boot.context.properties.EnableConfigurationProperties; |
|
import org.springframework.cache.Cache; |
|
import org.springframework.cache.annotation.CachingConfigurerSupport; |
|
import org.springframework.cache.annotation.EnableCaching; |
|
import org.springframework.cache.interceptor.CacheErrorHandler; |
|
import org.springframework.cache.interceptor.KeyGenerator; |
|
import org.springframework.context.annotation.Bean; |
|
import org.springframework.context.annotation.Configuration; |
|
import org.springframework.context.annotation.Primary; |
|
import org.springframework.data.redis.cache.RedisCacheConfiguration; |
|
import org.springframework.data.redis.connection.RedisConnectionFactory; |
|
import org.springframework.data.redis.core.RedisOperations; |
|
import org.springframework.data.redis.core.RedisTemplate; |
|
import org.springframework.data.redis.serializer.RedisSerializationContext; |
|
import org.springframework.data.redis.serializer.RedisSerializer; |
|
|
|
import java.nio.charset.Charset; |
|
import java.nio.charset.StandardCharsets; |
|
import java.time.Duration; |
|
import java.util.HashMap; |
|
import java.util.Map; |
|
|
|
/** |
|
* @author Zheng Jie |
|
* @date 2018-11-24 |
|
*/ |
|
@Slf4j |
|
@Configuration |
|
//@EnableConfigurationProperties(RedisProperties.class) |
|
public class RedisConfig { |
|
|
|
/** |
|
* 设置 redis 数据默认过期时间,默认2小时 |
|
* 设置@cacheable 序列化方式 |
|
*/ |
|
@Bean |
|
public RedisCacheConfiguration redisCacheConfiguration(){ |
|
FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); |
|
RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig(); |
|
configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer)).entryTtl(Duration.ofHours(2)); |
|
return configuration; |
|
} |
|
|
|
@Bean(name = "redisTemplate") |
|
// @ConditionalOnMissingBean(name = "redisTemplate") |
|
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { |
|
RedisTemplate<String, Object> template = new RedisTemplate<>(); |
|
//序列化 |
|
FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class); |
|
// value值的序列化采用fastJsonRedisSerializer |
|
template.setValueSerializer(fastJsonRedisSerializer); |
|
template.setHashValueSerializer(fastJsonRedisSerializer); |
|
// 全局开启AutoType,这里方便开发,使用全局的方式 |
|
ParserConfig.getGlobalInstance().setAutoTypeSupport(true); |
|
// 建议使用这种方式,小范围指定白名单 |
|
// ParserConfig.getGlobalInstance().addAccept("me.zhengjie.domain"); |
|
// key的序列化采用StringRedisSerializer |
|
template.setKeySerializer(new StringKeyRedisSerializer()); |
|
template.setHashKeySerializer(new StringKeyRedisSerializer()); |
|
template.setConnectionFactory(redisConnectionFactory); |
|
return template; |
|
} |
|
|
|
|
|
|
|
} |
|
|
|
/** |
|
* Value 序列化 |
|
* |
|
* @author / |
|
* @param <T> |
|
*/ |
|
class FastJsonRedisSerializer<T> implements RedisSerializer<T> { |
|
|
|
private final Class<T> clazz; |
|
|
|
FastJsonRedisSerializer(Class<T> clazz) { |
|
super(); |
|
this.clazz = clazz; |
|
} |
|
|
|
@Override |
|
public byte[] serialize(T t) { |
|
if (t == null) { |
|
return new byte[0]; |
|
} |
|
return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(StandardCharsets.UTF_8); |
|
} |
|
|
|
@Override |
|
public T deserialize(byte[] bytes) { |
|
if (bytes == null || bytes.length <= 0) { |
|
return null; |
|
} |
|
String str = new String(bytes, StandardCharsets.UTF_8); |
|
return JSON.parseObject(str, clazz); |
|
} |
|
|
|
} |
|
|
|
|