com.rustknife.jknife.cache.config.AppCacheConfig Maven / Gradle / Ivy
The newest version!
package com.rustknife.jknife.cache.config;
import com.rustknife.jknife.cache.*;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.cache.CacheManager;
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.core.io.ClassPathResource;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.lang.Nullable;
import javax.annotation.Resource;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
/**
* 缓存配置,支持 ehcache + redis 混合部署
* 注: 1、cache name 以 "redis" 打头自动使用 redis
* 2、ehcache 可以不用任何配置,未配置的将会自动创建并使用默认配置,默认缓存永不过期,但是建议配置一下 diskStore path
* 3、ehcache 可以在 ehcache.xml 中配置需要自定义配置的 cache,默认缓存无需配置,配置项不会生效
* 4、未做 redis 连接失败处理,确保未配置 redis 的服务不访问 redis 相关接口
* 5、非注解常用操作使用 CacheKit 工具(如 remove 等,CacheKit 同样将自动识别是否为 redis 操作),
* 复杂操作可以根据缓存类型分别 使用 CacheEhCacheKit 和 CacheRedisKit 工具
* yoke 2018-05-18
*/
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@Configuration
@EnableCaching
public class AppCacheConfig extends CachingConfigurerSupport
{
@Resource
private RedisProperties redisProperties;
@Override
public KeyGenerator keyGenerator() {
return (target, method, params) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(".");
sb.append(method.getName());
sb.append("(");
boolean first = true;
for (Object obj : params) {
if(!first) sb.append(",");
else first = false;
sb.append(obj.toString());
}
sb.append(")");
return sb.toString();
};
}
@Bean
//@ConditionalOnClass(value=org.springframework.data.redis.cache.RedisCache.class)
public RedisCacheManager redisCacheManager(@Qualifier("redisTemplate") RedisTemplate redisTemplate) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.computePrefixWith(new DefaultRedisCachePrefix())
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getKeySerializer())) //key序列化方式
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer())) //value序列化方式
.disableCachingNullValues() //不缓存null值
.entryTtl(Duration.ofSeconds(60 * 60)); //默认缓存过期时间
//CacheRedisKit.setUsePrefix(true);
return RedisCacheManager.builder(redisTemplate.getConnectionFactory())
.cacheDefaults(redisCacheConfiguration)
.transactionAware()
.build();
}
@Bean("redisTemplate")
@Primary
public RedisTemplate
© 2015 - 2025 Weber Informatics LLC | Privacy Policy