- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我在 Akka 中使用 redis,所以我不需要阻塞调用。生菜内置了异步 future 调用。但是 Jedis 是 Redis 推荐的客户端。有人可以告诉我我是否以正确的方式使用它们。如果是的话,哪个更好。
绝地我正在使用静态 Jedis 连接池来获取 con 并使用 Akka future 回调来处理结果。我在这里担心的是,当我使用另一个线程(可调用)来获得线程最终会阻塞结果的结果时。虽然生菜可能有一些更有效的方法来做到这一点。
private final class OnSuccessExtension extends OnSuccess<String> {
private final ActorRef senderActorRef;
private final Object message;
@Override
public void onSuccess(String valueRedis) throws Throwable {
log.info(getContext().dispatcher().toString());
senderActorRef.tell((String) message, ActorRef.noSender());
}
public OnSuccessExtension(ActorRef senderActorRef,Object message) {
this.senderActorRef = senderActorRef;
this.message=message;
}
}
ActorRef senderActorRef = getSender(); //never close over a future
if (message instanceof String) {
Future<String> f =akka.dispatch.Futures.future(new Callable<String>() {
public String call() {
String result;
try(Jedis jedis=JedisWrapper.redisPool.getResource()) {
result = jedis.get("name");
}
return result;
}
}, ex);
f.onSuccess(new OnSuccessExtension(senderActorRef,message), ex);
}
生菜
ExecutorService executorService = Executors.newFixedThreadPool(10);
public void onReceive(Object message) throws Exception {
ActorRef senderActorRef = getSender(); //never close over a future
if (message instanceof String) {
final RedisFuture<String> future = lettuce.connection.get("name");
future.addListener(new Runnable() {
final ActorRef sender = senderActorRef;
final String msg =(String) message;
@Override
public void run() {
try {
String value = future.get();
log.info(value);
sender.tell(message, ActorRef.noSender());
} catch (Exception e) {
}
}
}, executorService);
如果生菜是异步调用的更好选择。那么我应该在生产环境中使用哪种类型的执行器。如果可能的话,我可以使用 Akka 调度程序作为 Letture future 调用的执行上下文。
最佳答案
您的问题没有一个答案,因为它取决于。
Jedis 和 lettuce 都是成熟的客户。为了完善 Java 客户端列表,还有 Redisson,它添加了另一层抽象(Collection/Queue/Lock/... 接口(interface)而不是原始 Redis 命令)。
这在很大程度上取决于您如何与客户合作。一般来说,Jedis(连接到 redis 的基于 java 的客户端)在数据访问方面是单线程的,因此您通过并发获得的唯一好处是将协议(protocol)和 I/O 工作卸载到不同的线程。这对 lettuce 和 Redisson 来说并不完全正确,因为它们在底层使用了 netty(netty 将一个套接字 channel 绑定(bind)到一个特定的事件循环线程)。
使用 Jedis,您一次只能使用一个连接和一个线程。这与 Akka Actor 模型有很好的相关性,因为一个 Actor 实例一次只被一个线程占用。
另一方面,您需要与处理特定参与者的线程一样多的 Jedis 连接。如果您开始在不同的 Actor 之间共享 Jedis 连接,您可以选择连接池,或者您需要为每个 Actor 实例提供一个专用的 Jedis 连接。请记住,您需要自己处理重新连接(一旦 Redis 连接中断)。
使用 Redisson 和 lettuce,如果您愿意,您可以获得透明的重新连接(这是 lettuce 的默认值,不确定 Redisson)。
通过使用 lettuce 和 Redisson,您可以在所有参与者之间共享一个连接,因为它们是线程安全的。在以下两种情况下,您不能共享一个 lettuce 连接:
MULTI
/EXEC
,因为您会将不同的操作与事务混合,这当然是您不希望这样做的)Jedis 没有异步接口(interface),因此需要您自己完成。这是可行的,我对 MongoDB 做了类似的事情,将 I/O 部分卸载/解耦给其他参与者。您可以在代码中使用该方法,但不需要提供自己的执行器服务,因为您在可运行监听器中执行非阻塞操作。
使用 lettuce 4.0,您将获得 Java 8 支持(由于 CompletionStage 接口(interface),这在异步 API 方面要好得多),您甚至可以使用 RxJava(响应式(Reactive)编程)来处理并发。
Lettuce 对您的并发模型没有意见。它允许您根据需要使用它,除了 Java 6/7 和 Guava 的普通 Future
/ListenableFuture
API 不太好用。
HTH,马克
关于java - Jedis 和 Lettuce 异步能力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32857922/
我需要使用 Azure Redis 集群、密码、SSL 以及管道支持。 到目前为止我一直在使用 Jedis,但它缺乏对集群+ssl+密码+管道组合的支持。 我尝试了生菜 ( https://githu
我试图让 Lettuce 在旧主机失败后连接到新晋升的主机(前奴隶)。但是所有写入都停止了。故障主机重新连接后,写入继续,现在作为从属主机。并且它继续写信给新的主人(以前的奴隶)。 我尝试设置定期拓扑
在我的服务中,我尝试使用 Lettuce 客户端的 ReadFrom 方法确保强一致性。我正在写作,然后进行阅读。在客户端配置中,我已将 ReadFrom 设置为 SLAVE_PREFFERED。 L
本文整理了Java中io.lettuce.core.ZStoreArgs类的一些代码示例,展示了ZStoreArgs类的具体用法。这些代码示例主要来源于Github/Stackoverflow/Mav
我正在尝试使用 Spring Data Redis(版本:1.1.x)为我的 Redis 客户端(生菜客户端版本:2.3.3)设置一个连接工厂,但在将所有内容连接在一起时遇到了一些麻烦。 这是我的配置
我喜欢使用 Lettuce 来定义测试用例。在许多情况下,很容易编写 Lettuce 场景,使其可以原子方式运行或作为功能中其他场景的一部分运行。然而,我发现 Lettuce 也是一个有用的工具,可以
我们已经定义了 Lettuce 客户端连接工厂,以便能够连接到定义自定义套接字和命令超时的 Redis: @Bean LettuceConnectionFactory lettuceConnectio
前提:搭建好redis集群环境,搭建方式请看:http://www.zzvips.com/article/29914.html 1. 新建工程,pom.xml文件中添加redis支持
需要使用lettuce在redis-cluster模式下运行一批命令。对于应该在一个分区中运行的命令,我希望在一个节点中顺序运行它们。 据我所知,Lettuce 可以通过将 AutoFlushComm
有经验的人可以同时使用这两种方法吗 Lettuce和 Pyccuracy描述它们在功能和用途方面的差异? 来自Lettuce Overview文档: Lettuce is a very simple
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
尝试运行简单的生菜测试场景(来自 here )。我得到这些: Traceback (most recent call last): File "C:\Python27\lib\site-packa
我正在学习 Redis for Java 是我认为我真正缺少的关于 Redis api 的东西。 假设我们有以下用于创建连接的代码: RedisClient redisClient = RedisCl
redisListCommands.brpop(0, queueName) 我已将超时设置为 0(即没有超时)。为什么这命令带来 io.lettuce.core.RedisCommandTimeout
我正在尝试查找有关如何配置和使用 Lettuce 的引用资料具有客户端一致性哈希的 Redis 客户端。 这种分片方法在 ShardedJedis 中实现来自 Jedis 客户端并在 Redis pa
我可以使用 Lettuce 管理 redis 通知吗?我找不到任何示例或文档。当元素在 Redis 中过期时,我只需要在我的 Java 代码中有一些通知/回调。 让我举个例子...对不起,阅读 Let
我在 Akka 中使用 redis,所以我不需要阻塞调用。生菜内置了异步 future 调用。但是 Jedis 是 Redis 推荐的客户端。有人可以告诉我我是否以正确的方式使用它们。如果是的话,哪个
本文整理了Java中io.lettuce.core.ZStoreArgs.sum()方法的一些代码示例,展示了ZStoreArgs.sum()的具体用法。这些代码示例主要来源于Github/Stack
本文整理了Java中io.lettuce.core.ZStoreArgs.max()方法的一些代码示例,展示了ZStoreArgs.max()的具体用法。这些代码示例主要来源于Github/Stack
本文整理了Java中io.lettuce.core.ZStoreArgs.()方法的一些代码示例,展示了ZStoreArgs.()的具体用法。这些代码示例主要来源于Github/Stackoverfl
我是一名优秀的程序员,十分优秀!