Reactor 第十一篇 WebFlux整合Redis

發表於2023-09-20

引言

在現代的分散式系統中,快取是提高效能和擴充套件性的重要組成部分之一。Redis 是一個開源、記憶體中的資料結構儲存系統,可以用作資料庫、快取和訊息中介軟體。而 WebFlux 是 Spring 框架提供的響應式程式設計模型,在處理高併發和大資料量的情況下具有很好的效能和擴充套件性。

本文將介紹如何使用 Reactor 和 WebFlux 整合 Redis,利用其響應式特性來處理快取操作。

1. 環境準備

首先,我們需要在專案的 pom.xml 檔案中新增對 Spring WebFlux 和 Spring Data Redis 的依賴:

<dependencies>
    ...
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
    </dependency>
    ...
</dependencies>

2. 配置Redis連線資訊

在 application.properties 檔案中新增Redis連線的配置資訊:

spring.redis.host=127.0.0.1
spring.redis.port=6379

3. 建立快取管理器

在專案的配置類中建立一個 RedisCacheManager 來管理快取:

@Configuration
public class CacheConfig {

    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(5))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new JdkSerializationRedisSerializer()));
        
        return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(connectionFactory)
                .cacheDefaults(cacheConfiguration)
                .build();
    }
}

在上述程式碼中,我們使用 RedisCacheConfiguration 配置了快取的預設過期時間、鍵和值的序列化方式。

4. 編寫快取邏輯

定義一個Service類來處理快取操作:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private ReactiveRedisOperations<String, User> redisOperations;
  
    @Cacheable(cacheNames = "users", key = "#id")
    public Mono<User> getUserById(String id) {
        return userRepository.findById(id)
                .flatMap(user -> redisOperations.opsForValue().set(id, user)
                        .then(Mono.just(user)));
    }
    
    @CachePut(cacheNames = "users", key = "#user.id")
    public Mono<User> saveUser(User user) {
        return userRepository.save(user)
                .flatMap(savedUser -> redisOperations.opsForValue().set(savedUser.getId(), savedUser)
                        .then(Mono.just(savedUser)));
    }
  
    @CacheEvict(cacheNames = "users", key = "#id")
    public Mono<Void> deleteUserById(String id) {
        return userRepository.deleteById(id)
                .then(redisOperations.opsForValue().delete(id));
    }
}

在上述程式碼中,我們使用 Spring 框架的快取註解來定義快取的邏輯。@Cacheable 用於讀取快取,@CachePut 用於更新快取,@CacheEvict 用於清除快取。同時,我們使用 ReactiveRedisOperations 來執行Redis的操作。

5. 建立WebFlux控制器

編寫一個WebFlux控制器來處理請求:

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/users/{id}")
    public Mono<User> getUserById(@PathVariable String id) {
        return userService.getUserById(id);
    }

    @PostMapping("/users")
    public Mono<User> saveUser(@RequestBody User user) {
        return userService.saveUser(user);
    }

    @DeleteMapping("/users/{id}")
    public Mono<Void> deleteUserById(@PathVariable String id) {
        return userService.deleteUserById(id);
    }
}

在上述程式碼中,我們使用 @GetMapping、@PostMapping 和 @DeleteMapping 來對映 URL,並呼叫 UserService 中的相應方法來處理具體的業務邏輯。

總結

本文介紹瞭如何使用 Reactor 和 WebFlux 整合 Redis 來處理快取操作。透過使用 ReactiveRedisOperations 和 Spring 框架的快取註解,我們可以方便地實現響應式的快取邏輯。這種方式可以提升系統的效能和擴充套件性,特別適用於高併發和大資料量的場景。

希望本文對您在使用 Reactor 和 WebFlux 整合 Redis 方面有所幫助。

相關文章