本文源碼 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base
從Spring3開始定義Cache和CacheManager接口來統一不一樣的緩存技術;
Cache接口爲緩存的組件規範定義,包含緩存的各類操做集合;
Cache接口下Spring提供了各類緩存的實現;
如RedisCache,EhCacheCache ,ConcurrentMapCache等;java
一、Cache緩存接口
定義緩存操做。實現有:RedisCache、EhCacheCache、ConcurrentMapCache等
二、CacheManager
緩存管理器,管理各類緩存(cache)組件
三、@Cacheable 主要針對方法配置,可以根據方法的請求參數對其進行緩存git
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:是否使用異步模式
四、@CacheEvict
清除緩存github
CacheEvict:緩存清除 key:指定要清除的數據 allEntries = true:指定清除這個緩存中全部的數據 beforeInvocation = false:方法以前執行清除緩存,出現異常不執行 beforeInvocation = true:表明清除緩存操做是在方法運行以前執行,不管方法是否出現異常,緩存都清除
五、@CachePut
保證方法被調用,又但願結果被緩存。
與@Cacheable區別在因而否每次都調用方法,經常使用於更新,寫入redis
CachePut:執行方法且緩存方法執行的結果 修改了數據庫的某個數據,同時更新緩存; 執行流程 1)先調用目標方法 2)而後將目標方法的結果緩存起來
六、@EnableCaching
開啓基於註解的緩存
七、keyGenerator
緩存數據時key生成策略
八、@CacheConfig
統一配置本類的緩存註解的屬性spring
<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>
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(); } } ; } }
@EnableCaching // 開啓Cache 緩存註解 @SpringBootApplication public class CacheApplication { public static void main(String[] args) { SpringApplication.run(CacheApplication.class,args) ; } }
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) { } }
@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 碼雲地址:知了一笑 https://gitee.com/cicadasmile/spring-boot-base