我正在使用Redis和Akka,所以我需要非阻塞调用。Lettuce已经内置了异步-未来调用。但是 Redis 推荐的客户端是 Jedis。有人能告诉我是否正确地使用了它们?如果是这样的话,哪一个更好。
JEDIS 我正在使用静态 Jedis 连接池获取连接,并使用 Akka future 回调来处理结果。我的担忧在于,当我使用另一个线程(Callable)来获取结果时,该线程最终会阻塞等待结果。而 Lettuce 可能有更有效的方法来处理这个问题。
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调用的执行上下文吗。