具體在Springboot中使用緩存如下:
1.在pom.xml中引入cache依賴刊橘,添加如下內(nèi)容:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2.在Spring Boot主類中增加@EnableCaching注解開啟緩存功能骂删,如下:
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3.在數(shù)據(jù)訪問接口中秋冰,增加緩存配置注解,如:
@CacheConfig(cacheNames = "users")
public interface UserRepository extends JpaRepository<User, Long> {
@Cacheable
User findByName(String name);
}
SpringBoot支持很多種緩存方式:redis、guava、ehcahe塌碌、jcache等等。
說明下redis和ehcache的區(qū)別:
Redis:屬于獨立的運行程序旬盯,需要單獨安裝后台妆,使用Java中的Jedis來操縱。因為它是獨立胖翰,所以如果你寫個單元測試程序接剩,放一些數(shù)據(jù)在Redis中,然后又寫一個程序去拿數(shù)據(jù)萨咳,那么是可以拿到這個數(shù)據(jù)的懊缺。,
ehcache:與Redis明顯不同某弦,它與java程序是綁在一起的桐汤,java程序活著,它就活著靶壮。譬如怔毛,寫一個獨立程序放數(shù)據(jù),再寫一個獨立程序拿數(shù)據(jù)腾降,那么是拿不到數(shù)據(jù)的拣度。只能在獨立程序中才能拿到數(shù)據(jù)。
如果使用Ehcache螃壤,只需要在工程中加入ehcache.xml配置文件并在pom.xml中增加ehcache依賴抗果,框架只要發(fā)現(xiàn)該文件,就會創(chuàng)建EhCache的緩存管理器奸晴。
1冤馏、在src/main/resources目錄下創(chuàng)建:ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
<cache name="users" maxEntriesLocalHeap="200" timeToLiveSeconds="600">
</cache>
</ehcache>
對于EhCache的配置文件也可以通過application.properties文件中使用spring.cache.ehcache.config屬性來指定,比如:
spring.cache.ehcache.config=classpath:config/another-config.xml
2寄啼、在pom.xml中加入
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
Cache注解詳解
@CacheConfig
:主要用于配置該類中會用到的一些共用的緩存配置逮光。在這里@CacheConfig(cacheNames = "users")
:配置了該數(shù)據(jù)訪問對象中返回的內(nèi)容將存儲于名為users的緩存對象中,我們也可以不使用該注解墩划,直接通過@Cacheable
自己配置緩存集的名字來定義涕刚。-
@Cacheable
:配置了findByName函數(shù)的返回值將被加入緩存。同時在查詢時乙帮,會先從緩存中獲取杜漠,若不存在才再發(fā)起對數(shù)據(jù)庫的訪問。該注解主要有下面幾個參數(shù):-
value
察净、cacheNames
:兩個等同的參數(shù)(cacheNames
為Spring 4新增驾茴,作為value
的別名),用于指定緩存存儲的集合名氢卡。由于Spring 4中新增了@CacheConfig
沟涨,因此在Spring 3中原本必須有的value
屬性,也成為非必需項了 -
key
:緩存對象存儲在Map集合中的key值异吻,非必需裹赴,缺省按照函數(shù)的所有參數(shù)組合作為key值,若自己配置需使用SpEL表達式诀浪,比如:@Cacheable(key = "#p0")
:使用函數(shù)第一個參數(shù)作為緩存的key值棋返,更多關于SpEL表達式的詳細內(nèi)容可參考官方文檔 -
condition
:緩存對象的條件,非必需雷猪,也需使用SpEL表達式睛竣,只有滿足表達式條件的內(nèi)容才會被緩存,比如:@Cacheable(key = "#p0", condition = "#p0.length() < 3")
求摇,表示只有當?shù)谝粋€參數(shù)的長度小于3的時候才會被緩存射沟,若做此配置上面的AAA用戶就不會被緩存殊者,讀者可自行實驗嘗試。 -
unless
:另外一個緩存條件參數(shù)验夯,非必需猖吴,需使用SpEL表達式。它不同于condition
參數(shù)的地方在于它的判斷時機挥转,該條件是在函數(shù)被調(diào)用之后才做判斷的海蔽,所以它可以通過對result進行判斷。 -
keyGenerator
:用于指定key生成器绑谣,非必需党窜。若需要指定一個自定義的key生成器,我們需要去實現(xiàn)org.springframework.cache.interceptor.KeyGenerator
接口借宵,并使用該參數(shù)來指定幌衣。需要注意的是:該參數(shù)與key
是互斥的 -
cacheManager
:用于指定使用哪個緩存管理器,非必需壤玫。只有當有多個時才需要使用 -
cacheResolver
:用于指定使用那個緩存解析器泼掠,非必需。需通過org.springframework.cache.interceptor.CacheResolver
接口來實現(xiàn)自己的緩存解析器垦细,并用該參數(shù)指定择镇。
-
除了這里用到的兩個注解之外,還有下面幾個核心注解:
-
@CachePut
:配置于函數(shù)上括改,能夠根據(jù)參數(shù)定義條件來進行緩存腻豌,它與@Cacheable
不同的是,它每次都會真是調(diào)用函數(shù)嘱能,所以主要用于數(shù)據(jù)新增和修改操作上吝梅。它的參數(shù)與@Cacheable
類似,具體功能可參考上面對@Cacheable
參數(shù)的解析 -
@CacheEvict
:配置于函數(shù)上惹骂,通常用在刪除方法上苏携,用來從緩存中移除相應數(shù)據(jù)。除了同@Cacheable
一樣的參數(shù)之外对粪,它還有下面兩個參數(shù):-
allEntries
:非必需右冻,默認為false。當為true時著拭,會移除所有數(shù)據(jù) -
beforeInvocation
:非必需纱扭,默認為false,會在調(diào)用方法之后移除數(shù)據(jù)儡遮。當為true時乳蛾,會在調(diào)用方法之前移除數(shù)據(jù)。
-
【設定過期時間】
@Cacheable(value = "example#${select.cache.timeout:1000}", key = "")
//example 是cache容器名字 #后邊的是SpEL表達式
更多
- 如果需要使用SpringBoot緩存,首先需要開啟基于注解的緩存肃叶。
- 第二步是給需要緩存的方法加上相應的注解蹂随,表示將方法的運行結(jié)果進行緩存,以后查詢相同的數(shù)據(jù)直接從緩存中獲取因惭,不需要查詢數(shù)據(jù)庫岳锁。
- 在緩存中CacheManager管理多個Cache組件,對緩存的真正CRUD操作在Cache組件中筛欢,每一個緩存組件有自己唯一一個名字浸锨;我們通過cacheNames指定名字唇聘。
- 我們可以通過指定緩存條件版姑,只有當條件滿足的時候才緩存。
-
我們可以使用unless來否定緩存迟郎,當指定的條件為true剥险,方法的返回值就不會緩存,這個可以以獲取的結(jié)果進行判斷宪肖。
如果返回的結(jié)果為空表制,我們不進行緩存。
-
配置完成之后控乾,我們查詢控制臺日志的打印情況么介。
執(zhí)行連續(xù)刷新,控制臺上只打印了一次SQL語句蜕衡。
測試緩存
【以下內(nèi)容摘自】
【作者:dalaoyang 】
【鏈接:http://www.reibang.com/p/20975889cf15】
還是和以往一樣壤短,使用Controller做測試,先展示一下代碼:
package com.dalaoyang.controller;
import com.dalaoyang.entity.House;
import com.dalaoyang.repository.HouseRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author dalaoyang
* @Description
* @project springboot_learn
* @package com.dalaoyang.controller
* @email yangyang@dalaoyang.cn
* @date 2018/5/28
*/
@RestController
public class HouseController {
@Autowired
private HouseRepository houseRepository;
//http://localhost:8888/saveHouse?id=1&houseName=別墅&houseSize=1220平方米
@GetMapping("/saveHouse")
@CachePut(value = "house", key = "#id")
public House saveHouse(Integer id,String houseName,String houseSize){
House house = new House(id,houseName, houseSize);
houseRepository.save(house);
return house;
}
//http://localhost:8888/queryHouse?id=1
@GetMapping("/queryHouse")
@Cacheable(value = "house", key = "#id")
public House queryHouse(Integer id){
House house = houseRepository.findOne(id);
return house;
}
//http://localhost:8888/deleteHouse?id=1
@GetMapping("/deleteHouse")
@CacheEvict(value = "house", key = "#id")
public String deleteHouse(Integer id){
houseRepository.delete(id);
return "success";
}
//http://localhost:8888/deleteCache
@GetMapping("/deleteCache")
@CacheEvict(value = "house", allEntries = true)
public void deleteCache() {
}
}
解釋測試方法
1.saveHouse方法
方法中使用到了@CachePut注解慨仿,這個注解直接將返回值放入緩存中久脯,通常用于保存和修改方法中
2.queryHouse方法
方法中使用到了@Cacheable注解,這個注解在執(zhí)行前先查看緩存中是不是已經(jīng)存在了镰吆,如果存在帘撰,直接返回。如果不存在万皿,將方法的返回值放入緩存摧找。
3.deleteHouse方法
方法中使用到了@CacheEvict注解,這個注解在執(zhí)行方法執(zhí)行成功后會從緩存中移除
4.deleteCache方法
這個方法的也是使用的@CacheEvict注解牢硅,不同的是使用了allEntries熟悉慰于,默認為false,true的時候移除所有緩存唤衫。