欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

SpringBoot2.X如何整合Spring-cache

這篇文章將為大家詳細(xì)講解有關(guān)SpringBoot 2.X如何整合Spring-cache,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到羅山網(wǎng)站設(shè)計(jì)與羅山網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類(lèi)型包括:網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋羅山地區(qū)。

一、Spring Cache介紹

Spring 3.1引入了基于注解的緩存(cache)技術(shù),它本質(zhì)上是一個(gè)對(duì)緩存使用的抽象,通過(guò)在既有代碼中添加少量它定義的各種注解,就能夠達(dá)到緩存方法的效果。

Spring Cache接口為緩存的組件規(guī)范定義,包含緩存的各種操作集合,并提供了各種xxxCache的實(shí)現(xiàn),如redisCache,EhCacheCache,ConcurrentMapCache等;

項(xiàng)目整合Spring Cache后每次調(diào)用需要緩存功能的方法時(shí),Spring會(huì)檢查檢查指定參數(shù)的指定的目標(biāo)方法是否已經(jīng)被調(diào)用過(guò),如果有就直接從緩存中獲取結(jié)果,沒(méi)有就調(diào)用方法并把結(jié)果放到緩存。

二、緩存注解介紹

對(duì)于緩存聲明,Spring的緩存提供了一組java注解:

@CacheConfig:設(shè)置類(lèi)級(jí)別上共享的一些常見(jiàn)緩存設(shè)置。

  • @Cacheable:觸發(fā)緩存寫(xiě)入。

  • @CacheEvict:觸發(fā)緩存清除。

  • @Caching 將多種緩存操作分組

  • @CachePut:更新緩存(不會(huì)影響到方法的運(yùn)行)。

@CacheConfig

@CacheConfig(cacheNames = "user")
@Service
public class UserServiceImpl implements UserService {}

@Cacheable

  • 如果key不存在,查詢db,并將結(jié)果更新到緩存中。

  • 如果key存在,直接查詢緩存中的數(shù)據(jù)。

  //查詢數(shù)據(jù)庫(kù)后 數(shù)據(jù)添加到緩存
  @Override
  @Cacheable(cacheNames = "cacheManager", key = "'USER:'+#id", unless = "#result == null")
  public User getUser(Integer id) {
    return repository.getUser(id);
  }

@CachePut

  //修改數(shù)據(jù)后更新緩存
  @Override
  @CachePut(cacheNames = "cacheManager", key = "'USER:'+#updateUser.id", unless = "#result == null")
  public User updateUser(User updateUser) {
    return repository.save(updateUser);
  }

@CacheEvict

  //清除一條緩存,key為要清空的數(shù)據(jù)
  @Override
  @CacheEvict(cacheNames = "cacheManager", key = "'USER:'+#id")
  public void deleteUser(Integer id) {
    repository.deleteById(id);
  }

三、Spring Boot+Cache實(shí)戰(zhàn)

1、pom.xml引入jar包

<!-- 引入緩存 starter -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- 引入 redis -->
<dependency>
  <groupId&>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、啟動(dòng)類(lèi)添加@EnableCaching注解

@EnableCaching注解是spring framework中的注解驅(qū)動(dòng)的緩存管理功能,當(dāng)你在配置類(lèi)(@Configuration)上使用@EnableCaching注解時(shí),會(huì)觸發(fā)一個(gè)post processor,這會(huì)掃描每一個(gè)spring bean,查看是否已經(jīng)存在注解對(duì)應(yīng)的緩存。如果找到了,就會(huì)自動(dòng)創(chuàng)建一個(gè)代理攔截方法調(diào)用,使用緩存的bean執(zhí)行處理。

啟動(dòng)類(lèi)部分代碼如下:

3、配置數(shù)據(jù)庫(kù)和redis連接

application.properties部分配置如下:

#配置數(shù)據(jù)源信息
spring.datasource.driver-class-name=com.MySQL.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.1.1:3306/test
spring.datasource.username=root
spring.datasource.password=1234
#配置jpa
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jackson.serialization.indent_output=true
# Redis服務(wù)器地址
spring.redis.host=192.168.1.1
# database
spring.redis.database = 1
# Redis服務(wù)器連接端口 使用默認(rèn)端口6379可以省略配置
spring.redis.port=6379
# Redis服務(wù)器連接密碼(默認(rèn)為空)
spring.redis.password=1234
# 連接池最大連接數(shù)(如果配置&lt;=0,則沒(méi)有限制 )
spring.redis.jedis.pool.max-active=8

4、配置CacheManager

WebConfig.java部分配置如下:

@Bean
  public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
    //緩存配置對(duì)象
    RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
 
    redisCacheConfiguration = redisCacheConfiguration.entryTtl(Duration.ofMinutes(30L)) //設(shè)置緩存的默認(rèn)超時(shí)時(shí)間:30分鐘
        .disableCachingNullValues()       //如果是空值,不緩存
        .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))     //設(shè)置key序列化器
        .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer((valueSerializer()))); //設(shè)置value序列化器
 
    return RedisCacheManager
        .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
        .cacheDefaults(redisCacheConfiguration).build();
  }

5、使用緩存注解

UserServiceImpl.java中使用緩存注解示例如下:

//查詢數(shù)據(jù)庫(kù)后 數(shù)據(jù)添加到緩存
  @Override
  @Cacheable(cacheNames = "cacheManager", key = "'USER:'+#id", unless = "#result == null")
  public User getUser(Integer id) {
    return repository.getUser(id);
  }
 
  //清除一條緩存,key為要清空的數(shù)據(jù)
  @Override
  @CacheEvict(cacheNames = "cacheManager", key = "'USER:'+#id")
  public void deleteUser(Integer id) {
    repository.deleteById(id);
  }
 
 
  //修改數(shù)據(jù)后更新緩存
  @Override
  @CachePut(cacheNames = "cacheManager", key = "'USER:'+#updateUser.id", unless = "#result == null")
  public User updateUser(User updateUser) {
    return repository.save(updateUser);
  }

6、查看緩存效果

啟動(dòng)服務(wù)后,訪問(wèn)兩次http://localhost:8090/getUser/2接口,從打印日志可以看到,第一次請(qǐng)求打印了sql說(shuō)明查詢了數(shù)據(jù)庫(kù),耗時(shí)960,而第二次直接查詢的緩存耗時(shí)66,增加緩存后速度提升非常明顯。

SpringBoot 2.X如何整合Spring-cache

postman訪問(wèn)截圖

SpringBoot 2.X如何整合Spring-cache

日志截圖

7、注意事項(xiàng)

Spring cache是基于Spring Aop來(lái)動(dòng)態(tài)代理機(jī)制來(lái)對(duì)方法的調(diào)用進(jìn)行切面,這里關(guān)鍵點(diǎn)是對(duì)象的引用問(wèn)題,如果對(duì)象的方法是內(nèi)部調(diào)用(即 this 引用)而不是外部引用,則會(huì)導(dǎo)致 proxy 失效,那么我們的切面就失效,也就是說(shuō)上面定義的各種注釋包括 @Cacheable、@CachePut 和 @CacheEvict 都會(huì)失效。

關(guān)于“SpringBoot 2.X如何整合Spring-cache”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

當(dāng)前名稱:SpringBoot2.X如何整合Spring-cache
轉(zhuǎn)載注明:http://chinadenli.net/article40/poojho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站網(wǎng)站改版、網(wǎng)站排名、小程序開(kāi)發(fā)、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)