本篇內(nèi)容介紹了“springboot2.x怎么集成緩存注解及設(shè)置過期時間”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
公司主營業(yè)務:成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出阿榮免費做網(wǎng)站回饋大家。
/** * 基于注解添加緩存 */ @Configuration @EnableCaching public class CacheConfig extends CachingConfigurerSupport { private final redisConnectionFactory redisConnectionFactory; CacheConfig(RedisConnectionFactory redisConnectionFactory) { this.redisConnectionFactory = redisConnectionFactory; } @Bean @Override public 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 @Override public CacheManager cacheManager() { // 初始化一個RedisCacheWriter RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory); // 設(shè)置默認過期時間:30 分鐘 RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofMinutes(30)) // .disableCachingNullValues() // 使用注解時的序列化、反序列化 .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 serializer StringRedisSerializer serializer = MyRedisCacheManager.STRING_SERIALIZER; // 設(shè)置key序列化類,否則key前面會多了一些亂碼 template.setKeySerializer(serializer); template.setHashKeySerializer(serializer); // fastjson serializer GenericFastJsonRedisSerializer fastSerializer = MyRedisCacheManager.FASTJSON_SERIALIZER; template.setValueSerializer(fastSerializer); template.setHashValueSerializer(fastSerializer); // 如果 KeySerializer 或者 ValueSerializer 沒有配置,則對應的 KeySerializer、ValueSerializer 才使用這個 Serializer template.setDefaultSerializer(fastSerializer); // factory template.setConnectionFactory(redisConnectionFactory); template.afterPropertiesSet(); return template; } @Bean @ConditionalOnMissingBean public 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 會報錯: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); } @Override public Cache getCache(String name) { Cache cache = super.getCache(name); return new RedisCacheWrapper(cache); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } @Override public void afterPropertiesSet() { String[] beanNames = applicationContext.getBeanNamesForType(Object.class); for (String beanName : beanNames) { final Class clazz = applicationContext.getType(beanName); add(clazz); } super.afterPropertiesSet(); } @Override protected 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; } @Override public String getName() { // LOGGER.info("name: {}", cache.getName()); try { return cache.getName(); } catch (Exception e) { LOGGER.error("getName ---> errmsg: {}", e.getMessage(), e); return null; } } @Override public Object getNativeCache() { // LOGGER.info("nativeCache: {}", cache.getNativeCache()); try { return cache.getNativeCache(); } catch (Exception e) { LOGGER.error("getNativeCache ---> errmsg: {}", e.getMessage(), e); return null; } } @Override public 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; } } @Override public <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; } } @Override public <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; } } @Override public 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); } } @Override public 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; } } @Override public 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); } } @Override public void clear() { // LOGGER.info("clear"); try { cache.clear(); } catch (Exception e) { LOGGER.error("clear ---> errmsg: {}", e.getMessage(), e); } } } }
@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
“springboot2.x怎么集成緩存注解及設(shè)置過期時間”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
當前名稱:springboot2.x怎么集成緩存注解及設(shè)置過期時間
當前URL:http://sd-ha.com/article8/ghseop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務器、App開發(fā)、App設(shè)計、網(wǎng)站維護、網(wǎng)站改版、虛擬主機
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)