1. 程式人生 > >深入Spring Boot (十一):整合Redis詳解

深入Spring Boot (十一):整合Redis詳解

Spring Boot為Redis的Lettuce和Jedis客戶端庫提供了基本的自動配置,並且可以使用Spring Data Redis完成更多的操作。本篇將介紹如何整合Redis及使用Redis實現簡單的查詢快取,主要包括以下7部分內容:

  1. 快取
  2. Redis
  3. Lettuce
  4. Spring Data Redis
  5. Spring Cache
  6. 整合Redis
  7. 小結

快取

個人理解的快取是指用於儲存頻繁使用的資料的空間,關注點是儲存資料的空間和使用頻繁的資料。快取技術,簡單的說就是先從快取中查詢資料是否存在,存在則直接返回,不存在再執行相應的操作獲取資料,並將獲取的資料儲存到快取中,它是一種提升系統性能的重要方法。

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例項,使用它們完成更多的擴充套件需求。