成人视屏在线观看-国产99精品-国产精品1区2区-欧美一级在线观看-国产一区二区日韩-色九九九

您的位置:首頁技術文章
文章詳情頁

Spring cache整合redis代碼實例

瀏覽:39日期:2023-09-07 16:37:23

Spring-Cache是Spring3.1引入的基于注解的緩存技術,本質上它并不是一個具體的緩存實現,而是一個對緩存使用的抽象,通過Spring AOP技術,在原有的代碼上添加少量的注解來實現將這個方法轉成緩存方法的效果。

本來想來個分析源碼,奈何水平有限,先從實戰搞起。

先引入依賴:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.1.6.RELEASE</version></dependency><dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.3</version></dependency>

redis配置:

server: port: 8000spring: redis: host: 23.95.x.x port: 6379 timeout: 20s database: 0 jedis: pool: max-active: 5 max-idle: 3 max-wait: 5s password: testtest

配置類:

package me.yanand.config;import org.springframework.cache.annotation.EnableCaching;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;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.serializer.GenericJackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.RedisSerializationContext;import org.springframework.data.redis.serializer.StringRedisSerializer;import java.time.Duration;@Configuration@EnableCachingpublic class RedisConfig{ private Duration timeOut = Duration.ofMinutes(30); @Bean public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()//設置緩存超時時間 30分鐘.entryTtl(timeOut)//設置key序列化方式.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))//設置value序列化方式.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())).disableCachingNullValues(); return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).transactionAware().build(); }}

主要看@EnableCaching注解,這個注解引入了@Import(CachingConfigurationSelector.class),通過CachingConfigurationSelector把代理創建類、CacheInterceptor、CacheOperationSource、BeanFactoryCacheOperationSourceAdvisor注入到容器,spring通過CacheInterceptor攔截器攔截相關帶有@Cacheable、@CacheEvict、@CachePut注解的方法并執行相關緩存操作。

CacheInterceptor相關源碼:

@Nullableprivate Object execute(final CacheOperationInvoker invoker, Method method, CacheOperationContexts contexts) { if (contexts.isSynchronized()) { CacheOperationContext context = contexts.get(CacheableOperation.class).iterator().next(); //滿足條件執行 if (isConditionPassing(context, CacheOperationExpressionEvaluator.NO_RESULT)) { Object key = generateKey(context, CacheOperationExpressionEvaluator.NO_RESULT); Cache cache = context.getCaches().iterator().next(); try { //這里主要看RedisCache的get方法 return wrapCacheValue(method, cache.get(key, () -> unwrapReturnValue(invokeOperation(invoker)))); } catch (Cache.ValueRetrievalException ex) { // The invoker wraps any Throwable in a ThrowableWrapper instance so we // can just make sure that one bubbles up the stack. throw (CacheOperationInvoker.ThrowableWrapper) ex.getCause(); } } else { //不滿足直接執行相關方法 return invokeOperation(invoker); } } ...省略}

RedisCache相關代碼:

public synchronized <T> T get(Object key, Callable<T> valueLoader) { ValueWrapper result = get(key);//緩存中有值則返回 if (result != null) { return (T) result.get(); }//緩存中不存在則執行相關方法 T value = valueFromLoader(key, valueLoader); put(key, value); return value; }

注解使用:

package me.yanand.dao;import me.yanand.pojo.User;import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Component;@Componentpublic class UserDao { @Cacheable(cacheNames = 'users',key = '#root.targetClass+#name', unless = '#result eq null') public User getUser(String name){ return new User('張三',30); } @CacheEvict(cacheNames = 'users', key = '#root.targetClass+#name') public void delUser(String name){ }}

測試:

Spring cache整合redis代碼實例

通過postman觸發相關方法,現在我們連上redis查看緩存寫入情況

Spring cache整合redis代碼實例

這里我們看到key已經寫入,過期時間也存在

現在我們刪除緩存

Spring cache整合redis代碼實例

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 久久精品国产免费观看99 | 亚洲天堂在线视频观看 | 玖玖99视频| 国产精品三级国语在线看 | 美女视频一区二区三区在线 | 久草视频在线免费播放 | 国产一区在线播放 | 亚洲精品久久九九热 | 国产成人高清精品免费软件 | 亚洲成a人片 | 国内精品2020情侣视频 | 精品400部自拍视频在线播放 | 手机看片国产在线 | 日产一区2区三区有限公司 日产一区两区三区 | 亚欧成人| 国产一级一片 | 精品国产成人高清在线 | 一级毛片在线看 | 精品国产香蕉伊思人在线 | 男人把女人桶到喷白浆的视频 | 国产一区二区三区在线观看影院 | 久久久久久久久久久久久久久久久久 | 日韩免费一级 | 一本色道久久综合亚洲精品高清 | 成人午夜性视频欧美成人 | 久久视频精品线视频在线网站 | 国产欧美日韩不卡在线播放在线 | 久爱午夜精品免费视频 | 毛片在线看免费 | 在线视频一区二区三区四区 | 中文字幕巨乱亚洲 | 欧美高清一级啪啪毛片 | 一级欧美一级日韩 | 草草影院www色极品欧美 | 国产精品久久久久影院 | 国产在线精品二区韩国演艺界 | 欧美成人中文字幕 | 夜夜操夜夜爽 | 亚洲综合色吧 | 在线观看日本视频免费 | 中文精品视频一区二区在线观看 |