使用Spring Boot整合Redis快取


在本文中,我們將瞭解如何將Redis快取與Spring Boot整合。我們將學習如何在Spring Boot快取中配置Redis資料。

讓我們首先看看將Redis匯入Spring Boot應用程式所需的依賴項。

依賴項

// Adding spring-boot cache & redis dependencies
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-cache</artifactId>
   <version>2.4.3</version>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
   <version>2.4.3</version>
</dependency>

配置

新增Redis依賴項後,您現在需要執行一些配置才能在您的專案中使用它。Spring Boot將自動配置一個Redis快取管理器,但使用預設屬性。我們可以修改此配置並根據我們的需求更改它。

@Bean
public RedisCacheConfiguration cacheConfiguration() {
   return RedisCacheConfiguration.defaultCacheConfig()
   .entryTtl(Duration.ofMinutes(60)) // Changing the cache TTL
   .disableCachingNullValues()
   .serializeValuesWith(SerializationPair.fromSerializer(newGenericJackson2JsonRedisSerializer())); 
   //Defining serialization to retrieve data
}

修改配置使我們可以更好地控制基本的快取配置。例如,我們可以更改預設的生存時間值,並自定義預設的序列化策略以進行動態快取建立,如上所示。

示例

讓我們以一個示例為例,我們有一個**EmployeeService**元件,它從資料庫檢索員工資訊。由於我們需要獲取員工詳細資訊用於多種用途,我們需要此資料快速響應,這就是我們使用Redis快取的原因。讓我們為此建立一個整合測試。

@Import({ CacheConfig.class, EmployeeService.class})
@ExtendWith(SpringExtension.class)
@EnableCaching
@ImportAutoConfiguration(classes = {
   CacheAutoConfiguration.class,
   RedisAutoConfiguration.class
})
class EmployeeServiceCachingIntegrationTest {

   @MockBean
   private EmployeeRepository mockEmployeeRepository;

   @Autowired
   private EmployeeService employeeService;

   @Autowired
   private CacheManager cacheManager;

   @Test
   void
   givenRedisCaching_whenFindEmployeeById_thenEmployeeReturnedFromCache() {
      Employee employee = new Employee(id, A_DESCRIPTION);
      given(mockEmployeeRepository.findById(id))
      .willReturn(Optional.of(employee));

      Employee employeeNotFromCache = employeeService.getEmployeeById(id);
      Employee employeeFromCache = employeeService.getEmployeeById(id);

      assertThat(employeeNotFromCache).isEqualTo(employee);
      assertThat(employeeFromCache).isEqualTo(employee);

      verify(mockEmployeeRepository, times(1)).findById(id);
      assertThat(employeeFromCache()).isEqualTo(employee);
   }
}

從快取中檢索資料

@Cacheable(value = "employeeCache")
public Employee getEmployeeForId(String id) {
   return employeeRepository.findById(id)
      .orElseThrow(RuntimeException::new);
}

我們已經呼叫了**getEmployeeById()**兩次。第一次呼叫應該從儲存庫獲取專案,而第二次呼叫應該從快取返回相同的員工物件,而無需呼叫儲存庫。

更新於:2021年11月24日

6K+ 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告