Spring Boot2 系列教程(二十九)Spring Boot 整合 Redis
- 2019 年 11 月 24 日
- 筆記
經過 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