quarkus集成redis

quarkus集成redis

1.环境说明
1
2
3
Java:17.0.8
Quarkus:3.4.2
Maven:3.9.5
2.引入依赖
1
2
3
4
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-redis-client</artifactId>
</dependency>
3.开始使用
3.1.配置文件
1
2
# redis配置
quarkus.redis.hosts=redis://:Redis密码@Host:6379
3.2.创建类1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package org.acme.redis;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

import io.quarkus.redis.datasource.ReactiveRedisDataSource;
import io.quarkus.redis.datasource.RedisDataSource;
import io.quarkus.redis.datasource.keys.KeyCommands;
import io.quarkus.redis.datasource.keys.ReactiveKeyCommands;
import io.quarkus.redis.datasource.string.StringCommands;
import io.smallrye.mutiny.Uni;

@ApplicationScoped
public class IncrementService {

// 本快速入门演示了命令式和响应式 Redis 数据源的使用
// 通常,常规应用程序会选择其中一种。

//响应式
private ReactiveKeyCommands<String> keyCommands;
//命令式
private ValueCommands<String, Long> countCommands;


//响应式
@Inject
RedisAPI lowLevelClient;
//命令式
@Inject
RedisDataSource highLevelApi;

public IncrementService(RedisDataSource ds, ReactiveRedisDataSource reactive) {
countCommands = ds.value(Long.class);
keyCommands = reactive.key();

}

long get(String key) {
Long value = countCommands.get(key);
if (value == null) {
return 0L;
}
return value;
}

void set(String key, Long value) {
countCommands.set(key, value);
}

void increment(String key, Long incrementBy) {
countCommands.incrby(key, incrementBy);
}

Uni<Void> del(String key) {
return keyCommands.del(key)
.replaceWithVoid();
}

Uni<List<String>> keys() {
return keyCommands.keys("*");
}
}
3.3.字符类型
1
2
3
4
5
6
7
8
//同步方式
String getKey(String key){
return valueCommands.get(key);
}
//异步方式
Future<Response> getKey(String key){
return lowLevelClient.get(key);
}
3.3.Hash类型
1
2
3
4
5
6
7
8
//同步方式
Map<String,String> getKey(String key){
return highLevelApi.hash(String.class).hgetall(key);
}
//异步方式
Future<Response> getKey(String key){
return lowLevelClient.hgetall(key);
}
3.4.Set类型
1
2
3
4
5
6
7
8
//同步方式
Set<String> getKey(String key){
return highLevelApi.set(String.class).smembers(key);
}
//异步方式
Future<Response> getKey(String key){
return lowLevelClient.smembers(key);
}

一个扩展,多个 API
此扩展提供多种与 Redis 交互的方式:
低级别的 Vert.x 客户端:这是一个完全响应式、非阻塞和异步的客户端。有关详细信息,请参阅 Vert.x Redis 客户端文档。公开了两个 API:io.vertx.redis.client.Redis 和 io.vertx.redis.client.RedisAPI。通常情况下,您将使用后者,除非需要自己管理连接。
Vert.x API 的低级别 Mutiny 变体:与前者不同,它公开了 Mutiny API,并提供了反应式和命令式方法(带有 andAwait() 后缀)。公开了两个 API:io.vertx.mutiny.redis.client.Redis 和 io.vertx.mutiny.redis.client.RedisAPI。通常情况下,您将使用后者,除非需要自己管理连接。
高级别的响应式数据源:一种类型安全、高级别的与 Redis 交互的 API。此 API 完全是响应式和异步的。它公开了 Mutiny API。它公开了 io.quarkus.redis.datasource.ReactiveRedisDataSource 接口。
高级别的命令式数据源:一种类型安全、高级别的与 Redis 交互的 API。它是响应式数据源的命令式变体。它公开了 io.quarkus.redis.datasource.RedisDataSource 接口。
为了帮助您选择适合您的 API,以下是一些建议:
如果您正在构建与 Redis 集成的命令式(经典)Quarkus 应用程序:请使用 io.quarkus.redis.datasource.RedisDataSource。
如果您正在构建与 Redis 集成的响应式 Quarkus 应用程序:请使用 io.quarkus.redis.datasource.ReactiveRedisDataSource。
如果您需要细粒度控制,或以通用方式执行命令:请使用 io.vertx.mutiny.redis.client.RedisAPI。
如果您已有 Vert.x 代码,请使用 io.vertx.redis.client.RedisAPI。
如果您需要发出自定义命令,您可以使用数据源(响应式或命令式)或者 io.vertx.mutiny.redis.client.Redis。


“响应式”和”命令式”是编程中两种不同的范式或风格,它们描述了处理计算和控制流的方式。在上下文中,这两个术语通常与编写并发和异步代码相关。

响应式(Reactive):

特点: 响应式编程强调数据流和变化的异步处理。它关注于通过异步事件流进行处理,允许在事件发生时触发相应的操作。
使用场景: 适用于需要处理大量异步事件、数据流或实时数据更新的场景。常见的响应式编程库包括 RxJava、Reactor、和 Akka。
命令式(Imperative):

特点: 命令式编程强调在代码中直接给出明确的步骤和指令,通常是同步执行。程序员编写明确的指令,描述计算机执行任务的确切步骤。
使用场景: 适用于较为简单的、线性的任务,其中执行顺序对于问题的解决至关重要。传统的编程语言(如Java、C++)通常采用命令式编程。
在上述文本中提到的 “ReactiveRedisDataSource” 表示一种使用响应式编程范式与 Redis 交互的数据源。相比之下, “RedisDataSource” 表示一种使用命令式编程范式与 Redis 交互的数据源。

总体而言,响应式编程通常更适合处理异步、并发、和事件驱动的场景,而命令式编程更适合线性、顺序执行的场景。在实际应用中,选择使用哪种范式通常取决于问题的性质和开发者的偏好。

后面还有关于redis多节点使用

4.相关文档

https://quarkus.io/guides/redis
https://quarkus.io/guides/redis-reference

评论

:D 一言句子获取中...