SpringBoot2 基礎案例(13):基於Cache註解,管理Redis快取
本文原始碼: GitHub·點這裡 || GitEE·點這裡
一、Cache快取簡介
從Spring3開始定義Cache和CacheManager介面來統一不同的快取技術;
Cache介面為快取的元件規範定義,包含快取的各種操作集合;
Cache介面下Spring提供了各種快取的實現;
如RedisCache,EhCacheCache ,ConcurrentMapCache等;
二、核心API
1、Cache快取介面
定義快取操作。實現有:RedisCache、EhCacheCache、ConcurrentMapCache等
2、CacheManager
快取管理器,管理各種快取(cache)元件
3、
@Cacheable 主要針對方法配置,能夠根據方法的請求引數對其進行快取
Cacheable 執行流程
1)方法執行之前,按照cacheNames指定的名字先去查詢Cache 快取元件
2)第一次獲取快取如果沒有Cache元件會自動建立
3)Cache中查詢快取的內容,使用一個key,預設就是方法的引數
4)key是按照某種策略生成的;預設是使用keyGenerator生成的,這裡使用自定義配置
5)沒有查到快取就呼叫目標方法;
6)將目標方法返回的結果,放進快取中
Cacheable 註解屬性
cacheNames/value:指定方法返回結果使用的快取元件的名字,可以指定多個快取
key:快取資料使用的key
key/keyGenerator:key的生成器,可以自定義
cacheManager:指定快取管理器
cacheResolver:指定快取解析器
condition:指定符合條件的資料才快取
unless:否定快取;當unless指定的條件為true,方法的返回值就不會被快取
sync:是否使用非同步模式
4、
@CacheEvict
清除快取
CacheEvict:快取清除
key:指定要清除的資料
allEntries = true:指定清除這個快取中所有的資料
beforeInvocation = false:方法之前執行清除快取,出現異常不執行
beforeInvocation = true:代表清除快取操作是在方法執行之前執行,無論方法是否出現異常,快取都清除
5、
@CachePut
保證方法被呼叫,又希望結果被快取。
與
@Cacheable區別在於是否每次都呼叫方法,常用於更新,寫入
CachePut:執行方法且快取方法執行的結果
修改了資料庫的某個資料,同時更新快取;
執行流程
1)先呼叫目標方法
2)然後將目標方法的結果快取起來
6、
@EnableCaching
開啟基於註解的快取
7、keyGenerator
快取資料時key生成策略
8、
@CacheConfig
統一配置本類的快取註解的屬性
三、與SpringBoot2整合
1、核心依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、Cache快取配置
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.lang.reflect.Method;
@Configuration
public class CacheConfig {
/**
* 自定義 Cache 的 key 生成器
*/
@Bean("oneKeyGenerator")
public KeyGenerator getKeyGenerator (){
return new KeyGenerator() {
@Override
public Object generate(Object obj, Method method, Object... objects) {
return "KeyGenerator:"+method.getName();
}
} ;
}
}
3、啟動類註解開啟Cache
@EnableCaching // 開啟Cache 快取註解
@SpringBootApplication
public class CacheApplication {
public static void main(String[] args) {
SpringApplication.run(CacheApplication.class,args) ;
}
}
4、Cache註解使用程式碼
1)封裝增刪改查介面
import com.boot.cache.entity.User;
public interface UserService {
// 增、改、查、刪
User addUser (User user) ;
User updateUser (Integer id) ;
User selectUser (Integer id) ;
void deleteUser (Integer id);
}
2)Cache註解使用案例
import com.boot.cache.entity.User;
import com.boot.cache.service.UserService;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
// 使用自定義的key生成策略
// 快取結果key:addUser::KeyGenerator:addUser
@CachePut(value = "addUser",keyGenerator="oneKeyGenerator")
@Override
public User addUser(User user) {
return user ;
}
// 快取結果key:updateUser::2
@CachePut(value = "updateUser",key = "#result.id")
@Override
public User updateUser(Integer id) {
User user = new User() ;
user.setId(id);
user.setName("smile");
return user;
}
// 快取結果key: selectUser::3
@Cacheable(cacheNames = "selectUser",key = "#id")
@Override
public User selectUser(Integer id) {
User user = new User() ;
user.setId(id);
user.setName("cicadaSmile");
return user;
}
// 刪除指定key: selectUser::3
@CacheEvict(value = "selectUser",key = "#id",beforeInvocation = true)
@Override
public void deleteUser(Integer id) {
}
}
5、測試程式碼塊
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = CacheApplication.class)
public class CacheTest {
@Resource
private UserService userService ;
// 分別測試:增、改、查、刪,四個方法
@Test
public void testAdd (){
User user = new User() ;
user.setId(1);
user.setName("cicada");
userService.addUser(user) ;
}
@Test
public void testUpdate (){
userService.updateUser(2) ;
}
@Test
public void testSelect (){
userService.selectUser(3) ;
}
@Test
public void testDelete (){
userService.deleteUser(3) ;
}
}
四、原始碼地址
GitHub·地址
https://github.com/cicadasmile/spring-boot-base
GitEE·地址
https://gitee.com/cicadasmile/spring-boot-base
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69957347/viewspace-2672210/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SpringBoot2 基礎案例(08):整合Redis資料庫,實現快取管理Spring BootRedis資料庫快取
- SpringBoot2 基礎案例(12):基於轉賬案例,演示事務管理操作Spring Boot
- 基於Spring Cache實現二級快取(Caffeine+Redis)Spring快取Redis
- Spring Cache快取註解Spring快取
- 快取的基礎概念解讀快取
- 快取基礎整理快取
- spring配置redis註解快取SpringRedis快取
- 註解基礎
- 快取內功心法:快取基礎整理快取
- Spring Boot Cache Redis快取Spring BootRedis快取
- SpringBoot 註解呼叫Redis快取Spring BootRedis快取
- spring和ehcache整合,實現基於註解的快取實現Spring快取
- 3_基於註解管理Bean物件Bean物件
- Java基礎——註解Java
- 【Azure Redis 快取 Azure Cache For Redis】Redis連線池Redis快取
- MyBatis基礎:MyBatis快取(5)MyBatis快取
- 分散式快取基礎教程分散式快取
- redis快取優化案例Redis快取優化
- springboot註解方式使用redis快取Spring BootRedis快取
- Java 基礎(十七)註解Java
- 如何給基於 SAP Cloud SDK 的應用增添快取支援 Cache supportCloud快取
- Redis 基礎特性講解Redis
- Spring AOP整合redis(註解方式) 實現快取統一管理SpringRedis快取
- 基於ObjectMapper的本地快取ObjectAPP快取
- java註解基礎與使用Java
- 【Java基礎】反射和註解Java反射
- JAVA基礎-註解記錄Java
- Redis快取穿透/快取雪崩/快取擊穿(案例:產生的原因 解決方案利/弊)Redis快取穿透
- Util應用框架基礎(七) - 快取框架快取
- Web快取基礎:術語、HTTP報頭和快取策略Web快取HTTP
- Spring Boot 2.x基礎教程:使用集中式快取RedisSpring Boot快取Redis
- Redis基礎Redis
- Redis基礎知識詳解Redis
- SpringBoot註解使用redis做快取總結Spring BootRedis快取
- 基於.NET CORE微服務框架 -談談Cache中介軟體和快取降級微服務框架快取
- 關於快取穿透、快取擊穿、快取雪崩的模擬與解決(Redis)快取穿透Redis
- 第五節:基於Canal實現MySQL到Redis快取資料同步MySqlRedis快取
- 合集 - JUC基礎(13)