All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.lambdaworks.redis.AbstractRedisAsyncCommands Maven / Gradle / Ivy

Go to download

Advanced and thread-safe Java Redis client for synchronous, asynchronous, and reactive usage. Supports Cluster, Sentinel, Pipelining, Auto-Reconnect, Codecs and much more.

There is a newer version: 5.0.0.Beta1
Show newest version
/*
 * Copyright 2011-2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.lambdaworks.redis;

import static com.lambdaworks.redis.protocol.CommandType.*;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import com.lambdaworks.redis.GeoArgs.Unit;
import com.lambdaworks.redis.api.StatefulConnection;
import com.lambdaworks.redis.api.async.*;
import com.lambdaworks.redis.cluster.api.async.RedisClusterAsyncCommands;
import com.lambdaworks.redis.codec.RedisCodec;
import com.lambdaworks.redis.internal.LettuceAssert;
import com.lambdaworks.redis.output.*;
import com.lambdaworks.redis.protocol.*;

/**
 * An asynchronous and thread-safe API for a Redis connection.
 *
 * @param  Key type.
 * @param  Value type.
 * @author Will Glozer
 */
public abstract class AbstractRedisAsyncCommands
        implements RedisHashesAsyncConnection, RedisKeysAsyncConnection, RedisStringsAsyncConnection,
        RedisListsAsyncConnection, RedisSetsAsyncConnection, RedisSortedSetsAsyncConnection,
        RedisScriptingAsyncConnection, RedisServerAsyncConnection, RedisHLLAsyncConnection,
        BaseRedisAsyncConnection, RedisClusterAsyncConnection, RedisGeoAsyncConnection,

        RedisHashAsyncCommands, RedisKeyAsyncCommands, RedisStringAsyncCommands, RedisListAsyncCommands,
        RedisSetAsyncCommands, RedisSortedSetAsyncCommands, RedisScriptingAsyncCommands,
        RedisServerAsyncCommands, RedisHLLAsyncCommands, BaseRedisAsyncCommands,
        RedisTransactionalAsyncCommands, RedisGeoAsyncCommands, RedisClusterAsyncCommands {

    protected MultiOutput multi;
    protected RedisCommandBuilder commandBuilder;
    protected RedisCodec codec;
    protected StatefulConnection connection;

    /**
     * Initialize a new instance.
     *
     * @param connection the connection to operate on
     * @param codec the codec for command encoding
     */
    public AbstractRedisAsyncCommands(StatefulConnection connection, RedisCodec codec) {
        this.connection = connection;
        this.codec = codec;
        commandBuilder = new RedisCommandBuilder<>(codec);
    }

    @Override
    public RedisFuture append(K key, V value) {
        return dispatch(commandBuilder.append(key, value));
    }

    @Override
    public String auth(String password) {

        LettuceAssert.notNull(password, "Password must not be null");
        AsyncCommand cmd = authAsync(password.toCharArray());
        return LettuceFutures.awaitOrCancel(cmd, connection.getTimeout(), connection.getTimeoutUnit());
    }

    public AsyncCommand authAsync(char[] password) {
        return dispatch(commandBuilder.auth(password));
    }

    @Override
    public RedisFuture bgrewriteaof() {
        return dispatch(commandBuilder.bgrewriteaof());
    }

    @Override
    public RedisFuture bgsave() {
        return dispatch(commandBuilder.bgsave());
    }

    @Override
    public RedisFuture bitcount(K key) {
        return dispatch(commandBuilder.bitcount(key));
    }

    @Override
    public RedisFuture bitcount(K key, long start, long end) {
        return dispatch(commandBuilder.bitcount(key, start, end));
    }

    @Override
    public RedisFuture> bitfield(K key, BitFieldArgs bitFieldArgs) {
        return dispatch(commandBuilder.bitfield(key, bitFieldArgs));
    }

    @Override
    public RedisFuture bitpos(K key, boolean state) {
        return dispatch(commandBuilder.bitpos(key, state));
    }

    @Override
    public RedisFuture bitpos(K key, boolean state, long start, long end) {
        return dispatch(commandBuilder.bitpos(key, state, start, end));
    }

    @Override
    public RedisFuture bitopAnd(K destination, K... keys) {
        return dispatch(commandBuilder.bitopAnd(destination, keys));
    }

    @Override
    public RedisFuture bitopNot(K destination, K source) {
        return dispatch(commandBuilder.bitopNot(destination, source));
    }

    @Override
    public RedisFuture bitopOr(K destination, K... keys) {
        return dispatch(commandBuilder.bitopOr(destination, keys));
    }

    @Override
    public RedisFuture bitopXor(K destination, K... keys) {
        return dispatch(commandBuilder.bitopXor(destination, keys));
    }

    @Override
    public RedisFuture> blpop(long timeout, K... keys) {
        return dispatch(commandBuilder.blpop(timeout, keys));
    }

    @Override
    public RedisFuture> brpop(long timeout, K... keys) {
        return dispatch(commandBuilder.brpop(timeout, keys));
    }

    @Override
    public RedisFuture brpoplpush(long timeout, K source, K destination) {
        return dispatch(commandBuilder.brpoplpush(timeout, source, destination));
    }

    @Override
    public RedisFuture clientGetname() {
        return dispatch(commandBuilder.clientGetname());
    }

    @Override
    public RedisFuture clientSetname(K name) {
        return dispatch(commandBuilder.clientSetname(name));
    }

    @Override
    public RedisFuture clientKill(String addr) {
        return dispatch(commandBuilder.clientKill(addr));
    }

    @Override
    public RedisFuture clientKill(KillArgs killArgs) {
        return dispatch(commandBuilder.clientKill(killArgs));
    }

    @Override
    public RedisFuture clientPause(long timeout) {
        return dispatch(commandBuilder.clientPause(timeout));
    }

    @Override
    public RedisFuture clientList() {
        return dispatch(commandBuilder.clientList());
    }

    @Override
    public RedisFuture> command() {
        return dispatch(commandBuilder.command());
    }

    @Override
    public RedisFuture> commandInfo(String... commands) {
        return dispatch(commandBuilder.commandInfo(commands));
    }

    @Override
    public RedisFuture> commandInfo(CommandType... commands) {
        String[] stringCommands = new String[commands.length];
        for (int i = 0; i < commands.length; i++) {
            stringCommands[i] = commands[i].name();
        }

        return commandInfo(stringCommands);
    }

    @Override
    public RedisFuture commandCount() {
        return dispatch(commandBuilder.commandCount());
    }

    @Override
    public RedisFuture> configGet(String parameter) {
        return dispatch(commandBuilder.configGet(parameter));
    }

    @Override
    public RedisFuture configResetstat() {
        return dispatch(commandBuilder.configResetstat());
    }

    @Override
    public RedisFuture configSet(String parameter, String value) {
        return dispatch(commandBuilder.configSet(parameter, value));
    }

    @Override
    public RedisFuture configRewrite() {
        return dispatch(commandBuilder.configRewrite());
    }

    @Override
    public RedisFuture dbsize() {
        return dispatch(commandBuilder.dbsize());
    }

    @Override
    public RedisFuture debugCrashAndRecover(Long delay) {
        return dispatch(commandBuilder.debugCrashAndRecover(delay));
    }

    @Override
    public RedisFuture debugHtstats(int db) {
        return dispatch(commandBuilder.debugHtstats(db));
    }

    @Override
    public RedisFuture debugObject(K key) {
        return dispatch(commandBuilder.debugObject(key));
    }

    @Override
    public void debugOom() {
        dispatch(commandBuilder.debugOom());
    }

    @Override
    public RedisFuture debugReload() {
        return dispatch(commandBuilder.debugReload());
    }

    @Override
    public RedisFuture debugRestart(Long delay) {
        return dispatch(commandBuilder.debugRestart(delay));
    }

    @Override
    public RedisFuture debugSdslen(K key) {
        return dispatch(commandBuilder.debugSdslen(key));
    }

    @Override
    public void debugSegfault() {
        dispatch(commandBuilder.debugSegfault());
    }

    @Override
    public RedisFuture decr(K key) {
        return dispatch(commandBuilder.decr(key));
    }

    @Override
    public RedisFuture decrby(K key, long amount) {
        return dispatch(commandBuilder.decrby(key, amount));
    }

    @Override
    public RedisFuture del(K... keys) {
        return dispatch(commandBuilder.del(keys));
    }

    public RedisFuture del(Iterable keys) {
        return dispatch(commandBuilder.del(keys));
    }

    @Override
    public RedisFuture unlink(K... keys) {
        return dispatch(commandBuilder.unlink(keys));
    }

    public RedisFuture unlink(Iterable keys) {
        return dispatch(commandBuilder.unlink(keys));
    }

    @Override
    public RedisFuture discard() {
        return dispatch(commandBuilder.discard());
    }

    @Override
    public RedisFuture dump(K key) {
        return dispatch(commandBuilder.dump(key));
    }

    @Override
    public RedisFuture echo(V msg) {
        return dispatch(commandBuilder.echo(msg));
    }

    @Override
    @SuppressWarnings("unchecked")
    public  RedisFuture eval(String script, ScriptOutputType type, K... keys) {
        return (RedisFuture) dispatch(commandBuilder.eval(script, type, keys));
    }

    @Override
    @SuppressWarnings("unchecked")
    public  RedisFuture eval(String script, ScriptOutputType type, K[] keys, V... values) {
        return (RedisFuture) dispatch(commandBuilder.eval(script, type, keys, values));
    }

    @Override
    @SuppressWarnings("unchecked")
    public  RedisFuture evalsha(String digest, ScriptOutputType type, K... keys) {
        return (RedisFuture) dispatch(commandBuilder.evalsha(digest, type, keys));
    }

    @Override
    @SuppressWarnings("unchecked")
    public  RedisFuture evalsha(String digest, ScriptOutputType type, K[] keys, V... values) {
        return (RedisFuture) dispatch(commandBuilder.evalsha(digest, type, keys, values));
    }

    @Override
    public RedisFuture exists(K key) {
        return dispatch(commandBuilder.exists(key));
    }

    @Override
    public RedisFuture exists(K... keys) {
        return dispatch(commandBuilder.exists(keys));
    }

    public RedisFuture exists(Iterable keys) {
        return dispatch(commandBuilder.exists(keys));
    }

    @Override
    public RedisFuture expire(K key, long seconds) {
        return dispatch(commandBuilder.expire(key, seconds));
    }

    @Override
    public RedisFuture expireat(K key, Date timestamp) {
        return expireat(key, timestamp.getTime() / 1000);
    }

    @Override
    public RedisFuture expireat(K key, long timestamp) {
        return dispatch(commandBuilder.expireat(key, timestamp));
    }

    @Override
    public RedisFuture> exec() {
        return dispatch(EXEC, null);
    }

    @Override
    public RedisFuture flushall() {
        return dispatch(commandBuilder.flushall());
    }

    @Override
    public RedisFuture flushallAsync() {
        return dispatch(commandBuilder.flushallAsync());
    }

    @Override
    public RedisFuture flushdb() {
        return dispatch(commandBuilder.flushdb());
    }

    @Override
    public RedisFuture flushdbAsync() {
        return dispatch(commandBuilder.flushdbAsync());
    }

    @Override
    public RedisFuture get(K key) {
        return dispatch(commandBuilder.get(key));
    }

    @Override
    public RedisFuture getbit(K key, long offset) {
        return dispatch(commandBuilder.getbit(key, offset));
    }

    @Override
    public RedisFuture getrange(K key, long start, long end) {
        return dispatch(commandBuilder.getrange(key, start, end));
    }

    @Override
    public RedisFuture getset(K key, V value) {
        return dispatch(commandBuilder.getset(key, value));
    }

    @Override
    public RedisFuture hdel(K key, K... fields) {
        return dispatch(commandBuilder.hdel(key, fields));
    }

    @Override
    public RedisFuture hexists(K key, K field) {
        return dispatch(commandBuilder.hexists(key, field));
    }

    @Override
    public RedisFuture hget(K key, K field) {
        return dispatch(commandBuilder.hget(key, field));
    }

    @Override
    public RedisFuture hincrby(K key, K field, long amount) {
        return dispatch(commandBuilder.hincrby(key, field, amount));
    }

    @Override
    public RedisFuture hincrbyfloat(K key, K field, double amount) {
        return dispatch(commandBuilder.hincrbyfloat(key, field, amount));
    }

    @Override
    public RedisFuture> hgetall(K key) {
        return dispatch(commandBuilder.hgetall(key));
    }

    @Override
    public RedisFuture hgetall(KeyValueStreamingChannel channel, K key) {
        return dispatch(commandBuilder.hgetall(channel, key));
    }

    @Override
    public RedisFuture> hkeys(K key) {
        return dispatch(commandBuilder.hkeys(key));
    }

    @Override
    public RedisFuture hkeys(KeyStreamingChannel channel, K key) {
        return dispatch(commandBuilder.hkeys(channel, key));
    }

    @Override
    public RedisFuture hlen(K key) {
        return dispatch(commandBuilder.hlen(key));
    }

    @Override
    public RedisFuture hstrlen(K key, K field) {
        return dispatch(commandBuilder.hstrlen(key, field));
    }

    @Override
    public RedisFuture> hmget(K key, K... fields) {
        return dispatch(commandBuilder.hmget(key, fields));
    }

    @Override
    public RedisFuture hmget(ValueStreamingChannel channel, K key, K... fields) {
        return dispatch(commandBuilder.hmget(channel, key, fields));
    }

    @Override
    public RedisFuture hmset(K key, Map map) {
        return dispatch(commandBuilder.hmset(key, map));
    }

    @Override
    public RedisFuture hset(K key, K field, V value) {
        return dispatch(commandBuilder.hset(key, field, value));
    }

    @Override
    public RedisFuture hsetnx(K key, K field, V value) {
        return dispatch(commandBuilder.hsetnx(key, field, value));
    }

    @Override
    public RedisFuture> hvals(K key) {
        return dispatch(commandBuilder.hvals(key));
    }

    @Override
    public RedisFuture hvals(ValueStreamingChannel channel, K key) {
        return dispatch(commandBuilder.hvals(channel, key));
    }

    @Override
    public RedisFuture incr(K key) {
        return dispatch(commandBuilder.incr(key));
    }

    @Override
    public RedisFuture incrby(K key, long amount) {
        return dispatch(commandBuilder.incrby(key, amount));
    }

    @Override
    public RedisFuture incrbyfloat(K key, double amount) {
        return dispatch(commandBuilder.incrbyfloat(key, amount));
    }

    @Override
    public RedisFuture info() {
        return dispatch(commandBuilder.info());
    }

    @Override
    public RedisFuture info(String section) {
        return dispatch(commandBuilder.info(section));
    }

    @Override
    public RedisFuture> keys(K pattern) {
        return dispatch(commandBuilder.keys(pattern));
    }

    @Override
    public RedisFuture keys(KeyStreamingChannel channel, K pattern) {
        return dispatch(commandBuilder.keys(channel, pattern));
    }

    @Override
    public RedisFuture lastsave() {
        return dispatch(commandBuilder.lastsave());
    }

    @Override
    public RedisFuture lindex(K key, long index) {
        return dispatch(commandBuilder.lindex(key, index));
    }

    @Override
    public RedisFuture linsert(K key, boolean before, V pivot, V value) {
        return dispatch(commandBuilder.linsert(key, before, pivot, value));
    }

    @Override
    public RedisFuture llen(K key) {
        return dispatch(commandBuilder.llen(key));
    }

    @Override
    public RedisFuture lpop(K key) {
        return dispatch(commandBuilder.lpop(key));
    }

    @Override
    public RedisFuture lpush(K key, V... values) {
        return dispatch(commandBuilder.lpush(key, values));
    }

    @Override
    public RedisFuture lpushx(K key, V value) {
        return dispatch(commandBuilder.lpushx(key, value));
    }

    @Override
    public RedisFuture lpushx(K key, V... values) {
        return dispatch(commandBuilder.lpushx(key, values));
    }

    @Override
    public RedisFuture> lrange(K key, long start, long stop) {
        return dispatch(commandBuilder.lrange(key, start, stop));
    }

    @Override
    public RedisFuture lrange(ValueStreamingChannel channel, K key, long start, long stop) {
        return dispatch(commandBuilder.lrange(channel, key, start, stop));
    }

    @Override
    public RedisFuture lrem(K key, long count, V value) {
        return dispatch(commandBuilder.lrem(key, count, value));
    }

    @Override
    public RedisFuture lset(K key, long index, V value) {
        return dispatch(commandBuilder.lset(key, index, value));
    }

    @Override
    public RedisFuture ltrim(K key, long start, long stop) {
        return dispatch(commandBuilder.ltrim(key, start, stop));
    }

    @Override
    public RedisFuture migrate(String host, int port, K key, int db, long timeout) {
        return dispatch(commandBuilder.migrate(host, port, key, db, timeout));
    }

    @Override
    public RedisFuture migrate(String host, int port, int db, long timeout, MigrateArgs migrateArgs) {
        return dispatch(commandBuilder.migrate(host, port, db, timeout, migrateArgs));
    }

    @Override
    public RedisFuture> mget(K... keys) {
        return dispatch(commandBuilder.mget(keys));
    }

    public RedisFuture> mget(Iterable keys) {
        return dispatch(commandBuilder.mget(keys));
    }

    @Override
    public RedisFuture mget(ValueStreamingChannel channel, K... keys) {
        return dispatch(commandBuilder.mget(channel, keys));
    }

    public RedisFuture mget(ValueStreamingChannel channel, Iterable keys) {
        return dispatch(commandBuilder.mget(channel, keys));
    }

    @Override
    public RedisFuture move(K key, int db) {
        return dispatch(commandBuilder.move(key, db));
    }

    @Override
    public RedisFuture multi() {
        return dispatch(commandBuilder.multi());
    }

    @Override
    public RedisFuture mset(Map map) {
        return dispatch(commandBuilder.mset(map));
    }

    @Override
    public RedisFuture msetnx(Map map) {
        return dispatch(commandBuilder.msetnx(map));
    }

    @Override
    public RedisFuture objectEncoding(K key) {
        return dispatch(commandBuilder.objectEncoding(key));
    }

    @Override
    public RedisFuture objectIdletime(K key) {
        return dispatch(commandBuilder.objectIdletime(key));
    }

    @Override
    public RedisFuture objectRefcount(K key) {
        return dispatch(commandBuilder.objectRefcount(key));
    }

    @Override
    public RedisFuture persist(K key) {
        return dispatch(commandBuilder.persist(key));
    }

    @Override
    public RedisFuture pexpire(K key, long milliseconds) {
        return dispatch(commandBuilder.pexpire(key, milliseconds));
    }

    @Override
    public RedisFuture pexpireat(K key, Date timestamp) {
        return pexpireat(key, timestamp.getTime());
    }

    @Override
    public RedisFuture pexpireat(K key, long timestamp) {
        return dispatch(commandBuilder.pexpireat(key, timestamp));
    }

    @Override
    public RedisFuture ping() {
        return dispatch(commandBuilder.ping());
    }

    @Override
    public RedisFuture readOnly() {
        AsyncCommand cmd = dispatch(commandBuilder.readOnly());
        return cmd;
    }

    @Override
    public RedisFuture readWrite() {
        AsyncCommand cmd = dispatch(commandBuilder.readWrite());
        return cmd;
    }

    @Override
    public RedisFuture pttl(K key) {
        return dispatch(commandBuilder.pttl(key));
    }

    @Override
    public RedisFuture publish(K channel, V message) {
        return dispatch(commandBuilder.publish(channel, message));
    }

    @Override
    public RedisFuture> pubsubChannels() {
        return dispatch(commandBuilder.pubsubChannels());
    }

    @Override
    public RedisFuture> pubsubChannels(K channel) {
        return dispatch(commandBuilder.pubsubChannels(channel));
    }

    @Override
    public RedisFuture> pubsubNumsub(K... channels) {
        return dispatch(commandBuilder.pubsubNumsub(channels));
    }

    @Override
    public RedisFuture pubsubNumpat() {
        return dispatch(commandBuilder.pubsubNumpat());
    }

    @Override
    public RedisFuture quit() {
        return dispatch(commandBuilder.quit());
    }

    @Override
    public RedisFuture> role() {
        return dispatch(commandBuilder.role());
    }

    @Override
    public RedisFuture randomkey() {
        return dispatch(commandBuilder.randomkey());
    }

    @Override
    public RedisFuture rename(K key, K newKey) {
        return dispatch(commandBuilder.rename(key, newKey));
    }

    @Override
    public RedisFuture renamenx(K key, K newKey) {
        return dispatch(commandBuilder.renamenx(key, newKey));
    }

    @Override
    public RedisFuture restore(K key, long ttl, byte[] value) {
        return dispatch(commandBuilder.restore(key, ttl, value));
    }

    @Override
    public RedisFuture rpop(K key) {
        return dispatch(commandBuilder.rpop(key));
    }

    @Override
    public RedisFuture rpoplpush(K source, K destination) {
        return dispatch(commandBuilder.rpoplpush(source, destination));
    }

    @Override
    public RedisFuture rpush(K key, V... values) {
        return dispatch(commandBuilder.rpush(key, values));
    }

    @Override
    public RedisFuture rpushx(K key, V value) {
        return dispatch(commandBuilder.rpushx(key, value));
    }

    @Override
    public RedisFuture rpushx(K key, V... values) {
        return dispatch(commandBuilder.rpushx(key, values));
    }

    @Override
    public RedisFuture sadd(K key, V... members) {
        return dispatch(commandBuilder.sadd(key, members));
    }

    @Override
    public RedisFuture save() {
        return dispatch(commandBuilder.save());
    }

    @Override
    public RedisFuture scard(K key) {
        return dispatch(commandBuilder.scard(key));
    }

    @Override
    public RedisFuture> scriptExists(String... digests) {
        return dispatch(commandBuilder.scriptExists(digests));
    }

    @Override
    public RedisFuture scriptFlush() {
        return dispatch(commandBuilder.scriptFlush());
    }

    @Override
    public RedisFuture scriptKill() {
        return dispatch(commandBuilder.scriptKill());
    }

    @Override
    public RedisFuture scriptLoad(V script) {
        return dispatch(commandBuilder.scriptLoad(script));
    }

    @Override
    public RedisFuture> sdiff(K... keys) {
        return dispatch(commandBuilder.sdiff(keys));
    }

    @Override
    public RedisFuture sdiff(ValueStreamingChannel channel, K... keys) {
        return dispatch(commandBuilder.sdiff(channel, keys));
    }

    @Override
    public RedisFuture sdiffstore(K destination, K... keys) {
        return dispatch(commandBuilder.sdiffstore(destination, keys));
    }

    public String select(int db) {
        AsyncCommand cmd = selectAsync(db);
        String status = LettuceFutures.awaitOrCancel(cmd, connection.getTimeout(), connection.getTimeoutUnit());
        return status;
    }

    protected AsyncCommand selectAsync(int db) {
        return dispatch(commandBuilder.select(db));
    }

    public RedisFuture swapdb(int db1, int db2) {
        return dispatch(commandBuilder.swapdb(db1, db2));
    }

    @Override
    public RedisFuture set(K key, V value) {
        return dispatch(commandBuilder.set(key, value));
    }

    @Override
    public RedisFuture set(K key, V value, SetArgs setArgs) {
        return dispatch(commandBuilder.set(key, value, setArgs));
    }

    @Override
    public RedisFuture setbit(K key, long offset, int value) {
        return dispatch(commandBuilder.setbit(key, offset, value));
    }

    @Override
    public RedisFuture setex(K key, long seconds, V value) {
        return dispatch(commandBuilder.setex(key, seconds, value));
    }

    @Override
    public RedisFuture psetex(K key, long milliseconds, V value) {
        return dispatch(commandBuilder.psetex(key, milliseconds, value));
    }

    @Override
    public RedisFuture setnx(K key, V value) {
        return dispatch(commandBuilder.setnx(key, value));
    }

    @Override
    public RedisFuture setrange(K key, long offset, V value) {
        return dispatch(commandBuilder.setrange(key, offset, value));
    }

    @Deprecated
    public void shutdown() {
        dispatch(commandBuilder.shutdown());
    }

    @Override
    public void shutdown(boolean save) {
        dispatch(commandBuilder.shutdown(save));
    }

    @Override
    public RedisFuture> sinter(K... keys) {
        return dispatch(commandBuilder.sinter(keys));
    }

    @Override
    public RedisFuture sinter(ValueStreamingChannel channel, K... keys) {
        return dispatch(commandBuilder.sinter(channel, keys));
    }

    @Override
    public RedisFuture sinterstore(K destination, K... keys) {
        return dispatch(commandBuilder.sinterstore(destination, keys));
    }

    @Override
    public RedisFuture sismember(K key, V member) {
        return dispatch(commandBuilder.sismember(key, member));
    }

    @Override
    public RedisFuture smove(K source, K destination, V member) {
        return dispatch(commandBuilder.smove(source, destination, member));
    }

    @Override
    public RedisFuture slaveof(String host, int port) {
        return dispatch(commandBuilder.slaveof(host, port));
    }

    @Override
    public RedisFuture slaveofNoOne() {
        return dispatch(commandBuilder.slaveofNoOne());
    }

    @Override
    public RedisFuture> slowlogGet() {
        return dispatch(commandBuilder.slowlogGet());
    }

    @Override
    public RedisFuture> slowlogGet(int count) {
        return dispatch(commandBuilder.slowlogGet(count));
    }

    @Override
    public RedisFuture slowlogLen() {
        return dispatch(commandBuilder.slowlogLen());
    }

    @Override
    public RedisFuture slowlogReset() {
        return dispatch(commandBuilder.slowlogReset());
    }

    @Override
    public RedisFuture> smembers(K key) {
        return dispatch(commandBuilder.smembers(key));
    }

    @Override
    public RedisFuture smembers(ValueStreamingChannel channel, K key) {
        return dispatch(commandBuilder.smembers(channel, key));
    }

    @Override
    public RedisFuture> sort(K key) {
        return dispatch(commandBuilder.sort(key));
    }

    @Override
    public RedisFuture sort(ValueStreamingChannel channel, K key) {
        return dispatch(commandBuilder.sort(channel, key));
    }

    @Override
    public RedisFuture> sort(K key, SortArgs sortArgs) {
        return dispatch(commandBuilder.sort(key, sortArgs));
    }

    @Override
    public RedisFuture sort(ValueStreamingChannel channel, K key, SortArgs sortArgs) {
        return dispatch(commandBuilder.sort(channel, key, sortArgs));
    }

    @Override
    public RedisFuture sortStore(K key, SortArgs sortArgs, K destination) {
        return dispatch(commandBuilder.sortStore(key, sortArgs, destination));
    }

    @Override
    public RedisFuture spop(K key) {
        return dispatch(commandBuilder.spop(key));
    }

    @Override
    public RedisFuture> spop(K key, long count) {
        return dispatch(commandBuilder.spop(key, count));
    }

    @Override
    public RedisFuture srandmember(K key) {
        return dispatch(commandBuilder.srandmember(key));
    }

    @Override
    public RedisFuture> srandmember(K key, long count) {
        return dispatch(commandBuilder.srandmember(key, count));
    }

    @Override
    public RedisFuture srandmember(ValueStreamingChannel channel, K key, long count) {
        return dispatch(commandBuilder.srandmember(channel, key, count));
    }

    @Override
    public RedisFuture srem(K key, V... members) {
        return dispatch(commandBuilder.srem(key, members));
    }

    @Override
    public RedisFuture> sunion(K... keys) {
        return dispatch(commandBuilder.sunion(keys));
    }

    @Override
    public RedisFuture sunion(ValueStreamingChannel channel, K... keys) {
        return dispatch(commandBuilder.sunion(channel, keys));
    }

    @Override
    public RedisFuture sunionstore(K destination, K... keys) {
        return dispatch(commandBuilder.sunionstore(destination, keys));
    }

    @Override
    public RedisFuture sync() {
        return dispatch(commandBuilder.sync());
    }

    @Override
    public RedisFuture strlen(K key) {
        return dispatch(commandBuilder.strlen(key));
    }

    @Override
    public RedisFuture touch(K... keys) {
        return dispatch(commandBuilder.touch(keys));
    }

    public RedisFuture touch(Iterable keys) {
        return dispatch(commandBuilder.touch(keys));
    }

    @Override
    public RedisFuture ttl(K key) {
        return dispatch(commandBuilder.ttl(key));
    }

    @Override
    public RedisFuture type(K key) {
        return dispatch(commandBuilder.type(key));
    }

    @Override
    public RedisFuture watch(K... keys) {
        return dispatch(commandBuilder.watch(keys));
    }

    @Override
    public RedisFuture unwatch() {
        return dispatch(commandBuilder.unwatch());
    }

    @Override
    public RedisFuture zadd(K key, double score, V member) {
        return dispatch(commandBuilder.zadd(key, null, score, member));
    }

    @Override
    public RedisFuture zadd(K key, Object... scoresAndValues) {
        return dispatch(commandBuilder.zadd(key, null, scoresAndValues));
    }

    @Override
    public RedisFuture zadd(K key, ScoredValue... scoredValues) {
        return dispatch(commandBuilder.zadd(key, null, scoredValues));
    }

    @Override
    public RedisFuture zadd(K key, ZAddArgs zAddArgs, double score, V member) {
        return dispatch(commandBuilder.zadd(key, zAddArgs, score, member));
    }

    @Override
    public RedisFuture zadd(K key, ZAddArgs zAddArgs, Object... scoresAndValues) {
        return dispatch(commandBuilder.zadd(key, zAddArgs, scoresAndValues));
    }

    @Override
    public RedisFuture zadd(K key, ZAddArgs zAddArgs, ScoredValue... scoredValues) {
        return dispatch(commandBuilder.zadd(key, zAddArgs, scoredValues));
    }

    @Override
    public RedisFuture zaddincr(K key, double score, V member) {
        return dispatch(commandBuilder.zaddincr(key, null, score, member));
    }

    @Override
    public RedisFuture zaddincr(K key, ZAddArgs zAddArgs, double score, V member) {
        return dispatch(commandBuilder.zaddincr(key, zAddArgs, score, member));
    }

    @Override
    public RedisFuture zcard(K key) {
        return dispatch(commandBuilder.zcard(key));
    }

    @Override
    public RedisFuture zcount(K key, double min, double max) {
        return dispatch(commandBuilder.zcount(key, min, max));
    }

    @Override
    public RedisFuture zcount(K key, String min, String max) {
        return dispatch(commandBuilder.zcount(key, min, max));
    }

    @Override
    public RedisFuture zcount(K key, Range range) {
        return dispatch(commandBuilder.zcount(key, range));
    }

    @Override
    public RedisFuture zincrby(K key, double amount, K member) {
        return dispatch(commandBuilder.zincrby(key, amount, member));
    }

    @Override
    public RedisFuture zinterstore(K destination, K... keys) {
        return dispatch(commandBuilder.zinterstore(destination, keys));
    }

    @Override
    public RedisFuture zinterstore(K destination, ZStoreArgs storeArgs, K... keys) {
        return dispatch(commandBuilder.zinterstore(destination, storeArgs, keys));
    }

    @Override
    public RedisFuture> zrange(K key, long start, long stop) {
        return dispatch(commandBuilder.zrange(key, start, stop));
    }

    @Override
    public RedisFuture>> zrangeWithScores(K key, long start, long stop) {
        return dispatch(commandBuilder.zrangeWithScores(key, start, stop));
    }

    @Override
    public RedisFuture> zrangebyscore(K key, double min, double max) {
        return dispatch(commandBuilder.zrangebyscore(key, min, max));
    }

    @Override
    public RedisFuture> zrangebyscore(K key, String min, String max) {
        return dispatch(commandBuilder.zrangebyscore(key, min, max));
    }

    @Override
    public RedisFuture> zrangebyscore(K key, Range range) {
        return dispatch(commandBuilder.zrangebyscore(key, range, Limit.unlimited()));
    }

    @Override
    public RedisFuture> zrangebyscore(K key, double min, double max, long offset, long count) {
        return dispatch(commandBuilder.zrangebyscore(key, min, max, offset, count));
    }

    @Override
    public RedisFuture> zrangebyscore(K key, String min, String max, long offset, long count) {
        return dispatch(commandBuilder.zrangebyscore(key, min, max, offset, count));
    }

    @Override
    public RedisFuture> zrangebyscore(K key, Range range, Limit limit) {
        return dispatch(commandBuilder.zrangebyscore(key, range, limit));
    }

    @Override
    public RedisFuture>> zrangebyscoreWithScores(K key, double min, double max) {
        return dispatch(commandBuilder.zrangebyscoreWithScores(key, min, max));
    }

    @Override
    public RedisFuture>> zrangebyscoreWithScores(K key, String min, String max) {
        return dispatch(commandBuilder.zrangebyscoreWithScores(key, min, max));
    }

    @Override
    public RedisFuture>> zrangebyscoreWithScores(K key, Range range) {
        return dispatch(commandBuilder.zrangebyscoreWithScores(key, range, Limit.unlimited()));
    }

    @Override
    public RedisFuture>> zrangebyscoreWithScores(K key, double min, double max, long offset, long count) {
        return dispatch(commandBuilder.zrangebyscoreWithScores(key, min, max, offset, count));
    }

    @Override
    public RedisFuture>> zrangebyscoreWithScores(K key, String min, String max, long offset, long count) {
        return dispatch(commandBuilder.zrangebyscoreWithScores(key, min, max, offset, count));
    }

    @Override
    public RedisFuture>> zrangebyscoreWithScores(K key, Range range, Limit limit) {
        return dispatch(commandBuilder.zrangebyscoreWithScores(key, range, limit));
    }

    @Override
    public RedisFuture zrange(ValueStreamingChannel channel, K key, long start, long stop) {
        return dispatch(commandBuilder.zrange(channel, key, start, stop));
    }

    @Override
    public RedisFuture zrangeWithScores(ScoredValueStreamingChannel channel, K key, long start, long stop) {
        return dispatch(commandBuilder.zrangeWithScores(channel, key, start, stop));
    }

    @Override
    public RedisFuture zrangebyscore(ValueStreamingChannel channel, K key, double min, double max) {
        return dispatch(commandBuilder.zrangebyscore(channel, key, min, max));
    }

    @Override
    public RedisFuture zrangebyscore(ValueStreamingChannel channel, K key, String min, String max) {
        return dispatch(commandBuilder.zrangebyscore(channel, key, min, max));
    }

    @Override
    public RedisFuture zrangebyscore(ValueStreamingChannel channel, K key, Range range) {
        return dispatch(commandBuilder.zrangebyscore(channel, key, range, Limit.unlimited()));
    }

    @Override
    public RedisFuture zrangebyscore(ValueStreamingChannel channel, K key, double min, double max, long offset,
            long count) {
        return dispatch(commandBuilder.zrangebyscore(channel, key, min, max, offset, count));
    }

    @Override
    public RedisFuture zrangebyscore(ValueStreamingChannel channel, K key, String min, String max, long offset,
            long count) {
        return dispatch(commandBuilder.zrangebyscore(channel, key, min, max, offset, count));
    }

    @Override
    public RedisFuture zrangebyscore(ValueStreamingChannel channel, K key, Range range, Limit limit) {
        return dispatch(commandBuilder.zrangebyscore(channel, key, range, limit));
    }

    @Override
    public RedisFuture zrangebyscoreWithScores(ScoredValueStreamingChannel channel, K key, double min, double max) {
        return dispatch(commandBuilder.zrangebyscoreWithScores(channel, key, min, max));
    }

    @Override
    public RedisFuture zrangebyscoreWithScores(ScoredValueStreamingChannel channel, K key, String min, String max) {
        return dispatch(commandBuilder.zrangebyscoreWithScores(channel, key, min, max));
    }

    @Override
    public RedisFuture zrangebyscoreWithScores(ScoredValueStreamingChannel channel, K key, Range range) {
        return dispatch(commandBuilder.zrangebyscoreWithScores(channel, key, range, Limit.unlimited()));
    }

    @Override
    public RedisFuture zrangebyscoreWithScores(ScoredValueStreamingChannel channel, K key, double min, double max,
            long offset, long count) {
        return dispatch(commandBuilder.zrangebyscoreWithScores(channel, key, min, max, offset, count));
    }

    @Override
    public RedisFuture zrangebyscoreWithScores(ScoredValueStreamingChannel channel, K key, String min, String max,
            long offset, long count) {
        return dispatch(commandBuilder.zrangebyscoreWithScores(channel, key, min, max, offset, count));
    }

    @Override
    public RedisFuture zrangebyscoreWithScores(ScoredValueStreamingChannel channel, K key, Range range,
           Limit limit) {
        return dispatch(commandBuilder.zrangebyscoreWithScores(channel, key, range, limit));
    }

    @Override
    public RedisFuture zrank(K key, V member) {
        return dispatch(commandBuilder.zrank(key, member));
    }

    @Override
    public RedisFuture zrem(K key, V... members) {
        return dispatch(commandBuilder.zrem(key, members));
    }

    @Override
    public RedisFuture zremrangebyrank(K key, long start, long stop) {
        return dispatch(commandBuilder.zremrangebyrank(key, start, stop));
    }

    @Override
    public RedisFuture zremrangebyscore(K key, double min, double max) {
        return dispatch(commandBuilder.zremrangebyscore(key, min, max));
    }

    @Override
    public RedisFuture zremrangebyscore(K key, String min, String max) {
        return dispatch(commandBuilder.zremrangebyscore(key, min, max));
    }

    @Override
    public RedisFuture zremrangebyscore(K key, Range range) {
        return dispatch(commandBuilder.zremrangebyscore(key, range));
    }

    @Override
    public RedisFuture> zrevrange(K key, long start, long stop) {
        return dispatch(commandBuilder.zrevrange(key, start, stop));
    }

    @Override
    public RedisFuture>> zrevrangeWithScores(K key, long start, long stop) {
        return dispatch(commandBuilder.zrevrangeWithScores(key, start, stop));
    }

    @Override
    public RedisFuture> zrevrangebylex(K key, Range range) {
        return dispatch(commandBuilder.zrevrangebylex(key, range, Limit.unlimited()));
    }

    @Override
    public RedisFuture> zrevrangebylex(K key, Range range, Limit limit) {
        return dispatch(commandBuilder.zrevrangebylex(key, range, limit));
    }

    @Override
    public RedisFuture> zrevrangebyscore(K key, double max, double min) {
        return dispatch(commandBuilder.zrevrangebyscore(key, max, min));
    }

    @Override
    public RedisFuture> zrevrangebyscore(K key, String max, String min) {
        return dispatch(commandBuilder.zrevrangebyscore(key, max, min));
    }

    @Override
    public RedisFuture> zrevrangebyscore(K key, Range range) {
        return dispatch(commandBuilder.zrevrangebyscore(key, range, Limit.unlimited()));
    }

    @Override
    public RedisFuture> zrevrangebyscore(K key, double max, double min, long offset, long count) {
        return dispatch(commandBuilder.zrevrangebyscore(key, max, min, offset, count));
    }

    @Override
    public RedisFuture> zrevrangebyscore(K key, String max, String min, long offset, long count) {
        return dispatch(commandBuilder.zrevrangebyscore(key, max, min, offset, count));
    }

    @Override
    public RedisFuture> zrevrangebyscore(K key, Range range, Limit limit) {
        return dispatch(commandBuilder.zrevrangebyscore(key, range, limit));
    }

    @Override
    public RedisFuture>> zrevrangebyscoreWithScores(K key, double max, double min) {
        return dispatch(commandBuilder.zrevrangebyscoreWithScores(key, max, min));
    }

    @Override
    public RedisFuture>> zrevrangebyscoreWithScores(K key, String max, String min) {
        return dispatch(commandBuilder.zrevrangebyscoreWithScores(key, max, min));
    }

    @Override
    public RedisFuture>> zrevrangebyscoreWithScores(K key, Range range) {
        return dispatch(commandBuilder.zrevrangebyscoreWithScores(key, range, Limit.unlimited()));
    }

    @Override
    public RedisFuture>> zrevrangebyscoreWithScores(K key, double max, double min, long offset, long count) {
        return dispatch(commandBuilder.zrevrangebyscoreWithScores(key, max, min, offset, count));
    }

    @Override
    public RedisFuture>> zrevrangebyscoreWithScores(K key, String max, String min, long offset, long count) {
        return dispatch(commandBuilder.zrevrangebyscoreWithScores(key, max, min, offset, count));
    }

    @Override
    public RedisFuture>> zrevrangebyscoreWithScores(K key, Range range, Limit limit) {
        return dispatch(commandBuilder.zrevrangebyscoreWithScores(key, range, limit));
    }

    @Override
    public RedisFuture zrevrange(ValueStreamingChannel channel, K key, long start, long stop) {
        return dispatch(commandBuilder.zrevrange(channel, key, start, stop));
    }

    @Override
    public RedisFuture zrevrangeWithScores(ScoredValueStreamingChannel channel, K key, long start, long stop) {
        return dispatch(commandBuilder.zrevrangeWithScores(channel, key, start, stop));
    }

    @Override
    public RedisFuture zrevrangebyscore(ValueStreamingChannel channel, K key, double max, double min) {
        return dispatch(commandBuilder.zrevrangebyscore(channel, key, max, min));
    }

    @Override
    public RedisFuture zrevrangebyscore(ValueStreamingChannel channel, K key, String max, String min) {
        return dispatch(commandBuilder.zrevrangebyscore(channel, key, max, min));
    }

    @Override
    public RedisFuture zrevrangebyscore(ValueStreamingChannel channel, K key, Range range) {
        return dispatch(commandBuilder.zrevrangebyscore(channel, key, range, Limit.unlimited()));
    }

    @Override
    public RedisFuture zrevrangebyscore(ValueStreamingChannel channel, K key, double max, double min, long offset,
            long count) {
        return dispatch(commandBuilder.zrevrangebyscore(channel, key, max, min, offset, count));
    }

    @Override
    public RedisFuture zrevrangebyscore(ValueStreamingChannel channel, K key, String max, String min, long offset,
            long count) {
        return dispatch(commandBuilder.zrevrangebyscore(channel, key, max, min, offset, count));
    }

    @Override
    public RedisFuture zrevrangebyscore(ValueStreamingChannel channel, K key, Range range, Limit limit) {
        return dispatch(commandBuilder.zrevrangebyscore(channel, key, range, limit));
    }

    @Override
    public RedisFuture zrevrangebyscoreWithScores(ScoredValueStreamingChannel channel, K key, double max, double min) {
        return dispatch(commandBuilder.zrevrangebyscoreWithScores(channel, key, max, min));
    }

    @Override
    public RedisFuture zrevrangebyscoreWithScores(ScoredValueStreamingChannel channel, K key, String max, String min) {
        return dispatch(commandBuilder.zrevrangebyscoreWithScores(channel, key, max, min));
    }

    @Override
    public RedisFuture zrevrangebyscoreWithScores(ScoredValueStreamingChannel channel, K key, Range range) {
        return dispatch(commandBuilder.zrevrangebyscoreWithScores(channel, key, range, Limit.unlimited()));
    }

    @Override
    public RedisFuture zrevrangebyscoreWithScores(ScoredValueStreamingChannel channel, K key, double max, double min,
            long offset, long count) {
        return dispatch(commandBuilder.zrevrangebyscoreWithScores(channel, key, max, min, offset, count));
    }

    @Override
    public RedisFuture zrevrangebyscoreWithScores(ScoredValueStreamingChannel channel, K key, String max, String min,
            long offset, long count) {
        return dispatch(commandBuilder.zrevrangebyscoreWithScores(channel, key, max, min, offset, count));
    }

    @Override
    public RedisFuture zrevrangebyscoreWithScores(ScoredValueStreamingChannel channel, K key, Range range,
            Limit limit) {
        return dispatch(commandBuilder.zrevrangebyscoreWithScores(channel, key, range, limit));
    }

    @Override
    public RedisFuture zrevrank(K key, V member) {
        return dispatch(commandBuilder.zrevrank(key, member));
    }

    @Override
    public RedisFuture zscore(K key, V member) {
        return dispatch(commandBuilder.zscore(key, member));
    }

    @Override
    public RedisFuture zunionstore(K destination, K... keys) {
        return dispatch(commandBuilder.zunionstore(destination, keys));
    }

    @Override
    public RedisFuture zunionstore(K destination, ZStoreArgs storeArgs, K... keys) {
        return dispatch(commandBuilder.zunionstore(destination, storeArgs, keys));
    }

    @Override
    public RedisFuture> scan() {
        return dispatch(commandBuilder.scan());
    }

    @Override
    public RedisFuture> scan(ScanArgs scanArgs) {
        return dispatch(commandBuilder.scan(scanArgs));
    }

    @Override
    public RedisFuture> scan(ScanCursor scanCursor, ScanArgs scanArgs) {
        return dispatch(commandBuilder.scan(scanCursor, scanArgs));
    }

    @Override
    public RedisFuture> scan(ScanCursor scanCursor) {
        return dispatch(commandBuilder.scan(scanCursor));
    }

    @Override
    public RedisFuture scan(KeyStreamingChannel channel) {
        return dispatch(commandBuilder.scanStreaming(channel));
    }

    @Override
    public RedisFuture scan(KeyStreamingChannel channel, ScanArgs scanArgs) {
        return dispatch(commandBuilder.scanStreaming(channel, scanArgs));
    }

    @Override
    public RedisFuture scan(KeyStreamingChannel channel, ScanCursor scanCursor, ScanArgs scanArgs) {
        return dispatch(commandBuilder.scanStreaming(channel, scanCursor, scanArgs));
    }

    @Override
    public RedisFuture scan(KeyStreamingChannel channel, ScanCursor scanCursor) {
        return dispatch(commandBuilder.scanStreaming(channel, scanCursor));
    }

    @Override
    public RedisFuture> sscan(K key) {
        return dispatch(commandBuilder.sscan(key));
    }

    @Override
    public RedisFuture> sscan(K key, ScanArgs scanArgs) {
        return dispatch(commandBuilder.sscan(key, scanArgs));
    }

    @Override
    public RedisFuture> sscan(K key, ScanCursor scanCursor, ScanArgs scanArgs) {
        return dispatch(commandBuilder.sscan(key, scanCursor, scanArgs));
    }

    @Override
    public RedisFuture> sscan(K key, ScanCursor scanCursor) {
        return dispatch(commandBuilder.sscan(key, scanCursor));
    }

    @Override
    public RedisFuture sscan(ValueStreamingChannel channel, K key) {
        return dispatch(commandBuilder.sscanStreaming(channel, key));
    }

    @Override
    public RedisFuture sscan(ValueStreamingChannel channel, K key, ScanArgs scanArgs) {
        return dispatch(commandBuilder.sscanStreaming(channel, key, scanArgs));
    }

    @Override
    public RedisFuture sscan(ValueStreamingChannel channel, K key, ScanCursor scanCursor, ScanArgs scanArgs) {
        return dispatch(commandBuilder.sscanStreaming(channel, key, scanCursor, scanArgs));
    }

    @Override
    public RedisFuture sscan(ValueStreamingChannel channel, K key, ScanCursor scanCursor) {
        return dispatch(commandBuilder.sscanStreaming(channel, key, scanCursor));
    }

    @Override
    public RedisFuture> hscan(K key) {
        return dispatch(commandBuilder.hscan(key));
    }

    @Override
    public RedisFuture> hscan(K key, ScanArgs scanArgs) {
        return dispatch(commandBuilder.hscan(key, scanArgs));
    }

    @Override
    public RedisFuture> hscan(K key, ScanCursor scanCursor, ScanArgs scanArgs) {
        return dispatch(commandBuilder.hscan(key, scanCursor, scanArgs));
    }

    @Override
    public RedisFuture> hscan(K key, ScanCursor scanCursor) {
        return dispatch(commandBuilder.hscan(key, scanCursor));
    }

    @Override
    public RedisFuture hscan(KeyValueStreamingChannel channel, K key) {
        return dispatch(commandBuilder.hscanStreaming(channel, key));
    }

    @Override
    public RedisFuture hscan(KeyValueStreamingChannel channel, K key, ScanArgs scanArgs) {
        return dispatch(commandBuilder.hscanStreaming(channel, key, scanArgs));
    }

    @Override
    public RedisFuture hscan(KeyValueStreamingChannel channel, K key, ScanCursor scanCursor,
            ScanArgs scanArgs) {
        return dispatch(commandBuilder.hscanStreaming(channel, key, scanCursor, scanArgs));
    }

    @Override
    public RedisFuture hscan(KeyValueStreamingChannel channel, K key, ScanCursor scanCursor) {
        return dispatch(commandBuilder.hscanStreaming(channel, key, scanCursor));
    }

    @Override
    public RedisFuture> zscan(K key) {
        return dispatch(commandBuilder.zscan(key));
    }

    @Override
    public RedisFuture> zscan(K key, ScanArgs scanArgs) {
        return dispatch(commandBuilder.zscan(key, scanArgs));
    }

    @Override
    public RedisFuture> zscan(K key, ScanCursor scanCursor, ScanArgs scanArgs) {
        return dispatch(commandBuilder.zscan(key, scanCursor, scanArgs));
    }

    @Override
    public RedisFuture> zscan(K key, ScanCursor scanCursor) {
        return dispatch(commandBuilder.zscan(key, scanCursor));
    }

    @Override
    public RedisFuture zscan(ScoredValueStreamingChannel channel, K key) {
        return dispatch(commandBuilder.zscanStreaming(channel, key));
    }

    @Override
    public RedisFuture zscan(ScoredValueStreamingChannel channel, K key, ScanArgs scanArgs) {
        return dispatch(commandBuilder.zscanStreaming(channel, key, scanArgs));
    }

    @Override
    public RedisFuture zscan(ScoredValueStreamingChannel channel, K key, ScanCursor scanCursor,
            ScanArgs scanArgs) {
        return dispatch(commandBuilder.zscanStreaming(channel, key, scanCursor, scanArgs));
    }

    @Override
    public RedisFuture zscan(ScoredValueStreamingChannel channel, K key, ScanCursor scanCursor) {
        return dispatch(commandBuilder.zscanStreaming(channel, key, scanCursor));
    }

    @Override
    public String digest(V script) {
        return LettuceStrings.digest(codec.encodeValue(script));
    }

    @Override
    public RedisFuture> time() {
        return dispatch(commandBuilder.time());
    }

    @Override
    public RedisFuture waitForReplication(int replicas, long timeout) {
        return dispatch(commandBuilder.wait(replicas, timeout));
    }

    @Override
    public RedisFuture pfadd(K key, V value, V... moreValues) {
        return dispatch(commandBuilder.pfadd(key, value, moreValues));
    }

    @Override
    public RedisFuture pfadd(K key, V... values) {
        return dispatch(commandBuilder.pfadd(key, values));
    }

    @Override
    public RedisFuture pfmerge(K destkey, K sourcekey, K... moreSourceKeys) {
        return dispatch(commandBuilder.pfmerge(destkey, sourcekey, moreSourceKeys));
    }

    @Override
    public RedisFuture pfmerge(K destkey, K... sourcekeys) {
        return dispatch(commandBuilder.pfmerge(destkey, sourcekeys));
    }

    @Override
    public RedisFuture pfcount(K key, K... moreKeys) {
        return dispatch(commandBuilder.pfcount(key, moreKeys));
    }

    @Override
    public RedisFuture pfcount(K... keys) {
        return dispatch(commandBuilder.pfcount(keys));
    }

    @Override
    public RedisFuture clusterBumpepoch() {
        return dispatch(commandBuilder.clusterBumpepoch());
    }

    @Override
    public RedisFuture clusterMeet(String ip, int port) {
        return dispatch(commandBuilder.clusterMeet(ip, port));
    }

    @Override
    public RedisFuture clusterForget(String nodeId) {
        return dispatch(commandBuilder.clusterForget(nodeId));
    }

    @Override
    public RedisFuture clusterAddSlots(int... slots) {
        return dispatch(commandBuilder.clusterAddslots(slots));
    }

    @Override
    public RedisFuture clusterDelSlots(int... slots) {
        return dispatch(commandBuilder.clusterDelslots(slots));
    }

    @Override
    public RedisFuture clusterInfo() {
        return dispatch(commandBuilder.clusterInfo());
    }

    @Override
    public RedisFuture clusterMyId() {
        return dispatch(commandBuilder.clusterMyId());
    }

    @Override
    public RedisFuture clusterNodes() {
        return dispatch(commandBuilder.clusterNodes());
    }

    @Override
    public RedisFuture> clusterGetKeysInSlot(int slot, int count) {
        return dispatch(commandBuilder.clusterGetKeysInSlot(slot, count));
    }

    @Override
    public RedisFuture clusterCountKeysInSlot(int slot) {
        return dispatch(commandBuilder.clusterCountKeysInSlot(slot));
    }

    @Override
    public RedisFuture clusterCountFailureReports(String nodeId) {
        return dispatch(commandBuilder.clusterCountFailureReports(nodeId));
    }

    @Override
    public RedisFuture clusterKeyslot(K key) {
        return dispatch(commandBuilder.clusterKeyslot(key));
    }

    @Override
    public RedisFuture clusterSaveconfig() {
        return dispatch(commandBuilder.clusterSaveconfig());
    }

    @Override
    public RedisFuture clusterSetConfigEpoch(long configEpoch) {
        return dispatch(commandBuilder.clusterSetConfigEpoch(configEpoch));
    }

    @Override
    public RedisFuture> clusterSlots() {
        return dispatch(commandBuilder.clusterSlots());
    }

    @Override
    public RedisFuture clusterSetSlotNode(int slot, String nodeId) {
        return dispatch(commandBuilder.clusterSetSlotNode(slot, nodeId));
    }

    @Override
    public RedisFuture clusterSetSlotStable(int slot) {
        return dispatch(commandBuilder.clusterSetSlotStable(slot));
    }

    @Override
    public RedisFuture clusterSetSlotMigrating(int slot, String nodeId) {
        return dispatch(commandBuilder.clusterSetSlotMigrating(slot, nodeId));
    }

    @Override
    public RedisFuture clusterSetSlotImporting(int slot, String nodeId) {
        return dispatch(commandBuilder.clusterSetSlotImporting(slot, nodeId));
    }

    @Override
    public RedisFuture clusterFailover(boolean force) {
        return dispatch(commandBuilder.clusterFailover(force));
    }

    @Override
    public RedisFuture clusterReset(boolean hard) {
        return dispatch(commandBuilder.clusterReset(hard));
    }

    @Override
    public RedisFuture asking() {
        return dispatch(commandBuilder.asking());
    }

    @Override
    public RedisFuture clusterReplicate(String nodeId) {
        return dispatch(commandBuilder.clusterReplicate(nodeId));
    }

    @Override
    public RedisFuture clusterFlushslots() {
        return dispatch(commandBuilder.clusterFlushslots());
    }

    @Override
    public RedisFuture> clusterSlaves(String nodeId) {
        return dispatch(commandBuilder.clusterSlaves(nodeId));
    }

    @Override
    public RedisFuture zlexcount(K key, String min, String max) {
        return dispatch(commandBuilder.zlexcount(key, min, max));
    }

    @Override
    public RedisFuture zlexcount(K key, Range range) {
        return dispatch(commandBuilder.zlexcount(key, range));
    }

    @Override
    public RedisFuture zremrangebylex(K key, String min, String max) {
        return dispatch(commandBuilder.zremrangebylex(key, min, max));
    }

    @Override
    public RedisFuture zremrangebylex(K key, Range range) {
        return dispatch(commandBuilder.zremrangebylex(key, range));
    }

    @Override
    public RedisFuture> zrangebylex(K key, String min, String max) {
        return dispatch(commandBuilder.zrangebylex(key, min, max));
    }

    @Override
    public RedisFuture> zrangebylex(K key, Range range) {
        return dispatch(commandBuilder.zrangebylex(key, range, Limit.unlimited()));
    }

    @Override
    public RedisFuture> zrangebylex(K key, String min, String max, long offset, long count) {
        return dispatch(commandBuilder.zrangebylex(key, min, max, offset, count));
    }

    @Override
    public RedisFuture> zrangebylex(K key, Range range, Limit limit) {
        return dispatch(commandBuilder.zrangebylex(key, range, limit));
    }

    @Override
    public RedisFuture geoadd(K key, double longitude, double latitude, V member) {
        return dispatch(commandBuilder.geoadd(key, longitude, latitude, member));
    }

    @Override
    public RedisFuture geoadd(K key, Object... lngLatMember) {
        return dispatch(commandBuilder.geoadd(key, lngLatMember));
    }

    @Override
    public RedisFuture> geohash(K key, V... members) {
        return dispatch(commandBuilder.geohash(key, members));
    }

    @Override
    public RedisFuture> georadius(K key, double longitude, double latitude, double distance, GeoArgs.Unit unit) {
        return dispatch(commandBuilder.georadius(GEORADIUS, key, longitude, latitude, distance, unit.name()));
    }

    protected RedisFuture> georadius_ro(K key, double longitude, double latitude, double distance, GeoArgs.Unit unit) {
        return dispatch(commandBuilder.georadius(GEORADIUS_RO, key, longitude, latitude, distance, unit.name()));
    }

    @Override
    public RedisFuture>> georadius(K key, double longitude, double latitude, double distance,
            GeoArgs.Unit unit, GeoArgs geoArgs) {
        return dispatch(commandBuilder.georadius(GEORADIUS, key, longitude, latitude, distance, unit.name(), geoArgs));
    }

    protected RedisFuture>> georadius_ro(K key, double longitude, double latitude, double distance,
            GeoArgs.Unit unit, GeoArgs geoArgs) {
        return dispatch(commandBuilder.georadius(GEORADIUS_RO, key, longitude, latitude, distance, unit.name(), geoArgs));
    }

    @Override
    public RedisFuture georadius(K key, double longitude, double latitude, double distance, Unit unit,
            GeoRadiusStoreArgs geoRadiusStoreArgs) {
        return dispatch(commandBuilder.georadius(key, longitude, latitude, distance, unit.name(), geoRadiusStoreArgs));
    }

    @Override
    public RedisFuture> georadiusbymember(K key, V member, double distance, GeoArgs.Unit unit) {
        return dispatch(commandBuilder.georadiusbymember(GEORADIUSBYMEMBER, key, member, distance, unit.name()));
    }

    protected RedisFuture> georadiusbymember_ro(K key, V member, double distance, GeoArgs.Unit unit) {
        return dispatch(commandBuilder.georadiusbymember(GEORADIUSBYMEMBER_RO, key, member, distance, unit.name()));
    }

    @Override
    public RedisFuture>> georadiusbymember(K key, V member, double distance, GeoArgs.Unit unit,
            GeoArgs geoArgs) {
        return dispatch(commandBuilder.georadiusbymember(GEORADIUSBYMEMBER, key, member, distance, unit.name(), geoArgs));
    }

    protected RedisFuture>> georadiusbymember_ro(K key, V member, double distance, GeoArgs.Unit unit,
            GeoArgs geoArgs) {
        return dispatch(commandBuilder.georadiusbymember(GEORADIUSBYMEMBER_RO, key, member, distance, unit.name(), geoArgs));
    }

    @Override
    public RedisFuture georadiusbymember(K key, V member, double distance, Unit unit,
            GeoRadiusStoreArgs geoRadiusStoreArgs) {
        return dispatch(commandBuilder.georadiusbymember(key, member, distance, unit.name(), geoRadiusStoreArgs));
    }

    @Override
    public RedisFuture> geopos(K key, V... members) {
        return dispatch(commandBuilder.geopos(key, members));
    }

    @Override
    public RedisFuture geodist(K key, V from, V to, GeoArgs.Unit unit) {
        return dispatch(commandBuilder.geodist(key, from, to, unit));
    }

    @Override
    public  RedisFuture dispatch(ProtocolKeyword type, CommandOutput output) {

        LettuceAssert.notNull(type, "Command type must not be null");
        LettuceAssert.notNull(output, "CommandOutput type must not be null");

        return dispatch(new AsyncCommand<>(new Command<>(type, output)));
    }

    @Override
    public  RedisFuture dispatch(ProtocolKeyword type, CommandOutput output, CommandArgs args) {

        LettuceAssert.notNull(type, "Command type must not be null");
        LettuceAssert.notNull(output, "CommandOutput type must not be null");
        LettuceAssert.notNull(args, "CommandArgs type must not be null");

        return dispatch(new AsyncCommand<>(new Command<>(type, output, args)));
    }

    protected  RedisFuture dispatch(CommandType type, CommandOutput output) {
        return dispatch(type, output, null);
    }

    protected  RedisFuture dispatch(CommandType type, CommandOutput output, CommandArgs args) {
        return dispatch(new AsyncCommand<>(new Command<>(type, output, args)));
    }

    public  AsyncCommand dispatch(RedisCommand cmd) {
        AsyncCommand asyncCommand = new AsyncCommand<>(cmd);
        RedisCommand dispatched = connection.dispatch(asyncCommand);
        if (dispatched instanceof AsyncCommand) {
            return (AsyncCommand) dispatched;
        }
        return asyncCommand;
    }

    public void setTimeout(long timeout, TimeUnit unit) {
        connection.setTimeout(timeout, unit);
    }

    @Override
    public void close() {
        connection.close();
    }

    @Override
    public boolean isOpen() {
        return connection.isOpen();
    }

    @Override
    public void reset() {
        getConnection().reset();
    }

    public StatefulConnection getConnection() {
        return connection;
    }

    @Override
    public void setAutoFlushCommands(boolean autoFlush) {
        connection.setAutoFlushCommands(autoFlush);
    }

    @Override
    public void flushCommands() {
        connection.flushCommands();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy