SpringBoot2.0 基礎案例(13):基於Cache註解模式,管理Redis緩存

本文源碼
GitHub地址:知了一笑
https://github.com/cicadasmile/spring-boot-base

1、Cache緩存簡介

從Spring3開始定義Cache和CacheManager接口來統一不一樣的緩存技術;
Cache接口爲緩存的組件規範定義,包含緩存的各類操做集合;
Cache接口下Spring提供了各類緩存的實現;
如RedisCache,EhCacheCache ,ConcurrentMapCache等;java

2、核心API

一、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

3、與SpringBoot2.0整合

一、核心依賴

<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>

二、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();
            }
        } ;
    }
}

三、啓動類註解開啓Cache

@EnableCaching            // 開啓Cache 緩存註解
@SpringBootApplication
public class CacheApplication {
    public static void main(String[] args) {
        SpringApplication.run(CacheApplication.class,args) ;
    }
}

四、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) {

    }
}

五、測試代碼塊

@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) ;
    }
}

4、源代碼地址

GitHub地址:知了一笑
https://github.com/cicadasmile/spring-boot-base
碼雲地址:知了一笑
https://gitee.com/cicadasmile/spring-boot-base


相關文章
相關標籤/搜索