public Future<Long> zunionstore(K destination, ZStoreArgs storeArgs, K... keys) {
   CommandArgs<K, V> args = new CommandArgs<K, V>(codec);
   args.addKey(destination).add(keys.length).addKeys(keys);
   storeArgs.build(args);
   return dispatch(ZUNIONSTORE, new IntegerOutput<K, V>(codec), args);
 }
 public Future<List<ScoredValue<V>>> zrevrangebyscoreWithScores(
     K key, String max, String min, long offset, long count) {
   CommandArgs<K, V> args = new CommandArgs<K, V>(codec);
   args.addKey(key).add(max).add(min).add(WITHSCORES).add(LIMIT).add(offset).add(count);
   return dispatch(ZREVRANGEBYSCORE, new ScoredValueListOutput<K, V>(codec), args);
 }
 public Future<Long> bitcount(K key, long start, long end) {
   CommandArgs<K, V> args = new CommandArgs<K, V>(codec);
   args.addKey(key).add(start).add(end);
   return dispatch(BITCOUNT, new IntegerOutput<K, V>(codec), args);
 }
 public Future<List<ScoredValue<V>>> zrevrangeWithScores(K key, long start, long stop) {
   CommandArgs<K, V> args = new CommandArgs<K, V>(codec);
   args.addKey(key).add(start).add(stop).add(WITHSCORES);
   return dispatch(ZREVRANGE, new ScoredValueListOutput<K, V>(codec), args);
 }
 public Future<List<ScoredValue<V>>> zrangebyscoreWithScores(K key, String min, String max) {
   CommandArgs<K, V> args = new CommandArgs<K, V>(codec);
   args.addKey(key).add(min).add(max).add(WITHSCORES);
   return dispatch(ZRANGEBYSCORE, new ScoredValueListOutput<K, V>(codec), args);
 }
 public Future<List<V>> zrangebyscore(K key, String min, String max, long offset, long count) {
   CommandArgs<K, V> args = new CommandArgs<K, V>(codec);
   args.addKey(key).add(min).add(max).add(LIMIT).add(offset).add(count);
   return dispatch(ZRANGEBYSCORE, new ValueListOutput<K, V>(codec), args);
 }
 public Future<Long> linsert(K key, boolean before, V pivot, V value) {
   CommandArgs<K, V> args = new CommandArgs<K, V>(codec);
   args.addKey(key).add(before ? BEFORE : AFTER).addValue(pivot).addValue(value);
   return dispatch(LINSERT, new IntegerOutput<K, V>(codec), args);
 }
 public Future<V> brpoplpush(long timeout, K source, K destination) {
   CommandArgs<K, V> args = new CommandArgs<K, V>(codec);
   args.addKey(source).addKey(destination).add(timeout);
   return dispatch(BRPOPLPUSH, new ValueOutput<K, V>(codec), args);
 }