Spring Boot2 系列教程(二十九)Spring Boot 整合 Redis

經過 Spring Boot 的整合封裝與自動化配置,在 Spring Boot 中整合Redis 已經變得非常容易了,開發者只需要引入 Spring Data Redis 依賴,然後簡單配下 redis 的基本信息,系統就會提供一個 RedisTemplate 供開發者使用,但是今天鬆哥想和大夥聊的不是這種用法,而是結合 Cache 的用法。Spring3.1 中開始引入了令人激動的 Cache,在 Spring Boot 中,可以非常方便的使用 Redis 來作爲 Cache 的實現,進而實現數據的緩存。

工程創建

首先創建一個 Spring Boot 工程,注意創建的時候需要引入三個依賴, web、cache 以及 redis,如下圖:

對應的依賴內容如下:

<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>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

基本配置

工程創建好之後,首先需要簡單配置一下 Redis,Redis 的基本信息,另外,這裏要用到 Cache,因此還需要稍微配置一下 Cache,如下:

spring.redis.port=6380
spring.redis.host=192.168.66.128

spring.cache.cache-names=c1

簡單起見,這裏我只是配置了 Redis 的端口和地址,然後給緩存取了一個名字,這個名字在後文會用到。

另外,還需要在配置類上添加如下代碼,表示開啓緩存:

@SpringBootApplication
@EnableCaching
public class RediscacheApplication {
    public static void main(String[] args) {
        SpringApplication.run(RediscacheApplication.class, args);
    }
}

完成了這些配置之後,Spring Boot 就會自動幫我們在後臺配置一個 RedisCacheManager,相關的配置是在org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration 類中完成的。部分源碼如下:

@Configuration
@ConditionalOnClass(RedisConnectionFactory.class)
@AutoConfigureAfter(RedisAutoConfiguration.class)
@ConditionalOnBean(RedisConnectionFactory.class)
@ConditionalOnMissingBean(CacheManager.class)
@Conditional(CacheCondition.class)
class RedisCacheConfiguration {
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory,
            ResourceLoader resourceLoader) {
        RedisCacheManagerBuilder builder = RedisCacheManager
                .builder(redisConnectionFactory)
                .cacheDefaults(determineConfiguration(resourceLoader.getClassLoader()));
        List<String> cacheNames = this.cacheProperties.getCacheNames();
        if (!cacheNames.isEmpty()) {
            builder.initialCacheNames(new LinkedHashSet<>(cacheNames));
        }
        return this.customizerInvoker.customize(builder.build());
    }
}

看類上的註解,發現在萬事俱備的情況下,系統會自動提供一個 RedisCacheManager 的 Bean,這個 RedisCacheManager 間接實現了 Spring 中的 Cache 接口,有了這個 Bean,我們就可以直接使用 Spring 中的緩存註解和接口了,而緩存數據則會被自動存儲到 Redis 上。在單機的 Redis 中,這個 Bean 系統會自動提供,如果是 Redis 集羣,這個 Bean 需要開發者來提供(後面的文章會講到)。

緩存使用

這裏主要向小夥伴們介紹緩存中幾個核心的註解使用。

@CacheConfig

這個註解在類上使用,用來描述該類中所有方法使用的緩存名稱,當然也可以不使用該註解,直接在具體的緩存註解上配置名稱,示例代碼如下:

@Service
@CacheConfig(cacheNames = "c1")
public class UserService {
}

@Cacheable

這個註解一般加在查詢方法上,表示將一個方法的返回值緩存起來,默認情況下,緩存的 key 就是方法的參數,緩存的 value 就是方法的返回值。示例代碼如下:

@Cacheable(key = "#id")
public User getUserById(Integer id,String username) {
    System.out.println("getUserById");
    return getUserFromDBById(id);
}

當有多個參數時,默認就使用多個參數來做 key,如果只需要其中某一個參數做 key,則可以在 @Cacheable 註解中,通過 key 屬性來指定 key,如上代碼就表示只使用 id 作爲緩存的 key,如果對 key 有複雜的要求,可以自定義 keyGenerator。當然,Spring Cache 中提供了 root 對象,可以在不定義 keyGenerator 的情況下實現一些複雜的效果:

@CachePut

這個註解一般加在更新方法上,當數據庫中的數據更新後,緩存中的數據也要跟着更新,使用該註解,可以將方法的返回值自動更新到已經存在的 key 上,示例代碼如下:

@CachePut(key = "#user.id")
public User updateUserById(User user) {
    return user;
}

@CacheEvict

這個註解一般加在刪除方法上,當數據庫中的數據刪除後,相關的緩存數據也要自動清除,該註解在使用的時候也可以配置按照某種條件刪除(condition 屬性)或者或者配置清除所有緩存(allEntries 屬性),示例代碼如下:

@CacheEvict()
public void deleteUserById(Integer id) {
    //在這裏執行刪除操作, 刪除是去數據庫中刪除
}

總結

在 Spring Boot 中,使用 Redis 緩存,既可以使用 RedisTemplate 自己來實現,也可以使用使用這種方式,這種方式是 Spring Cache 提供的統一接口,實現既可以是 Redis,也可以是 Ehcache 或者其他支持這種規範的緩存框架。從這個角度來說,Spring Cache 和 Redis、Ehcache 的關係就像 JDBC 與各種數據庫驅動的關係。

好了,關於這個問題就說到這裏,有問題歡迎留言討論。本文相關案例我已經上傳到 GitHub ,大家可以自行下載:https://github.com/lenve/javaboy-code-samples

掃碼關注鬆哥,公衆號後臺回覆 2TB,獲取鬆哥獨家 超2TB 免費 Java 學習乾貨

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章