Jedis 和 Lettuce 异步能力
我正在将redis与Akka一起使用,因此我不需要阻塞呼叫。生菜内置了异步未来调用。但Jedis是Redis推荐的客户。有人可以告诉我我是否以正确的方式使用它们。如果是这样,哪一个更好。
杰迪斯我正在使用静态Jedis连接池来获取con,并使用Akka未来回调来处理结果。我在这里担心的是,当我使用另一个线程(可调用)来获得结果时,线程最终会阻止结果。虽然生菜可能有一些更有效的方法来做到这一点。
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 未来调用的执行上下文。