Skip to content

Commit

Permalink
feat(lettuce): 简易封装一封,并且暴露RedisURI,方便手动配置相关参数。
Browse files Browse the repository at this point in the history
  • Loading branch information
limerence-zou committed Jul 28, 2023
1 parent 782cd54 commit 9507fa1
Show file tree
Hide file tree
Showing 7 changed files with 252 additions and 63 deletions.
124 changes: 124 additions & 0 deletions solon-projects/solon-plugin-data/lettuce-solon-plugin/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
# lettuce-solon-plugin

> lettuce本身易于适配,方便使用,本插件只是做了一层薄薄的适配,方便与在某些情况下更加便利的使用。

## 依赖引入

```xml
<dependency>
<groupId>org.noear</groupId>
<artifactId>lettuce-solon-plugin</artifactId>
<version>${solon.version}</version>
</dependency>
```

## 配置文件

```yaml
### 任意选一种
### 模式一
lettuce.rd1:
# Redis模式 (standalone, cluster, sentinel)
redis-mode: standalone
redis-uri: redis://localhost:6379/0

#### 模式二
lettuce.rd2:
# Redis模式 (standalone, cluster, sentinel)
redis-mode: standalone
config:
host: localhost
port: 6379
# socket: xxxx
# client-name: myClientName
# database: 0
# sentinel-masterId: 'mymaster'
# username: 'myusername'
# password: 'mypassword'
# ssl: false
# verify-mode: FULL
# startTls: false
# timeout: 10000
# sentinels:
# - host: localhost
# port: 16379
# password: 'mypassword'
# - host: localhost
# port: 26379
# password: 'mypassword'
```
## java

### Config

```java
package io.lettuce.solon;

import io.lettuce.core.RedisClient;
import io.lettuce.core.RedisURI;
import io.lettuce.core.cluster.ClusterClientOptions;
import io.lettuce.core.cluster.RedisClusterClient;
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.annotation.Inject;

@Configuration
public class Config {

@Bean(typed = true, name = "redisClient1")
public RedisClient redisClient1(@Inject("${lettuce.rd1}") LettuceSupplier lettuceSupplier) {
// 默认参数生成
return (RedisClient) lettuceSupplier.get();
}

@Bean(name = "redisClient2")
public RedisClient redisClient2(@Inject("${lettuce.rd2}") LettuceSupplier lettuceSupplier) {
// 获取 配置文件解析的RedisURI
RedisURI redisURI = lettuceSupplier.getRedisURI();
// 手动创建
RedisClient redisClient = RedisClient.create(redisURI);
// 手动设置参数
redisClient.setOptions(ClusterClientOptions.builder().validateClusterNodeMembership(false).build());
return redisClient;
}

@Bean(name = "redisClusterClient1")
public RedisClusterClient redisClusterClient1(@Inject("${lettuce.rd3}") LettuceSupplier lettuceSupplier) {
// 默认参数生成
return (RedisClusterClient) lettuceSupplier.get();
}

@Bean(name = "redisClusterClient2")
public RedisClusterClient redisClusterClient2(@Inject("${lettuce.rd3}") LettuceSupplier lettuceSupplier) {
// 获取 配置文件解析的RedisURI
RedisURI redisURI = lettuceSupplier.getRedisURI();
// 手动创建
RedisClusterClient redisClusterClient = RedisClusterClient.create(redisURI);
// 手动设置参数
redisClusterClient.setOptions(ClusterClientOptions.builder().validateClusterNodeMembership(false).build());
return redisClusterClient;
}

}
```

### 使用

```java
@Component
public class DemoService {

@Inject
RedisClient redisClient;

/**
* 仅仅做测试使用,以实际情况为准
*/
public void demoSet() {
redisClient.connect().sync().set("test", "test");
System.out.println(redisClient.connect().sync().get("test"));
redisClient.connect().sync().del("test");
}
}
```
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public static RedisMode getRedisMode(String mode) {
return redisMode;
}
}
return null;
throw new IllegalArgumentException("RedisMode must be one of [standalone, cluster, sentinel]");
}
}
public String getRedisMode() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,62 +17,72 @@ public class LettuceSupplier extends LettuceProperties implements Supplier<Abstr
@Override
public AbstractRedisClient get() {
LettuceProperties.RedisMode redisMode = LettuceProperties.RedisMode.getRedisMode(this.getRedisMode());
if (redisMode == null) {
LettuceConfig config = this.getConfig();
RedisURI.Builder builder;
if (config.getSocket() != null) {
builder = RedisURI.Builder.socket(config.getSocket());
} else if (config.getHost() != null) {
builder = RedisURI.Builder.redis(config.getHost(), config.getPort());
} else {
builder = RedisURI.Builder.redis("localhost", config.getPort());
}
if (config.getHost() != null) {
builder.withHost(config.getHost());
}
if (config.getPort() != 0) {
builder.withPort(config.getPort());
}
builder.withDatabase(config.getDatabase());
if (config.getClientName() != null) {
builder.withClientName(config.getClientName());
}
if (config.getPassword() != null) {
builder.withPassword(config.getPassword());
}
if (config.getUsername() != null && config.getPassword() != null) {
builder.withAuthentication(config.getUsername(), config.getPassword());
}
if (config.isSsl()) {
builder.withSsl(config.isSsl());
}
if (config.isStartTls()) {
builder.withStartTls(config.isStartTls());
}
if (config.getVerifyMode() != null) {
builder.withVerifyPeer(config.getVerifyMode());
}
if (config.getTimeout() != null) {
builder.withTimeout(Duration.ofSeconds(config.getTimeout()));
}
if (config.getSentinelMasterId() != null) {
builder.withSentinelMasterId(config.getSentinelMasterId());
}
if (config.getSentinels() != null && !config.getSentinels().isEmpty()) {
for (LettuceSentinel sentinel : config.getSentinels()) {
RedisURI.builder().withSentinel(sentinel.getHost(), sentinel.getPort(), sentinel.getPassword());
}
}
return RedisClient.create(builder.build());
}
RedisURI redisUri = getRedisURI();
if (redisMode.equals(LettuceProperties.RedisMode.STANDALONE)) {
return RedisClient.create(this.getRedisUri());
return RedisClient.create(redisUri);
} else if (redisMode.equals(LettuceProperties.RedisMode.CLUSTER)) {
return RedisClusterClient.create(this.getRedisUri());
return RedisClusterClient.create(redisUri);
} else if (redisMode.equals(LettuceProperties.RedisMode.SENTINEL)) {
return RedisClient.create(this.getRedisUri());
return RedisClient.create(redisUri);
} else {
throw new IllegalArgumentException("redis mode error");
}
}

public RedisURI getRedisURI() {
if (this.getRedisUri() == null) {
return lettuceCfg2Uri();
} else {
return null;
return RedisURI.create(super.getRedisUri());
}
}

private RedisURI lettuceCfg2Uri() {
LettuceConfig config = this.getConfig();
RedisURI.Builder builder;
if (config.getSocket() != null) {
builder = RedisURI.Builder.socket(config.getSocket());
} else if (config.getHost() != null) {
builder = RedisURI.Builder.redis(config.getHost(), config.getPort());
} else {
builder = RedisURI.Builder.redis("localhost", config.getPort());
}
if (config.getHost() != null) {
builder.withHost(config.getHost());
}
if (config.getPort() != 0) {
builder.withPort(config.getPort());
}
builder.withDatabase(config.getDatabase());
if (config.getClientName() != null) {
builder.withClientName(config.getClientName());
}
if (config.getPassword() != null) {
builder.withPassword(config.getPassword());
}
if (config.getUsername() != null && config.getPassword() != null) {
builder.withAuthentication(config.getUsername(), config.getPassword());
}
if (config.isSsl()) {
builder.withSsl(config.isSsl());
}
if (config.isStartTls()) {
builder.withStartTls(config.isStartTls());
}
if (config.getVerifyMode() != null) {
builder.withVerifyPeer(config.getVerifyMode());
}
if (config.getTimeout() != null) {
builder.withTimeout(Duration.ofSeconds(config.getTimeout()));
}
if (config.getSentinelMasterId() != null) {
builder.withSentinelMasterId(config.getSentinelMasterId());
}
if (config.getSentinels() != null && !config.getSentinels().isEmpty()) {
for (LettuceSentinel sentinel : config.getSentinels()) {
RedisURI.builder().withSentinel(sentinel.getHost(), sentinel.getPort(), sentinel.getPassword());
}
}
return builder.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,7 @@ public class App {
public static void main(String[] args) {
SolonApp start = Solon.start(App.class, args);
System.out.println("Greetings from Solon Lettuce!");
DemoService demoService = start.context().getBean(DemoService.class);
demoService.demoSet();
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,48 @@
package io.lettuce.solon;

import io.lettuce.core.AbstractRedisClient;
import io.lettuce.core.RedisClient;
import io.lettuce.core.RedisURI;
import io.lettuce.core.cluster.ClusterClientOptions;
import io.lettuce.core.cluster.RedisClusterClient;
import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Configuration;
import org.noear.solon.annotation.Inject;

@Configuration
public class Config {

@Bean
public AbstractRedisClient redisClient(@Inject("${lettuce.rd}") LettuceSupplier lettuceSupplier) {
return lettuceSupplier.get();
@Bean(typed = true, name = "redisClient1")
public RedisClient redisClient1(@Inject("${lettuce.rd1}") LettuceSupplier lettuceSupplier) {
// 默认参数生成
return (RedisClient) lettuceSupplier.get();
}

@Bean(name = "redisClient2")
public RedisClient redisClient2(@Inject("${lettuce.rd2}") LettuceSupplier lettuceSupplier) {
// 获取 配置文件解析的RedisURI
RedisURI redisURI = lettuceSupplier.getRedisURI();
// 手动创建
RedisClient redisClient = RedisClient.create(redisURI);
// 手动设置参数
redisClient.setOptions(ClusterClientOptions.builder().validateClusterNodeMembership(false).build());
return redisClient;
}

@Bean(name = "redisClusterClient1")
public RedisClusterClient redisClusterClient1(@Inject("${lettuce.rd3}") LettuceSupplier lettuceSupplier) {
// 默认参数生成
return (RedisClusterClient) lettuceSupplier.get();
}

@Bean(name = "redisClusterClient2")
public RedisClusterClient redisClusterClient2(@Inject("${lettuce.rd3}") LettuceSupplier lettuceSupplier) {
// 获取 配置文件解析的RedisURI
RedisURI redisURI = lettuceSupplier.getRedisURI();
// 手动创建
RedisClusterClient redisClusterClient = RedisClusterClient.create(redisURI);
// 手动设置参数
redisClusterClient.setOptions(ClusterClientOptions.builder().validateClusterNodeMembership(false).build());
return redisClusterClient;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package io.lettuce.solon;

import io.lettuce.core.RedisClient;
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Inject;

@Component
public class DemoService {
@Inject
RedisClient redisClient;

public void demoSet() {
redisClient.connect().sync().set("test", "test");
System.out.println(redisClient.connect().sync().get("test"));
redisClient.connect().sync().del("test");
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
### 任意选一种
### 模式一
lettuce.rd:
lettuce.rd1:
redis-mode: standalone
redis-uri: redis://localhost:6379/0

lettuce.rd3:
redis-mode: cluster
redis-uri: redis://localhost:6379/0
#### 模式二
#lettuce.rd:
# config:
# host: localhost
lettuce.rd2:
redis-mode: standalone
config:
host: localhost
port: 6379
# socket: xxxx
# port: 6379
# client-name: myClientName
# database: 0
# sentinel-masterId: 'mymaster'
Expand Down

0 comments on commit 9507fa1

Please sign in to comment.