Lettuce是一个可伸缩线程安全的Redis客户端。多个线程可以共享同一个RedisConnection.本文是基于Lettuce5,主要介绍的知识点如下:
- Lettuce在Spring Boot中的配置
- Lettuce的同步,异步,响应式使用方式
- 事件的订阅
- 发布自定义事件
- 读写分离
- 读写分离策略实现源码
- 客户端分片实现
@Configuration
public class LettuceConfig {
/**
* 配置客户端资源
* @return
*/
@Bean(destroyMethod = "shutdown")
ClientResources clientResources() {
return DefaultClientResources.builder().ioThreadPoolSize(8).computationThreadPoolSize(10).build();
}
/**
* 配置Socket选项
* keepAlive=true
* tcpNoDelay=true
* connectionTimeout=5秒
* @return
*/
@Bean
SocketOptions socketOptions(){
return SocketOptions.builder().keepAlive(true).tcpNoDelay(true).connectTimeout(Duration.ofSeconds(5)).build();
}
/**
* 配置客户端选项
* @return
*/
@Bean
ClientOptions clientOptions(SocketOptions socketOptions) {
return ClientOptions.builder().socketOptions(socketOptions).build();
}
/**
* 创建RedisClient
* @param clientResources 客户端资源
* @param clientOptions 客户端选项
* @return
*/
@Bean(destroyMethod = "shutdown")
RedisClient redisClient(ClientResources clientResources, ClientOptions clientOptions) {
RedisURI uri = RedisURI.builder().withSentinel("xx.xx.xx.xx", 26009).withPassword("abcd1234").withSentinelMasterId("xxx").build();
RedisClient client = RedisClient.create(clientResources, uri);
client.setOptions(clientOptions);
return client;
}
/**
* 创建连接
* @param redisClient
* @return
*/
@Bean(destroyMethod = "close")
StatefulRedisConnection<String, String> connection(RedisClient redisClient) {
return redisClient.connect();
}
}
基本使用
public Mono<ServerResponse> hello(ServerRequest request) throws Exception {
//响应式使用
Mono<String> resp = redisConnection.reactive().get("gxt_new");
//同步使用
redisConnection.sync().get("test");
redisConnection.async().get("test").get(5, TimeUnit.SECONDS);
return ServerResponse.ok().body(resp, String.class);
}
客户端订阅事件
客户端使用事件总线传输运行期间产生的事件;EventBus可以从客户端资源进行配置和获取,并用于客户端和自定义事件。
如下事件可以被客户端发送:
- 连接事件
- 测量事件
- 集群拓扑事件
client.getResources().eventBus().get().subscribe(e -> {
System.out.println("client 订阅事件: " + e);
});
client 订阅事件: ConnectionActivatedEvent [/xx:49910 -> /xx:6008]
client 订阅事件: ConnectionActivatedEvent [/xx:49911 -> /xx:6018]
client 订阅事件: ConnectedEvent [/xx:49912 -> /xx:6018]
发布事件
发布使用也是通过使用eventBus进行发布事件,Event接口只是一个标签接口
eventBus.publish(new Event() {
@Override
public String toString() {
return "自定义事件";
}
});
订阅者就可以订阅到这个自定