深入Spring Boot (十一):整合Redis詳解
Spring Boot為Redis的Lettuce和Jedis客戶端庫提供了基本的自動配置,並且可以使用Spring Data Redis完成更多的操作。本篇將介紹如何整合Redis及使用Redis實現簡單的查詢快取,主要包括以下7部分內容:
- 快取
- Redis
- Lettuce
- Spring Data Redis
- Spring Cache
- 整合Redis
- 小結
快取
個人理解的快取是指用於儲存頻繁使用的資料的空間,關注點是儲存資料的空間和使用頻繁的資料。快取技術,簡單的說就是先從快取中查詢資料是否存在,存在則直接返回,不存在再執行相應的操作獲取資料,並將獲取的資料儲存到快取中,它是一種提升系統性能的重要方法。
Redis
Redis是一個開源的、記憶體儲存key-value型別的資料結構伺服器,可用作資料庫、快取記憶體和訊息佇列代理。它支援的資料型別有字串、雜湊表、列表、集合、有序集合等,同時通過Redis Sentinel提供高可用,通過Redis Cluster提供分割槽功能。
Lettuce
Lettuce是一種可伸縮、執行緒安全、完全非阻塞的Redis客戶端,多個執行緒可以共享同一個RedisConnection。它利用Netty NIO框架來高效地管理多個連線,從而提供了非同步和同步資料訪問方式,用於構建非阻塞的反應性應用程式。 整合Redis,可以通過使用spring-boot-starter-data-redis,這種方式下,Spring Boot預設使用的Redis客戶端是Lettuce。
Spring Data Redis
Spring Data是Spring的一個主要專案,目的是為了簡化構建基於Spring框架應用的資料訪問,包括非關係資料庫、Map-Reduce框架、雲資料服務等,另外也包含對關係資料庫的訪問支援。Spring Data Redis是Spring Data專案中的一個主要模組,它提供了從Spring應用程式中輕鬆配置和訪問Redis的功能、提供了與應用互動的低階和高階抽象,使開發者擺脫了對基礎結構的關注,例如提供了RedisCacheManager。
Spring Cache
從Spring3.1開始,Spring框架提供了對Cache的支援,提供了一個對快取使用的抽象,通過在既有程式碼中新增少量它定義的各種annotation,即能夠達到快取方法的返回物件的作用。提供的主要註解有@Cacheable、@CachePut、@CacheEvict和@Caching,具體見表1。
@Cacheable的常用屬性及說明如表2所示。
SpEL表示式可以獲取的值如表3所示。
@CachePut的常用屬性同@Cacheable。 @CacheEvict的常用屬性見表4。
當需要在類上或方法上同時使用多個註解時,可以使用@Caching,如@Caching(cacheable = @Cacheable(“User”), evict = {@CacheEvict(“Member”), @CacheEvict(value = “Customer”, allEntries = true)})
整合Redis
在pom.xml或build.gradle中新增spring-boot-starter-data-redis依賴即可,預設使用Lettuce客戶端,依賴管理將會自動下載Lettuce對應的jar,例如在build.gradle檔案中新增如下依賴:
compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '2.0.0.RELEASE'
在application.properties或application.yml中新增Redis服務配置,例如在application.properties中新增如下基礎配置:
#Redis伺服器主機地址
spring.redis.host=127.0.0.1
#Redis服務連線密碼
spring.redis.password=123456
#Redis對外服務埠
spring.redis.port=6379
更多Redis的高階配置(哨兵模式、主從)可以在spring-boot-autoconfigure包的spring-configuration-metadata.json中檢視。
編寫業務程式碼實現簡單的查詢快取:
@Service
public class BankServiceImpl implements BankService {
@Autowired
private BankMapper bankMapper;
@Cacheable(value = "bank", key = "'BankId_' + #id", condition = "#id<=100")
@Override
public Bank findBy(Long id) {
return bankMapper.findById(id);
}
}
在application.properties或application.yml中配置一些快取的配置,例如在application.properties新增如下配置:
#在寫入Redis時是否要使用key字首
spring.cache.redis.use-key-prefix=true
#key字首
spring.cache.redis.key-prefix=banks_
#是否允許null值
spring.cache.redis.cache-null-values=false
#快取有效時間,單位毫秒,預設長久有效
spring.cache.redis.time-to-live=5000
小結
當Redis可用並正確配置,應用啟動時,Spring Boot會自動配置一個RedisCacheManager,這個CacheManager會在第一次寫入時預設建立快取。上面的查詢快取程式碼只是一個簡單的Redis使用示例,當然你也可以在程式碼中自動注入RedisConnectionFactory、StringRedisTemplate或RedisTemplate例項,使用它們完成更多的擴充套件需求。