Я инициализировал приложение Spring Boot с конфигурацией Lettuce (io.lettuce.core.api), подобной этой
@Configuration
class RedisConfiguration {
@Value("${spring.redis.host}")
private String redisHostname;
@Value("${spring.redis.port}")
private int redisPort;
private StatefulRedisConnection<String, String> redisConnection;
private static RedisClient redisClient;
@Bean
public RedisCommands connectionFactory() {
RedisURI redisURI = RedisURI.create(redisHostname,redisPort);
redisClient = RedisClient.create(redisURI);
redisConnection = redisClient.connect();
RedisCommands<String, String> syncCommands =
redisConnection.sync();
return syncCommands;
}
}
Я хочу звонить redisClient.shutdown();
, когда приложение закрывается или закрывается. Где правильно разорвать соединение Redis?
У вас есть два варианта:
@PreDestroy
: @PreDestroy
public StatefulRedisConnection<String, String> redisConnection() {
redisConnection.close();
redisClient.close();
}
@Bean
методовУбедитесь, что RedisClient
и StatefulRedisConnection
представлены как бобы. Командные интерфейсы (RedisCommands
) не предоставляют метод close()
.
@Configuration
class RedisConfiguration {
@Value("${spring.redis.host}")
private String redisHostname;
@Value("${spring.redis.port}")
private int redisPort;
@Bean(destroyMethod = "close")
public StatefulRedisConnection<String, String> redisClient() {
RedisURI redisURI = RedisURI.create(redisHostname,redisPort);
return RedisClient.create(redisURI);
redisConnection = redisClient.connect();
}
@Bean(destroyMethod = "close")
public StatefulRedisConnection<String, String> redisConnection(RedisClient client) {
return client.connect();
}
@Bean
public RedisCommands redisCommands(StatefulRedisConnection<String, String> connection) {
return connection.sync();
}
}
Первый метод короче, а подход @Bean
позволяет вам взаимодействовать с промежуточными объектами в вашем приложении.
Безопасно ли создавать
RedisAdvancedClusterCommands
как singleton spring bean-компонент и делиться им с несколькими сервисными потоками? В большинстве онлайн-примеров я вижу, чтоStatefulRedisClusterConnection
объявляется как bean-компонент, аRedisAdvancedClusterCommands
создается для каждого вызова службы? Однако тот факт, что интерфейс помечен какthread-safe
в документации и отсутствиеRedisTransactionalCommands
или аналогичного интерфейса, заставляет меня думать, что его безопасно использовать в потоках обслуживания.