最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot 2.X整合Spring-cache(讓你的網(wǎng)站速度飛起來)

 更新時間:2019年09月02日 11:42:49   作者:Hollis在csdn  
這篇文章主要介紹了Spring Boot 2.X整合Spring-cache(讓你的網(wǎng)站速度飛起來),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

計算機領(lǐng)域有人說過一句名言:“計算機科學領(lǐng)域的任何問題都可以通過增加一個中間層來解決”,今天我們就用Spring-cache給網(wǎng)站添加一層緩存,讓你的網(wǎng)站速度飛起來。

本文目錄

一、Spring Cache介紹二、緩存注解介紹三、Spring Boot+Cache實戰(zhàn)1、pom.xml引入jar包2、啟動類添加@EnableCaching注解3、配置數(shù)據(jù)庫和redis連接4、配置CacheManager5、使用緩存注解6、查看緩存效果7、注意事項

一、Spring Cache介紹

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

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

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

二、緩存注解介紹

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

@CacheConfig:設(shè)置類級別上共享的一些常見緩存設(shè)置。

  • @Cacheable:觸發(fā)緩存寫入。
  • @CacheEvict:觸發(fā)緩存清除。
  • @Caching 將多種緩存操作分組
  • @CachePut:更新緩存(不會影響到方法的運行)。

@CacheConfig

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

@Cacheable

  • 如果key不存在,查詢db,并將結(jié)果更新到緩存中。
  • 如果key存在,直接查詢緩存中的數(shù)據(jù)。
  //查詢數(shù)據(jù)庫后 數(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實戰(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、啟動類添加@EnableCaching注解

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

啟動類部分代碼如下:

3、配置數(shù)據(jù)庫和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服務器地址
spring.redis.host=192.168.1.1
# database
spring.redis.database = 1
# Redis服務器連接端口 使用默認端口6379可以省略配置
spring.redis.port=6379
# Redis服務器連接密碼(默認為空)
spring.redis.password=1234
# 連接池最大連接數(shù)(如果配置&lt;=0,則沒有限制 )
spring.redis.jedis.pool.max-active=8

4、配置CacheManager

WebConfig.java部分配置如下:

@Bean
  public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
    //緩存配置對象
    RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
 
    redisCacheConfiguration = redisCacheConfiguration.entryTtl(Duration.ofMinutes(30L)) //設(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ù)庫后 數(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、查看緩存效果

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


postman訪問截圖


日志截圖

7、注意事項

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

到此Spring Boot 2.X中整合Spring-cache與Redis功能全部實現(xiàn),有問題歡迎留言溝通哦!

https://github.com/suisui2019/springboot-study

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java多線程之多線程異常捕捉

    Java多線程之多線程異常捕捉

    在java多線程程序中,所有線程都不允許拋出未捕獲的checked exception,也就是說各個線程需要自己把自己的checked exception處理掉,通過此篇文章給大家分享Java多線程之多線程異常捕捉,需要的朋友可以參考下
    2015-08-08
  • java下使用kaptcha生成驗證碼

    java下使用kaptcha生成驗證碼

    這篇文章主要介紹了java下使用kaptcha生成驗證碼,感興趣的小伙伴們可以參考一下
    2015-12-12
  • springboot運行到dokcer中 dockerfile的場景分析

    springboot運行到dokcer中 dockerfile的場景分析

    這篇文章主要介紹了springboot運行到dokcer中 dockerfile,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • SpringBoot實現(xiàn)多端口監(jiān)聽的代碼示例

    SpringBoot實現(xiàn)多端口監(jiān)聽的代碼示例

    當你需要在同一個Spring Boot應用中,通過不同的端口來提供不同的服務或功能時,就需要實現(xiàn)多端口監(jiān)聽,所以本文給大家介紹了SpringBoot實現(xiàn)多端口監(jiān)聽的方法示例,并有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-09-09
  • Java通過關(guān)閉Socket終止線程

    Java通過關(guān)閉Socket終止線程

    這篇文章主要為大家詳細介紹了Java通過關(guān)閉Socket終止線程的相關(guān)代碼
    2017-04-04
  • 淺談java中String的兩種賦值方式的區(qū)別

    淺談java中String的兩種賦值方式的區(qū)別

    這篇文章主要介紹了淺談java中String的兩種賦值方式的區(qū)別。簡單介紹了兩種賦值方式,然后進行了實例分析,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java基礎(chǔ)詳解之包裝類的裝箱拆箱

    Java基礎(chǔ)詳解之包裝類的裝箱拆箱

    這篇文章主要介紹了Java基礎(chǔ)詳解之包裝類的裝箱拆箱,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java日志軟件Log4j的基本使用教程

    Java日志軟件Log4j的基本使用教程

    這篇文章主要介紹了Java日志軟件Log4j的基本使用教程,包括回滾和發(fā)送日志郵件等基本功能使用的講解,需要的朋友可以參考下
    2015-12-12
  • Java實現(xiàn)線程的四種方式解析

    Java實現(xiàn)線程的四種方式解析

    這篇文章主要介紹了Java實現(xiàn)線程的四種方式解析,線程是進程中的一個執(zhí)行單元,負責當前進程中程序的執(zhí)行,一個進程中至少有一個線程,一個進程中是可以有多個線程的,這個應用程序也可以稱之為多線程程序,需要的朋友可以參考下
    2023-10-10
  • Mybatis自關(guān)聯(lián)查詢一對多查詢的實現(xiàn)示例

    Mybatis自關(guān)聯(lián)查詢一對多查詢的實現(xiàn)示例

    這篇文章主要介紹了Mybatis自關(guān)聯(lián)查詢一對多查詢的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02

最新評論

和林格尔县| 桃源县| 合川市| 洮南市| 郸城县| 苗栗市| 如皋市| 义马市| 海口市| 东兴市| 柳河县| 叶城县| 拉萨市| 龙井市| 巴南区| 临澧县| 上蔡县| 通河县| 宜黄县| 阳曲县| 平安县| 民丰县| 临潭县| 仁怀市| 大理市| 遂宁市| 福清市| 巴林右旗| 江源县| 馆陶县| 叙永县| 公主岭市| 紫阳县| 济源市| 澎湖县| 聊城市| 宁海县| 贡觉县| 吉林省| 田阳县| 缙云县|