基于springboot2.x集成缓存注解及设置过期时间
生活随笔
收集整理的這篇文章主要介紹了
基于springboot2.x集成缓存注解及设置过期时间
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
添加以下配置信息;
/*** 基于注解添加緩存*/ @Configuration @EnableCaching public class CacheConfig extends CachingConfigurerSupport {private final RedisConnectionFactory redisConnectionFactory;CacheConfig(RedisConnectionFactory redisConnectionFactory) {this.redisConnectionFactory = redisConnectionFactory;}@Bean@Overridepublic KeyGenerator keyGenerator() {return (o, method, objects) -> {StringBuilder sb = new StringBuilder(32);sb.append(o.getClass().getSimpleName());sb.append(".");sb.append(method.getName());if (objects.length > 0) {sb.append("#");}String sp = "";for (Object object : objects) {sb.append(sp);if (object == null) {sb.append("NULL");} else {sb.append(object.toString());}sp = ".";}return sb.toString();};}/*** 配置 RedisCacheManager,使用 cache 注解管理 redis 緩存*/@Bean@Overridepublic CacheManager cacheManager() {// 初始化一個(gè)RedisCacheWriterRedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);// 設(shè)置默認(rèn)過期時(shí)間:30 分鐘RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(30))// .disableCachingNullValues()// 使用注解時(shí)的序列化、反序列化.serializeKeysWith(MyRedisCacheManager.STRING_PAIR).serializeValuesWith(MyRedisCacheManager.FASTJSON_PAIR);return new MyRedisCacheManager(cacheWriter, defaultCacheConfig);} }redis配置信息:
@Configuration @ConditionalOnClass(RedisOperations.class) @EnableConfigurationProperties(RedisProperties.class) @Import({LettuceConnectionConfiguration.class}) public class RedisConfig {@Bean@ConditionalOnMissingBean(name = "redisTemplate")public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {RedisTemplate<Object, Object> template = new RedisTemplate<>();// set key serializerStringRedisSerializer serializer = MyRedisCacheManager.STRING_SERIALIZER;// 設(shè)置key序列化類,否則key前面會(huì)多了一些亂碼template.setKeySerializer(serializer);template.setHashKeySerializer(serializer);// fastjson serializerGenericFastJsonRedisSerializer fastSerializer = MyRedisCacheManager.FASTJSON_SERIALIZER;template.setValueSerializer(fastSerializer);template.setHashValueSerializer(fastSerializer);// 如果 KeySerializer 或者 ValueSerializer 沒有配置,則對(duì)應(yīng)的 KeySerializer、ValueSerializer 才使用這個(gè) Serializertemplate.setDefaultSerializer(fastSerializer);// factorytemplate.setConnectionFactory(redisConnectionFactory);template.afterPropertiesSet();return template;}@Bean@ConditionalOnMissingBeanpublic StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {StringRedisTemplate template = new StringRedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;}}重寫RedisCacheManager:
public class MyRedisCacheManager extends RedisCacheManager implements ApplicationContextAware, InitializingBean {private static final Logger LOGGER = LoggerFactory.getLogger(MyRedisCacheManager.class);private ApplicationContext applicationContext;private Map<String, RedisCacheConfiguration> initialCacheConfiguration = new LinkedHashMap<>();/*** key serializer*/public static final StringRedisSerializer STRING_SERIALIZER = new StringRedisSerializer();/*** value serializer* <pre>* 使用 FastJsonRedisSerializer 會(huì)報(bào)錯(cuò):java.lang.ClassCastException* FastJsonRedisSerializer<Object> fastSerializer = new FastJsonRedisSerializer<>(Object.class);* </pre>*/public static final GenericFastJsonRedisSerializer FASTJSON_SERIALIZER = new GenericFastJsonRedisSerializer();/*** key serializer pair*/public static final RedisSerializationContext.SerializationPair<String> STRING_PAIR = RedisSerializationContext.SerializationPair.fromSerializer(STRING_SERIALIZER);/*** value serializer pair*/public static final RedisSerializationContext.SerializationPair<Object> FASTJSON_PAIR = RedisSerializationContext.SerializationPair.fromSerializer(FASTJSON_SERIALIZER);public MyRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {super(cacheWriter, defaultCacheConfiguration);}@Overridepublic Cache getCache(String name) {Cache cache = super.getCache(name);return new RedisCacheWrapper(cache);}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}@Overridepublic void afterPropertiesSet() {String[] beanNames = applicationContext.getBeanNamesForType(Object.class);for (String beanName : beanNames) {final Class clazz = applicationContext.getType(beanName);add(clazz);}super.afterPropertiesSet();}@Overrideprotected Collection<RedisCache> loadCaches() {List<RedisCache> caches = new LinkedList<>();for (Map.Entry<String, RedisCacheConfiguration> entry : initialCacheConfiguration.entrySet()) {caches.add(super.createRedisCache(entry.getKey(), entry.getValue()));}return caches;}private void add(final Class clazz) {ReflectionUtils.doWithMethods(clazz, method -> {ReflectionUtils.makeAccessible(method);CacheExpire cacheExpire = AnnotationUtils.findAnnotation(method, CacheExpire.class);if (cacheExpire == null) {return;}Cacheable cacheable = AnnotationUtils.findAnnotation(method, Cacheable.class);if (cacheable != null) {add(cacheable.cacheNames(), cacheExpire);return;}Caching caching = AnnotationUtils.findAnnotation(method, Caching.class);if (caching != null) {Cacheable[] cs = caching.cacheable();if (cs.length > 0) {for (Cacheable c : cs) {if (cacheExpire != null && c != null) {add(c.cacheNames(), cacheExpire);}}}} else {CacheConfig cacheConfig = AnnotationUtils.findAnnotation(clazz, CacheConfig.class);if (cacheConfig != null) {add(cacheConfig.cacheNames(), cacheExpire);}}}, method -> null != AnnotationUtils.findAnnotation(method, CacheExpire.class));}private void add(String[] cacheNames, CacheExpire cacheExpire) {for (String cacheName : cacheNames) {if (cacheName == null || "".equals(cacheName.trim())) {continue;}long expire = cacheExpire.expire();LOGGER.info("cacheName: {}, expire: {}", cacheName, expire);if (expire >= 0) {// 緩存配置RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(expire)).disableCachingNullValues()// .prefixKeysWith(cacheName).serializeKeysWith(STRING_PAIR).serializeValuesWith(FASTJSON_PAIR);initialCacheConfiguration.put(cacheName, config);} else {LOGGER.warn("{} use default expiration.", cacheName);}}}protected static class RedisCacheWrapper implements Cache {private final Cache cache;RedisCacheWrapper(Cache cache) {this.cache = cache;}@Overridepublic String getName() {// LOGGER.info("name: {}", cache.getName());try {return cache.getName();} catch (Exception e) {LOGGER.error("getName ---> errmsg: {}", e.getMessage(), e);return null;}}@Overridepublic Object getNativeCache() {// LOGGER.info("nativeCache: {}", cache.getNativeCache());try {return cache.getNativeCache();} catch (Exception e) {LOGGER.error("getNativeCache ---> errmsg: {}", e.getMessage(), e);return null;}}@Overridepublic ValueWrapper get(Object o) {// LOGGER.info("get ---> o: {}", o);try {return cache.get(o);} catch (Exception e) {LOGGER.error("get ---> o: {}, errmsg: {}", o, e.getMessage(), e);return null;}}@Overridepublic <T> T get(Object o, Class<T> aClass) {// LOGGER.info("get ---> o: {}, clazz: {}", o, aClass);try {return cache.get(o, aClass);} catch (Exception e) {LOGGER.error("get ---> o: {}, clazz: {}, errmsg: {}", o, aClass, e.getMessage(), e);return null;}}@Overridepublic <T> T get(Object o, Callable<T> callable) {// LOGGER.info("get ---> o: {}", o);try {return cache.get(o, callable);} catch (Exception e) {LOGGER.error("get ---> o: {}, errmsg: {}", o, e.getMessage(), e);return null;}}@Overridepublic void put(Object o, Object o1) {// LOGGER.info("put ---> o: {}, o1: {}", o, o1);try {cache.put(o, o1);} catch (Exception e) {LOGGER.error("put ---> o: {}, o1: {}, errmsg: {}", o, o1, e.getMessage(), e);}}@Overridepublic ValueWrapper putIfAbsent(Object o, Object o1) {// LOGGER.info("putIfAbsent ---> o: {}, o1: {}", o, o1);try {return cache.putIfAbsent(o, o1);} catch (Exception e) {LOGGER.error("putIfAbsent ---> o: {}, o1: {}, errmsg: {}", o, o1, e.getMessage(), e);return null;}}@Overridepublic void evict(Object o) {// LOGGER.info("evict ---> o: {}", o);try {cache.evict(o);} catch (Exception e) {LOGGER.error("evict ---> o: {}, errmsg: {}", o, e.getMessage(), e);}}@Overridepublic void clear() {// LOGGER.info("clear");try {cache.clear();} catch (Exception e) {LOGGER.error("clear ---> errmsg: {}", e.getMessage(), e);}}} }應(yīng)用:
@GetMapping("/getShopByShopNO/{shopNo}") public Mono<ShopDO> getShopByShopNO(@PathVariable("shopNo") final String shopNo){final ShopDO shopByShopNO = shopDAO.getShopByShopNO(shopNo);return Mono.just(shopByShopNO); }/*** 查詢店鋪詳情* @param shopNo* @return */ @Cacheable(value = "shop",key = "'shop_'.concat(#root.args[0])",sync = true) @CacheExpire(30) ShopDO getShopByShopNO(String shopNo);參考:https://www.cnblogs.com/wjwen/p/9301119.html
轉(zhuǎn)載于:https://www.cnblogs.com/hujinshui/p/11341564.html
總結(jié)
以上是生活随笔為你收集整理的基于springboot2.x集成缓存注解及设置过期时间的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用iframe+postMessage
- 下一篇: Oracle 11g服务端的安装和配置