|
@@ -1,22 +1,28 @@
|
|
|
package com.elab.redis.config;
|
|
|
|
|
|
+import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
|
|
|
import com.elab.redis.CacheTemplate;
|
|
|
import com.elab.redis.annotation.CacheLoopSubmit;
|
|
|
+import com.elab.redis.annotation.CacheReadLock;
|
|
|
+import com.elab.redis.annotation.CacheWriteLock;
|
|
|
import com.elab.redis.interceptor.BeanFactoryCacheAttributeSourceAdvisor;
|
|
|
import com.elab.redis.interceptor.CacheAttributeSourcePointcut;
|
|
|
import com.elab.redis.interceptor.CacheInterceptor;
|
|
|
import com.elab.redis.spring.data.RedisTemplateDecorator;
|
|
|
import org.redisson.api.RedissonClient;
|
|
|
-import org.redisson.spring.cache.RedissonSpringCacheManager;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.config.BeanDefinition;
|
|
|
import org.springframework.cache.CacheManager;
|
|
|
-import org.springframework.context.annotation.Bean;
|
|
|
-import org.springframework.context.annotation.ComponentScan;
|
|
|
-import org.springframework.context.annotation.Configuration;
|
|
|
-import org.springframework.context.annotation.Role;
|
|
|
+import org.springframework.context.annotation.*;
|
|
|
+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;
|
|
|
|
|
|
/**
|
|
|
* 缓存自动配置
|
|
@@ -25,12 +31,12 @@ import org.springframework.data.redis.core.RedisTemplate;
|
|
|
* @time : 2020/7/8 - 19:12
|
|
|
*/
|
|
|
@Configuration
|
|
|
+@Import({ElabRedisProperties.class})
|
|
|
@ComponentScan(value = {"com.elab.redis.interceptor.impl"})
|
|
|
public class CacheAutoConfiguration {
|
|
|
|
|
|
-
|
|
|
@Bean
|
|
|
- public CacheTemplate cacheTemplate(@Autowired RedissonClient redissonClient, @Autowired RedisTemplate<Object,
|
|
|
+ public CacheTemplate cacheTemplate(@Autowired RedissonClient redissonClient, @Autowired RedisTemplate<String,
|
|
|
Object> redisTemplate) {
|
|
|
CacheTemplate cacheTemplate = new CacheTemplate();
|
|
|
cacheTemplate.setRedissonClient(redissonClient);
|
|
@@ -39,13 +45,24 @@ public class CacheAutoConfiguration {
|
|
|
}
|
|
|
|
|
|
@Bean
|
|
|
- public RedisTemplate<Object, Object> redisTemplate(
|
|
|
+ public RedisTemplate<String, Object> redisTemplate(
|
|
|
RedisConnectionFactory redisConnectionFactory) throws Exception {
|
|
|
- RedisTemplate<Object, Object> template = new RedisTemplateDecorator<>();
|
|
|
+ RedisTemplate<String, Object> template = new RedisTemplateDecorator<>();
|
|
|
template.setConnectionFactory(redisConnectionFactory);
|
|
|
+ template.setKeySerializer(new StringRedisSerializer());
|
|
|
+ template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
|
|
|
return template;
|
|
|
}
|
|
|
|
|
|
+// private Jackson2JsonRedisSerializer jackson2JsonRedisSerialize(){
|
|
|
+// Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
|
|
|
+// ObjectMapper om = new ObjectMapper();
|
|
|
+// om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
|
|
|
+// om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
|
|
|
+// jackson2JsonRedisSerializer.setObjectMapper(om);
|
|
|
+// return jackson2JsonRedisSerializer;
|
|
|
+// }
|
|
|
+
|
|
|
@Bean
|
|
|
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
|
|
|
public BeanFactoryCacheAttributeSourceAdvisor transactionAdvisor() {
|
|
@@ -60,6 +77,8 @@ public class CacheAutoConfiguration {
|
|
|
public CacheAttributeSourcePointcut cacheAttributeSourcePointcut() {
|
|
|
CacheAttributeSourcePointcut cacheAttributeSourcePointcut = new CacheAttributeSourcePointcut();
|
|
|
cacheAttributeSourcePointcut.addAnnotations(CacheLoopSubmit.class);
|
|
|
+ cacheAttributeSourcePointcut.addAnnotations(CacheReadLock.class);
|
|
|
+ cacheAttributeSourcePointcut.addAnnotations(CacheWriteLock.class);
|
|
|
return cacheAttributeSourcePointcut;
|
|
|
}
|
|
|
|
|
@@ -70,9 +89,24 @@ public class CacheAutoConfiguration {
|
|
|
return interceptor;
|
|
|
}
|
|
|
|
|
|
+ // @Bean
|
|
|
+// public CacheManager cacheManager(RedissonClient redissonClient, ElabRedisProperties elabRedisProperties) {
|
|
|
+// // 统一的注解缓存失效配置
|
|
|
+// DefaultRedissonSpringCacheManager defaultRedissonSpringCacheManager = new DefaultRedissonSpringCacheManager(redissonClient);
|
|
|
+// defaultRedissonSpringCacheManager.setCacheConfig(elabRedisProperties.getCacheConfig());
|
|
|
+// return defaultRedissonSpringCacheManager;
|
|
|
+// }
|
|
|
@Bean
|
|
|
- CacheManager cacheManager(RedissonClient redissonClient) {
|
|
|
- return new RedissonSpringCacheManager(redissonClient);
|
|
|
+ public CacheManager cacheManager(RedisConnectionFactory connectionFactory, ElabRedisProperties redisProperties) {
|
|
|
+ // 统一的注解缓存失效配置
|
|
|
+ RedisSerializationContext.SerializationPair<String> keySerializationPair = RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer());
|
|
|
+ RedisSerializationContext.SerializationPair<Object> valueSerialization = RedisSerializationContext.SerializationPair.fromSerializer(new GenericFastJsonRedisSerializer());
|
|
|
+ RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig().serializeKeysWith(keySerializationPair)
|
|
|
+ .serializeValuesWith(valueSerialization).computePrefixWith(cacheName -> redisProperties.getPrefixWith
|
|
|
+ () + cacheName)
|
|
|
+ .entryTtl
|
|
|
+ (Duration
|
|
|
+ .ofMinutes(redisProperties.getTtl()));
|
|
|
+ return RedisCacheManager.builder(connectionFactory).cacheDefaults(configuration).build();
|
|
|
}
|
|
|
-
|
|
|
}
|