Spring Boot 2.X整合Spring-cache(讓你的網(wǎng)站速度飛起來(lái))
計(jì)算機(jī)領(lǐng)域有人說(shuō)過(guò)一句名言:“計(jì)算機(jī)科學(xué)領(lǐng)域的任何問(wèn)題都可以通過(guò)增加一個(gè)中間層來(lái)解決”,今天我們就用Spring-cache給網(wǎng)站添加一層緩存,讓你的網(wǎng)站速度飛起來(lái)。
本文目錄
一、Spring Cache介紹二、緩存注解介紹三、Spring Boot+Cache實(shí)戰(zhàn)1、pom.xml引入jar包2、啟動(dòng)類添加@EnableCaching注解3、配置數(shù)據(jù)庫(kù)和redis連接4、配置CacheManager5、使用緩存注解6、查看緩存效果7、注意事項(xiàng)
一、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è)置類級(jí)別上共享的一些常見(jiàn)緩存設(shè)置。
- @Cacheable:觸發(fā)緩存寫入。
- @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)類添加@EnableCaching注解
@EnableCaching注解是spring framework中的注解驅(qū)動(dòng)的緩存管理功能,當(dāng)你在配置類(@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)類部分代碼如下:
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ù)(如果配置<=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,增加緩存后速度提升非常明顯。

postman訪問(wèn)截圖

日志截圖
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ì)失效。
到此Spring Boot 2.X中整合Spring-cache與Redis功能全部實(shí)現(xiàn),有問(wèn)題歡迎留言溝通哦!
https://github.com/suisui2019/springboot-study
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Spring Boot整合Spring Cache及Redis過(guò)程解析
- Spring Cache手動(dòng)清理Redis緩存
- springboot接入cachecloud redis示例實(shí)踐
- SpringBoot中Shiro緩存使用Redis、Ehcache的方法
- SpringBoot加入Guava Cache實(shí)現(xiàn)本地緩存代碼實(shí)例
- 使用ehcache三步搞定springboot緩存的方法示例
- springboot使用GuavaCache做簡(jiǎn)單緩存處理的方法
- Spring Cache擴(kuò)展功能實(shí)現(xiàn)過(guò)程解析
相關(guān)文章
springboot運(yùn)行到dokcer中 dockerfile的場(chǎng)景分析
這篇文章主要介紹了springboot運(yùn)行到dokcer中 dockerfile,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
SpringBoot實(shí)現(xiàn)多端口監(jiān)聽(tīng)的代碼示例
當(dāng)你需要在同一個(gè)Spring Boot應(yīng)用中,通過(guò)不同的端口來(lái)提供不同的服務(wù)或功能時(shí),就需要實(shí)現(xiàn)多端口監(jiān)聽(tīng),所以本文給大家介紹了SpringBoot實(shí)現(xiàn)多端口監(jiān)聽(tīng)的方法示例,并有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-09-09
Mybatis自關(guān)聯(lián)查詢一對(duì)多查詢的實(shí)現(xiàn)示例
這篇文章主要介紹了Mybatis自關(guān)聯(lián)查詢一對(duì)多查詢的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02

