package io.craft.atom.redis; import io.craft.atom.redis.api.Redis; import io.craft.atom.redis.api.RedisConnectionException; import io.craft.atom.redis.api.RedisDataException; import io.craft.atom.redis.api.RedisException; import io.craft.atom.redis.api.RedisPoolConfig; import io.craft.atom.redis.api.RedisPubSub; import io.craft.atom.redis.api.RedisTransaction; import io.craft.atom.redis.api.ScanResult; import io.craft.atom.redis.api.Slowlog; import io.craft.atom.redis.api.handler.RedisMonitorHandler; import io.craft.atom.redis.api.handler.RedisPsubscribeHandler; import io.craft.atom.redis.api.handler.RedisSubscribeHandler; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.Semaphore; import lombok.EqualsAndHashCode; import lombok.ToString; import redis.clients.jedis.BinaryClient.LIST_POSITION; import redis.clients.jedis.BitOP; import redis.clients.jedis.BitPosParams; import redis.clients.jedis.DebugParams; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisMonitor; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.JedisPubSub; import redis.clients.jedis.ScanParams; import redis.clients.jedis.SortingParams; import redis.clients.jedis.Transaction; import redis.clients.jedis.Tuple; import redis.clients.jedis.ZParams; import redis.clients.jedis.ZParams.Aggregate; import redis.clients.jedis.exceptions.JedisConnectionException; import redis.clients.jedis.exceptions.JedisDataException; /** * @author mindwind * @version 1.0, Jun 15, 2013 */ @EqualsAndHashCode(of = { "host", "port" }) @ToString(of = { "host", "port" }) @SuppressWarnings("unchecked") public class DefaultRedis implements Redis { private static final String OK = "OK" ; private static final ThreadLocal<Jedis> THREAD_LOCAL_JEDIS = new ThreadLocal<Jedis>(); private String host ; private String password ; private int port = 6379 ; private int timeoutInMillis = 2000 ; private int database = 0 ; private RedisPoolConfig poolConfig = poolConfig(100); private volatile JedisPool pool ; // ~ --------------------------------------------------------------------------------------------------------- public DefaultRedis(String host, int port) { this.host = host; this.port = port; init(); } public DefaultRedis(String host, int port, int timeout) { this.host = host; this.port = port; this.timeoutInMillis = timeout; init(); } public DefaultRedis(String host, int port, int timeout, int poolSize) { this.host = host; this.port = port; this.timeoutInMillis = timeout; this.poolConfig = poolConfig(poolSize); init(); } public DefaultRedis(String host, int port, int timeout, int poolSize, String password) { this.host = host; this.port = port; this.timeoutInMillis = timeout; this.poolConfig = poolConfig(poolSize); this.password = password; init(); } public DefaultRedis(String host, int port, int timeout, int poolSize, String password, int database) { this.host = host; this.port = port; this.timeoutInMillis = timeout; this.poolConfig = poolConfig(poolSize); this.password = password; this.database = database; init(); } public DefaultRedis(String host, int port, int timeout, RedisPoolConfig poolConfig) { this.host = host; this.port = port; this.timeoutInMillis = timeout; this.poolConfig = poolConfig; init(); } public DefaultRedis(String host, int port, int timeout, RedisPoolConfig poolConfig, String password) { this.host = host; this.port = port; this.timeoutInMillis = timeout; this.poolConfig = poolConfig; this.password = password; init(); } public DefaultRedis(String host, int port, int timeout, RedisPoolConfig poolConfig, String password, int database) { this.host = host; this.port = port; this.timeoutInMillis = timeout; this.poolConfig = poolConfig; this.password = password; this.database = database; init(); } private RedisPoolConfig poolConfig(int poolSize) { if (poolSize <= 0) { throw new IllegalArgumentException(String.format("Redis init <poolSize=%s> must > 0", poolSize)); } RedisPoolConfig cfg = new RedisPoolConfig(); cfg.setMaxTotal(poolSize); cfg.setMaxIdle(poolSize); cfg.setMinIdle(0); return cfg; } private void init() { if (timeoutInMillis < 0) { throw new IllegalArgumentException(String.format("Redis init [timeoutInMillis=%s] must >= 0", timeoutInMillis)); } pool = new JedisPool(convert(poolConfig), host, port, timeoutInMillis, password, database); } private JedisPoolConfig convert(RedisPoolConfig cfg) { JedisPoolConfig jpc = new JedisPoolConfig(); jpc.setBlockWhenExhausted(cfg.isBlockWhenExhausted()); jpc.setLifo(cfg.isLifo()); jpc.setMaxIdle(cfg.getMaxIdle()); jpc.setMaxTotal(cfg.getMaxTotal()); jpc.setMaxWaitMillis(cfg.getMaxWaitMillis()); jpc.setMinEvictableIdleTimeMillis(cfg.getMinEvictableIdleTimeMillis()); jpc.setMinIdle(cfg.getMinIdle()); jpc.setNumTestsPerEvictionRun(cfg.getNumTestsPerEvictionRun()); jpc.setTestOnBorrow(cfg.isTestOnBorrow()); jpc.setTestOnReturn(cfg.isTestOnReturn()); jpc.setTestWhileIdle(cfg.isTestWhileIdle()); jpc.setTimeBetweenEvictionRunsMillis(cfg.getTimeBetweenEvictionRunsMillis()); return jpc; } // ~ --------------------------------------------------------------------------------------------------------- @Override public String host() { return host; } @Override public int port() { return port; } @Override public String password() { return password; } @Override public int timeoutInMillis() { return timeoutInMillis; } @Override public int database() { return database; } @Override public RedisPoolConfig poolConfig() { return poolConfig; } // ~ --------------------------------------------------------------------------------------------------------- Keys @Override public Long del(String... keys) { return (Long) executeCommand(CommandEnum.DEL, new Object[] { keys }); } private Long del0(Jedis j, String... keys) { return j.del(keys); } @Override public byte[] dump(String key) { return (byte[]) executeCommand(CommandEnum.DUMP, new Object[] { key }); } private byte[] dump0(Jedis j, String key) { return j.dump(key); } @Override public Boolean exists(String key) { return (Boolean) executeCommand(CommandEnum.EXISTS, new Object[] { key }); } private Boolean exists0(Jedis j, String key) { return j.exists(key); } @Override public Long expire(String key, int seconds) { return (Long) executeCommand(CommandEnum.EXPIRE, new Object[] { key, seconds }); } private Long expire0(Jedis j, String key, int seconds) { return j.expire(key, seconds); } @Override public Long expireat(String key, long timestamp) { return (Long) executeCommand(CommandEnum.EXPIREAT, new Object[] { key, timestamp }); } private Long expireat0(Jedis j, String key, long timestamp) { return j.expireAt(key, timestamp); } @Override public Set<String> keys(String pattern) { return (Set<String>) executeCommand(CommandEnum.KEYS, new Object[] { pattern }); } private Set<String> keys0(Jedis j, String pattern) { return j.keys(pattern); } @Override public String migrate(String host, int port, String key, int destinationdb, int timeout) { return (String) executeCommand(CommandEnum.MIGRATE, new Object[] { host, port, key, destinationdb, timeout }); } private String migrate0(Jedis j, String host, int port, String key, int destinationdb, int timeout) { return j.migrate(host, port, key, destinationdb, timeout); } @Override public Long move(String key, int db) { return (Long) executeCommand(CommandEnum.MOVE, new Object[] { key, db }); } private Long move0(Jedis j, String key, int db) { return j.move(key, db); } @Override public Long objectrefcount(String key) { return (Long) executeCommand(CommandEnum.OBJECT_REFCOUNT, new Object[] { key }); } private Long objectrefcount0(Jedis j, String key) { return j.objectRefcount(key); } @Override public String objectencoding(String key) { return (String) executeCommand(CommandEnum.OBJECT_ENCODING, new Object[] { key }); } private String objectencoding0(Jedis j, String key) { return j.objectEncoding(key); } @Override public Long objectidletime(String key) { return (Long) executeCommand(CommandEnum.OBJECT_IDLETIME, new Object[] { key }); } private Long objectidletime0(Jedis j, String key) { return j.objectIdletime(key); } @Override public Long persist(String key) { return (Long) executeCommand(CommandEnum.PERSIST, new Object[] { key }); } private Long persist0(Jedis j, String key) { return j.persist(key); } @Override public Long pexpire(String key, long milliseconds) { return (Long) executeCommand(CommandEnum.PEXPIRE, new Object[] { key, milliseconds }); } private Long pexpire0(Jedis j, String key, long milliseconds) { return j.pexpire(key, milliseconds); } @Override public Long pexpireat(String key, long millisecondstimestamp) { return (Long) executeCommand(CommandEnum.PEXPIREAT, new Object[] { key, millisecondstimestamp }); } private Long pexpireat0(Jedis j, String key, long millisecondstimestamp) { return j.pexpireAt(key, millisecondstimestamp); } @Override public Long pttl(String key) { return (Long) executeCommand(CommandEnum.PTTL, new Object[] { key }); } private Long pttl0(Jedis j, String key) { return j.pttl(key); } @Override public String randomkey() { return (String) executeCommand(CommandEnum.RANDOMKEY, new Object[] {}); } private String randomkey0(Jedis j) { return j.randomKey(); } @Override public String rename(String key, String newkey) { return (String) executeCommand(CommandEnum.RENAME, new Object[] { key, newkey }); } private String rename0(Jedis j, String key, String newkey) { return j.rename(key, newkey); } @Override public Long renamenx(String key, String newkey) { return (Long) executeCommand(CommandEnum.RENAMENX, new Object[] { key, newkey }); } private Long renamenx0(Jedis j, String key, String newkey) { return j.renamenx(key, newkey); } @Override public String restore(String key, int ttl, byte[] serializedvalue) { return (String) executeCommand(CommandEnum.RESTORE, new Object[] { key, ttl, serializedvalue }); } private String restore0(Jedis j, String key, int ttl, byte[] serializedvalue) { return j.restore(key, ttl, serializedvalue); } @Override public List<String> sort(String key) { return (List<String>) executeCommand(CommandEnum.SORT, new Object[] { key }); } private List<String> sort0(Jedis j, String key) { return j.sort(key); } @Override public List<String> sort(String key, boolean desc) { return (List<String>) executeCommand(CommandEnum.SORT_DESC, new Object[] { key, desc }); } private List<String> sort_desc(Jedis j, String key, boolean desc) { SortingParams sp = new SortingParams(); if (desc) { sp.desc(); } return j.sort(key, sp); } @Override public List<String> sort(String key, boolean alpha, boolean desc) { return (List<String>) executeCommand(CommandEnum.SORT_ALPHA_DESC, new Object[] { key, alpha, desc }); } private List<String> sort_alpha_desc(Jedis j, String key, boolean alpha, boolean desc) { SortingParams sp = new SortingParams(); if (desc) { sp.desc(); } if (alpha) { sp.alpha() ; } return j.sort(key, sp); } @Override public List<String> sort(String key, int offset, int count) { return (List<String>) executeCommand(CommandEnum.SORT_OFFSET_COUNT, new Object[] { key, offset, count }); } private List<String> sort_offset_count(Jedis j, String key, int offset, int count) { return j.sort(key, new SortingParams().limit(offset, count)); } @Override public List<String> sort(String key, int offset, int count, boolean alpha, boolean desc) { return (List<String>) executeCommand(CommandEnum.SORT_OFFSET_COUNT_ALPHA_DESC, new Object[] { key, offset, count, alpha, desc }); } private List<String> sort_offset_count_alpha_desc(Jedis j, String key, int offset, int count, boolean alpha, boolean desc) { SortingParams sp = new SortingParams(); if (desc) { sp.desc(); } if (alpha) { sp.alpha() ; } sp.limit(offset, count); return j.sort(key, sp); } @Override public List<String> sort(String key, String bypattern, String... getpatterns) { return (List<String>) executeCommand(CommandEnum.SORT_BY_GET, new Object[] { key, bypattern, getpatterns }); } private List<String> sort_by_get(Jedis j, String key, String bypattern, String... getpatterns) { SortingParams sp = new SortingParams(); sp.by(bypattern); sp.get(getpatterns); return j.sort(key, sp); } @Override public List<String> sort(String key, String bypattern, boolean desc, String... getpatterns) { return (List<String>) executeCommand(CommandEnum.SORT_BY_DESC_GET, new Object[] { key, bypattern, desc, getpatterns }); } private List<String> sort_by_desc_get(Jedis j, String key, String bypattern, boolean desc, String... getpatterns) { SortingParams sp = new SortingParams(); sp.by(bypattern); sp.get(getpatterns); if (desc) { sp.desc(); } return j.sort(key, sp); } @Override public List<String> sort(String key, String bypattern, boolean alpha, boolean desc, String... getpatterns) { return (List<String>) executeCommand(CommandEnum.SORT_BY_ALPHA_DESC_GET, new Object[] { key, bypattern, alpha, desc, getpatterns }); } private List<String> sort_by_alpha_desc_get(Jedis j, String key, String bypattern, boolean alpha, boolean desc, String... getpatterns) { SortingParams sp = new SortingParams(); sp.by(bypattern); sp.get(getpatterns); if (alpha) { sp.alpha(); } if (desc) { sp.desc(); } return j.sort(key, sp); } @Override public List<String> sort(String key, String bypattern, int offset, int count, String... getpatterns) { return (List<String>) executeCommand(CommandEnum.SORT_BY_OFFSET_COUNT_GET, new Object[] { key, bypattern, offset, count, getpatterns }); } private List<String> sort_by_offset_count_get(Jedis j, String key, String bypattern, int offset, int count, String... getpatterns) { SortingParams sp = new SortingParams(); sp.by(bypattern); sp.get(getpatterns); sp.limit(offset, count); return j.sort(key, sp); } @Override public List<String> sort(String key, String bypattern, int offset, int count, boolean alpha, boolean desc, String... getpatterns) { return (List<String>) executeCommand(CommandEnum.SORT_BY_OFFSET_COUNT_ALPHA_DESC_GET, new Object[] { key, bypattern, offset, count, alpha, desc, getpatterns }); } private List<String> sort_by_offset_count_alpha_desc_get(Jedis j, String key, String bypattern, int offset, int count, boolean alpha, boolean desc, String... getpatterns) { SortingParams sp = new SortingParams(); sp.by(bypattern); sp.get(getpatterns); sp.limit(offset, count); if (alpha) { sp.alpha(); } if (desc) { sp.desc(); } return j.sort(key, sp); } @Override public Long sort(String key, String destination) { return (Long) executeCommand(CommandEnum.SORT_DESTINATION, key, destination); } private Long sort_destination(Jedis j, String key, String destination) { return j.sort(key, destination); } @Override public Long sort(String key, boolean desc, String destination) { return (Long) executeCommand(CommandEnum.SORT_DESC_DESTINATION, key, desc, destination); } private Long sort_desc_destination(Jedis j, String key, boolean desc, String destination) { SortingParams sp = new SortingParams(); if (desc) { sp.desc(); } return j.sort(key, sp, destination); } @Override public Long sort(String key, boolean alpha, boolean desc, String destination) { return (Long) executeCommand(CommandEnum.SORT_ALPHA_DESC_DESTINATION, key, alpha, desc, destination); } private Long sort_alpha_desc_destination(Jedis j, String key, boolean alpha, boolean desc, String destination) { SortingParams sp = new SortingParams(); if (desc) { sp.desc(); } if (alpha) { sp.alpha(); } return j.sort(key, sp, destination); } @Override public Long sort(String key, int offset, int count, String destination) { return (Long) executeCommand(CommandEnum.SORT_OFFSET_COUNT_DESTINATION, key, offset, count, destination); } private Long sort_offset_count_destination(Jedis j, String key, int offset, int count, String destination) { SortingParams sp = new SortingParams(); sp.limit(offset, count); return j.sort(key, sp, destination); } @Override public Long sort(String key, int offset, int count, boolean alpha, boolean desc, String destination) { return (Long) executeCommand(CommandEnum.SORT_OFFSET_COUNT_ALPHA_DESC_DESTINATION, key, offset, count, alpha, desc, destination); } private Long sort_offset_count_alpha_desc_destination(Jedis j, String key, int offset, int count, boolean alpha, boolean desc, String destination) { SortingParams sp = new SortingParams(); sp.limit(offset, count); if (desc) { sp.desc(); } if (alpha) { sp.alpha(); } return j.sort(key, sp, destination); } @Override public Long sort(String key, String bypattern, String destination, String... getpatterns) { return (Long) executeCommand(CommandEnum.SORT_BY_DESTINATION_GET, new Object[] { key, bypattern, destination, getpatterns }); } private Long sort_by_destination_get(Jedis j, String key, String bypattern, String destination, String... getpatterns) { SortingParams sp = new SortingParams(); sp.by(bypattern); sp.get(getpatterns); return j.sort(key, sp, destination); } @Override public Long sort(String key, String bypattern, boolean desc, String destination, String... getpatterns) { return (Long) executeCommand(CommandEnum.SORT_BY_DESC_DESTINATION_GET, new Object[] { key, bypattern, desc, destination, getpatterns }); } private Long sort_by_desc_destination_get(Jedis j, String key, String bypattern, boolean desc, String destination, String... getpatterns) { SortingParams sp = new SortingParams(); sp.by(bypattern); sp.get(getpatterns); if (desc) { sp.desc(); } return j.sort(key, sp, destination); } @Override public Long sort(String key, String bypattern, boolean alpha, boolean desc, String destination, String... getpatterns) { return (Long) executeCommand(CommandEnum.SORT_BY_ALPHA_DESC_DESTINATION_GET, new Object[] { key, bypattern, alpha, desc, destination, getpatterns }); } private Long sort_by_alpha_desc_destination_get(Jedis j, String key, String bypattern, boolean alpha, boolean desc, String destination, String... getpatterns) { SortingParams sp = new SortingParams(); sp.by(bypattern); sp.get(getpatterns); if (alpha) { sp.alpha(); } if (desc) { sp.desc(); } return j.sort(key, sp, destination); } @Override public Long sort(String key, String bypattern, int offset, int count, String destination, String... getpatterns) { return (Long) executeCommand(CommandEnum.SORT_BY_OFFSET_COUNT_DESTINATION_GET, new Object[] { key, bypattern, offset, count, destination, getpatterns }); } private Long sort_by_offset_count_destination_get(Jedis j, String key, String bypattern, int offset, int count, String destination, String... getpatterns) { SortingParams sp = new SortingParams(); sp.by(bypattern); sp.get(getpatterns); sp.limit(offset, count); return j.sort(key, sp, destination); } @Override public Long sort(String key, String bypattern, int offset, int count, boolean alpha, boolean desc, String destination, String... getpatterns) { return (Long) executeCommand(CommandEnum.SORT_BY_OFFSET_COUNT_ALPHA_DESC_DESTINATION_GET, new Object[] { key, bypattern, offset, count, alpha, desc, destination, getpatterns }); } private Long sort_by_offset_count_alpha_desc_destination_get(Jedis j, String key, String bypattern, int offset, int count, boolean alpha, boolean desc, String destination, String... getpatterns) { SortingParams sp = new SortingParams(); sp.by(bypattern); sp.get(getpatterns); sp.limit(offset, count); if (alpha) { sp.alpha(); } if (desc) { sp.desc(); } return j.sort(key, sp, destination); } @Override public Long ttl(String key) { return (Long) executeCommand(CommandEnum.TTL, new Object[] { key }); } private Long ttl0(Jedis j, String key) { return j.ttl(key); } @Override public String type(String key) { return (String) executeCommand(CommandEnum.TYPE, new Object[] { key }); } private String type0(Jedis j, String key) { return j.type(key); } @Override public ScanResult<String> scan(String cursor) { return (ScanResult<String>) executeCommand(CommandEnum.SCAN, new Object[] { cursor }); } private ScanResult<String> scan0(Jedis j, String cursor) { redis.clients.jedis.ScanResult<String> sr = j.scan(cursor); return new ScanResult<String>(sr.getStringCursor(), sr.getResult()); } @Override public ScanResult<String> scan(String cursor, int count) { return (ScanResult<String>) executeCommand(CommandEnum.SCAN_COUNT, new Object[] { cursor, count }); } private ScanResult<String> scan_count(Jedis j, String cursor, int count) { ScanParams param = new ScanParams(); param.count(count); redis.clients.jedis.ScanResult<String> sr = j.scan(cursor, param); return new ScanResult<String>(sr.getStringCursor(), sr.getResult()); } @Override public ScanResult<String> scan(String cursor, String pattern) { return (ScanResult<String>) executeCommand(CommandEnum.SCAN_MATCH, new Object[] { cursor, pattern }); } private ScanResult<String> scan_match(Jedis j, String cursor, String pattern) { ScanParams param = new ScanParams(); param.match(pattern); redis.clients.jedis.ScanResult<String> sr = j.scan(cursor, param); return new ScanResult<String>(sr.getStringCursor(), sr.getResult()); } @Override public ScanResult<String> scan(String cursor, String pattern, int count) { return (ScanResult<String>) executeCommand(CommandEnum.SCAN_MATCH_COUNT, new Object[] { cursor, pattern, count }); } private ScanResult<String> scan_match_count(Jedis j, String cursor, String pattern, int count) { ScanParams param = new ScanParams(); param.match(pattern); param.count(count); redis.clients.jedis.ScanResult<String> sr = j.scan(cursor, param); return new ScanResult<String>(sr.getStringCursor(), sr.getResult()); } // ~ ------------------------------------------------------------------------------------------------------ Strings @Override public Long append(String key, String value) { return (Long) executeCommand(CommandEnum.APPEND, key, value); } private Long append0(Jedis j, String key, String value) { return j.append(key, value); } @Override public Long bitcount(String key) { return (Long) executeCommand(CommandEnum.BITCOUNT, key); } private Long bitcount0(Jedis j, String key) { return j.bitcount(key); } @Override public Long bitcount(String key, long start, long end) { return (Long) executeCommand(CommandEnum.BITCOUNT_START_END, key, start, end); } private Long bitcount0(Jedis j, String key, long start, long end) { return j.bitcount(key, start, end); } @Override public Long bitnot(String destkey, String key) { return (Long) executeCommand(CommandEnum.BITNOT, destkey, key); } private Long bitnot0(Jedis j, String destkey, String key) { return j.bitop(BitOP.NOT, destkey, key); } @Override public Long bitand(String destkey, String... keys) { return (Long) executeCommand(CommandEnum.BITAND, destkey, keys); } private Long bitand0(Jedis j, String destkey, String... keys) { return j.bitop(BitOP.AND, destkey, keys); } @Override public Long bitor(String destkey, String... keys) { return (Long) executeCommand(CommandEnum.BITOR, destkey, keys); } private Long bitor0(Jedis j, String destkey, String... keys) { return j.bitop(BitOP.OR, destkey, keys); } @Override public Long bitxor(String destkey, String... keys) { return (Long) executeCommand(CommandEnum.BITXOR, destkey, keys); } private Long bitxor0(Jedis j, String destkey, String... keys) { return j.bitop(BitOP.XOR, destkey, keys); } @Override public Long bitpos(String key, boolean value) { return (Long) executeCommand(CommandEnum.BITPOS, key, value); } private Long bitpos0(Jedis j, String key, boolean value) { return j.bitpos(key, value); } @Override public Long bitpos(String key, boolean value, long start) { return (Long) executeCommand(CommandEnum.BITPOS_START, key, value, start); } private Long bitpos0(Jedis j, String key, boolean value, long start) { return j.bitpos(key, value, new BitPosParams(start)); } @Override public Long bitpos(String key, boolean value, long start, long end) { return (Long) executeCommand(CommandEnum.BITPOS_START_END, key, value, start, end); } private Long bitpos0(Jedis j, String key, boolean value, long start, long end) { return j.bitpos(key, value, new BitPosParams(start, end)); } @Override public Long decr(String key) { return (Long) executeCommand(CommandEnum.DECR, key); } private Long decr0(Jedis j, String key) { return j.decr(key); } @Override public Long decrby(String key, long decrement) { return (Long) executeCommand(CommandEnum.DECRBY, key, decrement); } private Long decrby0(Jedis j, String key, long decrement) { return j.decrBy(key, decrement); } @Override public String get(String key) { return (String) executeCommand(CommandEnum.GET, key); } private String get0(Jedis j, String key) { return j.get(key); } @Override public Boolean getbit(String key, long offset) { return (Boolean) executeCommand(CommandEnum.GETBIT, key, offset); } private Boolean getbit0(Jedis j, String key, long offset) { return j.getbit(key, offset); } @Override public String getrange(String key, long start, long end) { return (String) executeCommand(CommandEnum.GETRANGE, key, start, end); } private String getrange0(Jedis j, String key, long start, long end) { return j.getrange(key, start, end); } @Override public String getset(String key, String value) { return (String) executeCommand(CommandEnum.GETSET, key, value); } private String getset0(Jedis j, String key, String value) { return j.getSet(key, value); } @Override public Long incr(String key) { return (Long) executeCommand(CommandEnum.INCR, key); } private Long incr0(Jedis j, String key) { return j.incr(key); } @Override public Long incrby(String key, long increment) { return (Long) executeCommand(CommandEnum.INCRBY, key, increment); } private Long incrby0(Jedis j, String key, long increment) { return j.incrBy(key, increment); } @Override public Double incrbyfloat(String key, double increment) { return (Double) executeCommand(CommandEnum.INCRBYFLOAT, key, increment); } private Double incrbyfloat0(Jedis j, String key, double increment) { return j.incrByFloat(key, increment); } @Override public List<String> mget(String... keys) { return (List<String>) executeCommand(CommandEnum.MGET, new Object[] { keys }); } private List<String> mget0(Jedis j, String... keys) { return j.mget(keys); } @Override public String mset(String... keysvalues) { return (String) executeCommand(CommandEnum.MSET, new Object[] { keysvalues }); } private String mset0(Jedis j, String... keysvalues) { return j.mset(keysvalues); } @Override public Long msetnx(String... keysvalues) { return (Long) executeCommand(CommandEnum.MSETNX, new Object[] { keysvalues }); } private Long msetnx0(Jedis j, String... keysvalues) { return j.msetnx(keysvalues); } @Override public String psetex(String key, int milliseconds, String value) { return (String) executeCommand(CommandEnum.PSETEX, key, milliseconds, value); } private String psetex0(Jedis j, String key, int milliseconds, String value) { return j.psetex(key, (long) milliseconds, value); } @Override public String set(String key, String value) { return (String) executeCommand(CommandEnum.SET, key, value); } private String set0(Jedis j, String key, String value) { return j.set(key, value); } @Override public String setxx(String key, String value) { return (String) executeCommand(CommandEnum.SETXX, key, value); } private String setxx0(Jedis j, String key, String value) { return j.set(key, value, "XX"); } @Override public String setnxex(String key, String value, int seconds) { return (String) executeCommand(CommandEnum.SETNXEX, key, value, seconds); } private String setnxex0(Jedis j, String key, String value, int seconds) { return j.set(key, value, "NX", "EX", seconds); } @Override public String setnxpx(String key, String value, int milliseconds) { return (String) executeCommand(CommandEnum.SETNXPX, key, value, milliseconds); } private String setnxpx0(Jedis j, String key, String value, int milliseconds) { return j.set(key, value, "NX", "PX", milliseconds); } @Override public String setxxex(String key, String value, int seconds) { return (String) executeCommand(CommandEnum.SETXXEX, key, value, seconds); } private String setxxex0(Jedis j, String key, String value, int seconds) { return j.set(key, value, "XX", "EX", seconds); } @Override public String setxxpx(String key, String value, int milliseconds) { return (String) executeCommand(CommandEnum.SETXXPX, key, value, milliseconds); } private String setxxpx0(Jedis j, String key, String value, int milliseconds) { return j.set(key, value, "XX", "PX", milliseconds); } @Override public Boolean setbit(String key, long offset, boolean value) { return (Boolean) executeCommand(CommandEnum.SETBIT, key, offset, value); } private Boolean setbit0(Jedis j, String key, long offset, boolean value) { return j.setbit(key, offset, value); } @Override public String setex(String key, int seconds, String value) { return (String) executeCommand(CommandEnum.SETEX, key, seconds, value); } private String setex0(Jedis j, String key, int seconds, String value) { return j.setex(key, seconds, value); } @Override public Long setnx(String key, String value) { return (Long) executeCommand(CommandEnum.SETNX, key, value); } private Long setnx0(Jedis j, String key, String value) { return j.setnx(key, value); } @Override public Long setrange(String key, long offset, String value) { return (Long) executeCommand(CommandEnum.SETRANGE, key, offset, value); } private Long setrange0(Jedis j, String key, long offset, String value) { return j.setrange(key, offset, value); } @Override public Long strlen(String key) { return (Long) executeCommand(CommandEnum.STRLEN, key); } private Long strlen0(Jedis j, String key) { return j.strlen(key); } // ~ ------------------------------------------------------------------------------------------------------ Hashes @Override public Long hdel(String key, String... fields) { return (Long) executeCommand(CommandEnum.HDEL, key, fields); } private Long hdel0(Jedis j, String key, String... fields) { return j.hdel(key, fields); } @Override public Boolean hexists(String key, String field) { return (Boolean) executeCommand(CommandEnum.HEXISTS, key, field); } private Boolean hexists0(Jedis j, String key, String field) { return j.hexists(key, field); } @Override public String hget(String key, String field) { return (String) executeCommand(CommandEnum.HGET, key, field); } private String hget0(Jedis j, String key, String field) { return j.hget(key, field); } @Override public Map<String, String> hgetall(String key) { return (Map<String, String>) executeCommand(CommandEnum.HGETALL, key); } private Map<String, String> hgetall0(Jedis j, String key) { return j.hgetAll(key); } @Override public Long hincrby(String key, String field, long increment) { return (Long) executeCommand(CommandEnum.HINCRBY, key, field, increment); } private Long hincrby0(Jedis j, String key, String field, long increment) { return j.hincrBy(key, field, increment); } @Override public Double hincrbyfloat(String key, String field, double increment) { return (Double) executeCommand(CommandEnum.HINCRBYFLOAT, key, field, increment); } private Double hincrbyfloat0(Jedis j, String key, String field, double increment) { return j.hincrByFloat(key, field, increment); } @Override public Set<String> hkeys(String key) { return (Set<String>) executeCommand(CommandEnum.HKEYS, key); } private Set<String> hkeys0(Jedis j, String key) { return j.hkeys(key); } @Override public Long hlen(String key) { return (Long) executeCommand(CommandEnum.HLEN, key); } private Long hlen0(Jedis j, String key) { return j.hlen(key); } @Override public List<String> hmget(String key, String... fields) { return (List<String>) executeCommand(CommandEnum.HMGET, key, fields); } private List<String> hmget0(Jedis j, String key, String... fields) { return j.hmget(key, fields); } @Override public String hmset(String key, Map<String, String> fieldvalues) { return (String) executeCommand(CommandEnum.HMSET, key, fieldvalues); } private String hmset0(Jedis j, String key, Map<String, String> fieldvalues) { return j.hmset(key, fieldvalues); } @Override public Long hset(String key, String field, String value) { return (Long) executeCommand(CommandEnum.HSET, key, field, value); } private Long hset0(Jedis j, String key, String field, String value) { return j.hset(key, field, value); } @Override public Long hsetnx(String key, String field, String value) { return (Long) executeCommand(CommandEnum.HSETNX, key, field, value); } private Long hsetnx0(Jedis j, String key, String field, String value) { return j.hsetnx(key, field, value); } @Override public List<String> hvals(String key) { return (List<String>) executeCommand(CommandEnum.HVALS, key); } private List<String> hvals0(Jedis j, String key) { return j.hvals(key); } @Override public ScanResult<Map.Entry<String, String>> hscan(String key, String cursor) { return (ScanResult<Map.Entry<String, String>>) executeCommand(CommandEnum.HSCAN, new Object[] { key, cursor }); } private ScanResult<Map.Entry<String, String>> hscan0(Jedis j, String key, String cursor) { redis.clients.jedis.ScanResult<Map.Entry<String, String>> sr = j.hscan(key, cursor); return new ScanResult<Map.Entry<String, String>>(sr.getStringCursor(), sr.getResult()); } @Override public ScanResult<Map.Entry<String, String>> hscan(String key, String cursor, int count) { return (ScanResult<Map.Entry<String, String>>) executeCommand(CommandEnum.HSCAN_COUNT, new Object[] { key, cursor, count }); } private ScanResult<Map.Entry<String, String>> hscan_count(Jedis j, String key, String cursor, int count) { ScanParams param = new ScanParams(); param.count(count); redis.clients.jedis.ScanResult<Map.Entry<String, String>> sr = j.hscan(key, cursor, param); return new ScanResult<Map.Entry<String, String>>(sr.getStringCursor(), sr.getResult()); } @Override public ScanResult<Map.Entry<String, String>> hscan(String key, String cursor, String pattern) { return (ScanResult<Map.Entry<String, String>>) executeCommand(CommandEnum.HSCAN_MATCH, new Object[] { key, cursor, pattern }); } private ScanResult<Map.Entry<String, String>> hscan_match(Jedis j, String key, String cursor, String pattern) { ScanParams param = new ScanParams(); param.match(pattern); redis.clients.jedis.ScanResult<Map.Entry<String, String>> sr = j.hscan(key, cursor, param); return new ScanResult<Map.Entry<String, String>>(sr.getStringCursor(), sr.getResult()); } @Override public ScanResult<Map.Entry<String, String>> hscan(String key, String cursor, String pattern, int count) { return (ScanResult<Map.Entry<String, String>>) executeCommand(CommandEnum.HSCAN_MATCH_COUNT, new Object[] { key, cursor, pattern, count }); } private ScanResult<Map.Entry<String, String>> hscan_match_count(Jedis j, String key, String cursor, String pattern, int count) { ScanParams param = new ScanParams(); param.match(pattern); param.count(count); redis.clients.jedis.ScanResult<Map.Entry<String, String>> sr = j.hscan(key, cursor, param); return new ScanResult<Map.Entry<String, String>>(sr.getStringCursor(), sr.getResult()); } // ~ ------------------------------------------------------------------------------------------------------- Lists @Override public String blpop(String key) { return blpop(key, 0); } @Override public String blpop(String key, int timeout) { Map<String, String> map = blpop(0, key); return map.get(key); } @Override public Map<String, String> blpop(String... keys) { return blpop(0, keys); } @Override public Map<String, String> blpop(int timeout, String... keys) { return (Map<String, String>) executeCommand(CommandEnum.BLPOP, new Object[] { timeout, keys }); } private Map<String, String> blpop0(Jedis j, int timeout, String... keys) { List<String> l = j.blpop(timeout, keys); return convert4bpop(l); } private Map<String, String> convert4bpop(List<String> l) { Map<String, String> map = new LinkedHashMap<String, String>(); if (l == null) { return map; } for (int i = 0; i < l.size(); i += 2) { String key = l.get(i); String value = l.get(i + 1); map.put(key, value); } return map; } @Override public String brpop(String key) { return brpop(key, 0); } @Override public String brpop(String key, int timeout) { Map<String, String> map = brpop(0, key); return map.get(key); } @Override public Map<String, String> brpop(String... keys) { return brpop(0, keys); } @Override public Map<String, String> brpop(int timeout, String... keys) { return (Map<String, String>) executeCommand(CommandEnum.BRPOP, timeout, keys); } private Map<String, String> brpop0(Jedis j, int timeout, String... keys) { List<String> l = j.brpop(timeout, keys); return convert4bpop(l); } @Override public String brpoplpush(String source, String destination, int timeout) { return (String) executeCommand(CommandEnum.BRPOPLPUSH, source, destination, timeout); } private String brpoplpush0(Jedis j, String source, String destination, int timeout) { return j.brpoplpush(source, destination, timeout); } @Override public String lindex(String key, long index) { return (String) executeCommand(CommandEnum.LINDEX, key, index); } private String lindex0(Jedis j, String key, long index) { return j.lindex(key, index); } @Override public Long linsertbefore(String key, String pivot, String value) { return (Long) executeCommand(CommandEnum.LINSERT_BEFORE, key, pivot, value); } private Long linsertbefore0(Jedis j, String key, String pivot, String value) { return j.linsert(key, LIST_POSITION.BEFORE, pivot, value); } @Override public Long linsertafter(String key, String pivot, String value) { return (Long) executeCommand(CommandEnum.LINSERT_AFTER, key, pivot, value); } private Long linsertafter0(Jedis j, String key, String pivot, String value) { return j.linsert(key, LIST_POSITION.AFTER, pivot, value); } @Override public Long llen(String key) { return (Long) executeCommand(CommandEnum.LLEN, key); } private Long llen0(Jedis j, String key) { return j.llen(key); } @Override public String lpop(String key) { return (String) executeCommand(CommandEnum.LPOP, key); } private String lpop0(Jedis j, String key) { return j.lpop(key); } @Override public Long lpush(String key, String... values) { return (Long) executeCommand(CommandEnum.LPUSH, key, values); } private Long lpush0(Jedis j, String key, String... values) { return j.lpush(key, values); } @Override public Long lpushx(String key, String value) { return (Long) executeCommand(CommandEnum.LPUSHX, key, value); } private Long lpushx0(Jedis j, String key, String value) { return j.lpushx(key, value); } @Override public List<String> lrange(String key, long start, long stop) { return (List<String>) executeCommand(CommandEnum.LRANGE, key, start, stop); } private List<String> lrange0(Jedis j, String key, long start, long stop) { return j.lrange(key, start, stop); } @Override public Long lrem(String key, long count, String value) { return (Long) executeCommand(CommandEnum.LREM, key, count, value); } private Long lrem0(Jedis j, String key, long count, String value) { return j.lrem(key, count, value); } @Override public String lset(String key, long index, String value) { return (String) executeCommand(CommandEnum.LSET, key, index, value); } private String lset0(Jedis j, String key, long index, String value) { return j.lset(key, index, value); } @Override public String ltrim(String key, long start, long stop) { return (String) executeCommand(CommandEnum.LTRIM, key, start, stop); } private String ltrim0(Jedis j, String key, long start, long stop) { return j.ltrim(key, start, stop); } @Override public String rpop(String key) { return (String) executeCommand(CommandEnum.RPOP, key); } private String rpop0(Jedis j, String key) { return j.rpop(key); } @Override public String rpoplpush(String source, String destination) { return (String) executeCommand(CommandEnum.RPOPLPUSH, source, destination); } private String rpoplpush0(Jedis j, String source, String destination) { return j.rpoplpush(source, destination); } @Override public Long rpush(String key, String... values) { return (Long) executeCommand(CommandEnum.RPUSH, key, values); } private Long rpush0(Jedis j, String key, String... values) { return j.rpush(key, values); } @Override public Long rpushx(String key, String value) { return (Long) executeCommand(CommandEnum.RPUSHX, key, value); } private Long rpushx0(Jedis j, String key, String value) { return j.rpushx(key, value); } // ~ ------------------------------------------------------------------------------------------------------- Sets @Override public Long sadd(String key, String... members) { return (Long) executeCommand(CommandEnum.SADD, new Object[] { key, members }); } private Long sadd0(Jedis j, String key, String... members) { return j.sadd(key, members); } @Override public Long scard(String key) { return (Long) executeCommand(CommandEnum.SCARD, key); } private Long scard0(Jedis j, String key) { return j.scard(key); } @Override public Set<String> sdiff(String... keys) { return (Set<String>) executeCommand(CommandEnum.SDIFF, new Object[] { keys }); } private Set<String> sdiff0(Jedis j, String... keys) { return j.sdiff(keys); } @Override public Long sdiffstore(String destination, String... keys) { return (Long) executeCommand(CommandEnum.SDIFFSTORE, destination, keys); } private Long sdiffstore0(Jedis j, String destination, String... keys) { return j.sdiffstore(destination, keys); } @Override public Set<String> sinter(String... keys) { return (Set<String>) executeCommand(CommandEnum.SINTER, new Object[] { keys }); } private Set<String> sinter0(Jedis j, String... keys) { return j.sinter(keys); } @Override public Long sinterstore(String destination, String... keys) { return (Long) executeCommand(CommandEnum.SINTERSTORE, destination, keys); } private Long sinterstore0(Jedis j, String destination, String... keys) { return j.sinterstore(destination, keys); } @Override public Boolean sismember(String key, String member) { return (Boolean) executeCommand(CommandEnum.SISMEMBER, key, member); } private Boolean sismember0(Jedis j, String key, String member) { return j.sismember(key, member); } @Override public Set<String> smembers(String key) { return (Set<String>) executeCommand(CommandEnum.SMEMBERS, key); } private Set<String> smembers0(Jedis j, String key) { return j.smembers(key); } @Override public Long smove(String source, String destination, String member) { return (Long) executeCommand(CommandEnum.SMOVE, source, destination, member); } private Long smove0(Jedis j, String source, String destination, String member) { return j.smove(source, destination, member); } @Override public String spop(String key) { return (String) executeCommand(CommandEnum.SPOP, key); } private String spop0(Jedis j, String key) { return j.spop(key); } @Override public String srandmember(String key) { List<String> list = srandmember(key, 1); if (list.isEmpty()) { return null; } else { return list.iterator().next(); } } @Override public List<String> srandmember(String key, int count) { return (List<String>) executeCommand(CommandEnum.SRANDMEMBER, key, count); } private List<String> srandmember0(Jedis j, String key, int count) { return j.srandmember(key, count); } @Override public Long srem(String key, String... members) { return (Long) executeCommand(CommandEnum.SREM, key, members); } private Long srem0(Jedis j, String key, String... members) { return j.srem(key, members); } @Override public Set<String> sunion(String... keys) { return (Set<String>) executeCommand(CommandEnum.SUNION, new Object[] { keys }); } private Set<String> sunion0(Jedis j, String... keys) { return j.sunion(keys); } @Override public Long sunionstore(String destination, String... keys) { return (Long) executeCommand(CommandEnum.SUNIONSTORE, destination, keys); } private Long sunionstore0(Jedis j, String destination, String... keys) { return j.sunionstore(destination, keys); } @Override public ScanResult<String> sscan(String key, String cursor) { return (ScanResult<String>) executeCommand(CommandEnum.SSCAN, new Object[] { key, cursor }); } private ScanResult<String> sscan0(Jedis j, String key, String cursor) { redis.clients.jedis.ScanResult<String> sr = j.sscan(key, cursor); return new ScanResult<String>(sr.getStringCursor(), sr.getResult()); } @Override public ScanResult<String> sscan(String key, String cursor, int count) { return (ScanResult<String>) executeCommand(CommandEnum.SSCAN_COUNT, new Object[] { key, cursor, count }); } private ScanResult<String> sscan_count(Jedis j, String key, String cursor, int count) { ScanParams param = new ScanParams(); param.count(count); redis.clients.jedis.ScanResult<String> sr = j.sscan(key, cursor, param); return new ScanResult<String>(sr.getStringCursor(), sr.getResult()); } @Override public ScanResult<String> sscan(String key, String cursor, String pattern) { return (ScanResult<String>) executeCommand(CommandEnum.SSCAN_MATCH, new Object[] { key, cursor, pattern }); } private ScanResult<String> sscan_match(Jedis j, String key, String cursor, String pattern) { ScanParams param = new ScanParams(); param.match(pattern); redis.clients.jedis.ScanResult<String> sr = j.sscan(key, cursor, param); return new ScanResult<String>(sr.getStringCursor(), sr.getResult()); } @Override public ScanResult<String> sscan(String key, String cursor, String pattern, int count) { return (ScanResult<String>) executeCommand(CommandEnum.SSCAN_MATCH_COUNT, new Object[] { key, cursor, pattern, count }); } private ScanResult<String> sscan_match_count(Jedis j, String key, String cursor, String pattern, int count) { ScanParams param = new ScanParams(); param.match(pattern); param.count(count); redis.clients.jedis.ScanResult<String> sr = j.sscan(key, cursor, param); return new ScanResult<String>(sr.getStringCursor(), sr.getResult()); } // ~ ------------------------------------------------------------------------------------------------- Sorted Sets @Override public Long zadd(String key, double score, String member) { Map<String, Double> scoremembers = new HashMap<String, Double>(); scoremembers.put(member, score); return zadd(key, scoremembers); } @Override public Long zadd(String key, Map<String, Double> scoremembers) { return (Long) executeCommand(CommandEnum.ZADD, key, scoremembers); } private Long zadd0(Jedis j, String key, Map<String, Double> scoremembers) { return j.zadd(key, scoremembers); } @Override public Long zcard(String key) { return (Long) executeCommand(CommandEnum.ZCARD, key); } private Long zcard0(Jedis j, String key) { return j.zcard(key); } @Override public Long zcount(String key, double min, double max) { return (Long) executeCommand(CommandEnum.ZCOUNT, key, min, max); } private Long zcount0(Jedis j, String key, double min, double max) { return j.zcount(key, min, max); } @Override public Long zcount(String key, String min, String max) { return (Long) executeCommand(CommandEnum.ZCOUNT_STRING, key, min, max); } private Long zcount0(Jedis j, String key, String min, String max) { return j.zcount(key, min, max); } @Override public Double zincrby(String key, double score, String member) { return (Double) executeCommand(CommandEnum.ZINCRBY, key, score, member); } private Double zincrby0(Jedis j, String key, double score, String member) { return j.zincrby(key, score, member); } @Override public Long zinterstore(String destination, String... keys) { return (Long) executeCommand(CommandEnum.ZINTERSTORE, destination, keys); } private Long zinterstore0(Jedis j, String destination, String... keys) { return j.zinterstore(destination, keys); } @Override public Long zinterstoremax(String destination, String... keys) { return (Long) executeCommand(CommandEnum.ZINTERSTORE_MAX, destination, keys); } private Long zinterstoremax0(Jedis j, String destination, String... keys) { return j.zinterstore(destination, new ZParams().aggregate(Aggregate.MAX), keys); } @Override public Long zinterstoremin(String destination, String... keys) { return (Long) executeCommand(CommandEnum.ZINTERSTORE_MIN, destination, keys); } private Long zinterstoremin0(Jedis j, String destination, String... keys) { return j.zinterstore(destination, new ZParams().aggregate(Aggregate.MIN), keys); } @Override public Long zinterstore(String destination, Map<String, Integer> weightkeys) { return (Long) executeCommand(CommandEnum.ZINTERSTORE_WEIGHTS, destination, weightkeys); } @SuppressWarnings("deprecation") private Long zinterstore_weights(Jedis j, String destination, Map<String, Integer> weightkeys) { Object[] objs = convert4zstore(weightkeys); String[] keys = (String[]) objs[0]; int [] weights = (int[]) objs[1]; return j.zinterstore(destination, new ZParams().weights(weights), keys); } private Object[] convert4zstore(Map<String, Integer> weightkeys) { int size = weightkeys.size(); String[] keys = new String[size]; int[] weights = new int[size]; List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(weightkeys.entrySet()); for (int i = 0; i < size; i++) { Entry<String, Integer> entry = list.get(i); keys[i] = entry.getKey(); weights[i] = entry.getValue(); } return new Object[] { keys, weights }; } @Override public Long zinterstoremax(String destination, Map<String, Integer> weightkeys) { return (Long) executeCommand(CommandEnum.ZINTERSTORE_WEIGHTS_MAX, destination, weightkeys); } @SuppressWarnings("deprecation") private Long zinterstore_weights_max(Jedis j, String destination, Map<String, Integer> weightkeys) { Object[] objs = convert4zstore(weightkeys); String[] keys = (String[]) objs[0]; int [] weights = (int[]) objs[1]; return j.zinterstore(destination, new ZParams().weights(weights).aggregate(Aggregate.MAX), keys); } @Override public Long zinterstoremin(String destination, Map<String, Integer> weightkeys) { return (Long) executeCommand(CommandEnum.ZINTERSTORE_WEIGHTS_MIN, destination, weightkeys); } @SuppressWarnings("deprecation") private Long zinterstore_weights_min(Jedis j, String destination, Map<String, Integer> weightkeys) { Object[] objs = convert4zstore(weightkeys); String[] keys = (String[]) objs[0]; int [] weights = (int[]) objs[1]; return j.zinterstore(destination, new ZParams().weights(weights).aggregate(Aggregate.MIN), keys); } @Override public Long zlexcount(String key, String min, String max) { return (Long) executeCommand(CommandEnum.ZLEXCOUNT, key, min, max); } private Long zlexcount(Jedis j, String key, String min, String max) { return j.zlexcount(key, min, max); } @Override public Set<String> zrange(String key, long start, long stop) { return (Set<String>) executeCommand(CommandEnum.ZRANGE, key, start, stop); } private Set<String> zrange0(Jedis j, String key, long start, long stop) { return j.zrange(key, start, stop); } @Override public Map<String, Double> zrangewithscores(String key, long start, long stop) { return (Map<String, Double>) executeCommand(CommandEnum.ZRANGE_WITHSCORES, key, start, stop); } private Map<String, Double> zrangewithscores0(Jedis j, String key, long start, long stop) { Set<Tuple> set = j.zrangeWithScores(key, start, stop); Map<String, Double> map = convert4zrangewithscores(set); return map; } private Map<String, Double> convert4zrangewithscores(Set<Tuple> set) { Map<String, Double> map = new LinkedHashMap<String, Double>(set.size()); for (Tuple tuple : set) { map.put(tuple.getElement(), tuple.getScore()); } return map; } @Override public Set<String> zrangebyscore(String key, double min, double max) { return (Set<String>) executeCommand(CommandEnum.ZRANGEBYSCORE, key, min, max); } private Set<String> zrangebyscore0(Jedis j, String key, double min, double max) { return j.zrangeByScore(key, min, max); } @Override public Set<String> zrangebyscore(String key, String min, String max) { return (Set<String>) executeCommand(CommandEnum.ZRANGEBYSCORE_STRING, key, min, max); } private Set<String> zrangebyscore_string(Jedis j, String key, String min, String max) { return j.zrangeByScore(key, min, max); } @Override public Set<String> zrangebyscore(String key, double min, double max, int offset, int count) { return (Set<String>) executeCommand(CommandEnum.ZRANGEBYSCORE_OFFSET_COUNT, key, min, max, offset, count); } private Set<String> zrangebyscore_offset_count(Jedis j, String key, double min, double max, int offset, int count) { return j.zrangeByScore(key, min, max, offset, count); } @Override public Set<String> zrangebyscore(String key, String min, String max, int offset, int count) { return (Set<String>) executeCommand(CommandEnum.ZRANGEBYSCORE_OFFSET_COUNT_STRING, key, min, max, offset, count); } private Set<String> zrangebyscore_offset_count_string(Jedis j, String key, String min, String max, int offset, int count) { return j.zrangeByScore(key, min, max, offset, count); } @Override public Map<String, Double> zrangebyscorewithscores(String key, double min, double max) { return (Map<String, Double>) executeCommand(CommandEnum.ZRANGEBYSCORE_WITHSCORES, key, min, max); } private Map<String, Double> zrangebyscorewithscores0(Jedis j, String key, double min, double max) { Set<Tuple> set = j.zrangeByScoreWithScores(key, min, max); Map<String, Double> map = convert4zrangewithscores(set); return map; } @Override public Map<String, Double> zrangebyscorewithscores(String key, String min, String max) { return (Map<String, Double>) executeCommand(CommandEnum.ZRANGEBYSCORE_WITHSCORES_STRING, key, min, max); } private Map<String, Double> zrangebyscorewithscores_string(Jedis j, String key, String min, String max) { Set<Tuple> set = j.zrangeByScoreWithScores(key, min, max); Map<String, Double> map = convert4zrangewithscores(set); return map; } @Override public Map<String, Double> zrangebyscorewithscores(String key, double min, double max, int offset, int count) { return (Map<String, Double>) executeCommand(CommandEnum.ZRANGEBYSCORE_WITHSCORES_OFFSET_COUNT, key, min, max, offset, count); } private Map<String, Double> zrangebyscorewithscores_offset_count(Jedis j, String key, double min, double max, int offset, int count) { Set<Tuple> set = j.zrangeByScoreWithScores(key, min, max, offset, count); Map<String, Double> map = convert4zrangewithscores(set); return map; } @Override public Map<String, Double> zrangebyscorewithscores(String key, String min, String max, int offset, int count) { return (Map<String, Double>) executeCommand(CommandEnum.ZRANGEBYSCORE_WITHSCORES_OFFSET_COUNT_STRING, key, min, max, offset, count); } private Map<String, Double> zrangebyscorewithscores_offset_count_string(Jedis j, String key, String min, String max, int offset, int count) { Set<Tuple> set = j.zrangeByScoreWithScores(key, min, max, offset, count); Map<String, Double> map = convert4zrangewithscores(set); return map; } @Override public Set<String> zrangebylex(String key, String min, String max) { return (Set<String>) executeCommand(CommandEnum.ZRANGEBYLEX, key, min, max); } private Set<String> zrangebylex(Jedis j, String key, String min, String max) { return j.zrangeByLex(key, min, max); } @Override public Set<String> zrangebylex(String key, String min, String max, int offset, int count) { return (Set<String>) executeCommand(CommandEnum.ZRANGEBYLEX_OFFSET_COUNT, key, min, max, offset, count); } private Set<String> zrangebylex(Jedis j, String key, String min, String max, int offset, int count) { return j.zrangeByLex(key, min, max, offset, count); } @Override public Long zrank(String key, String member) { return (Long) executeCommand(CommandEnum.ZRANK, key, member); } private Long zrank0(Jedis j, String key, String member) { return j.zrank(key, member); } @Override public Long zrem(String key, String... members) { return (Long) executeCommand(CommandEnum.ZREM, key, members); } private Long zrem0(Jedis j, String key, String... members) { return j.zrem(key, members); } @Override public Long zremrangebylex(String key, String min, String max) { return (Long) executeCommand(CommandEnum.ZREMRANGEBYLEX, key, min, max); } private Long zremrangebylex(Jedis j, String key, String min, String max) { return j.zremrangeByLex(key, min, max); } @Override public Long zremrangebyrank(String key, long start, long stop) { return (Long) executeCommand(CommandEnum.ZREMRANGEBYRANK, key, start, stop); } private Long zremrangebyrank0(Jedis j, String key, long start, long stop) { return j.zremrangeByRank(key, start, stop); } @Override public Long zremrangebyscore(String key, double min, double max) { return (Long) executeCommand(CommandEnum.ZREMRANGEBYSCORE, key, min, max); } private Long zremrangebyscore0(Jedis j, String key, double min, double max) { return j.zremrangeByScore(key, min, max); } @Override public Long zremrangebyscore(String key, String min, String max) { return (Long) executeCommand(CommandEnum.ZREMRANGEBYSCORE_STRING, key, min, max); } private Long zremrangebyscore_string(Jedis j, String key, String min, String max) { return j.zremrangeByScore(key, min, max); } @Override public Set<String> zrevrange(String key, long start, long stop) { return (Set<String>) executeCommand(CommandEnum.ZREVRANGE, key, start, stop); } private Set<String> zrevrange0(Jedis j, String key, long start, long stop) { return j.zrevrange(key, start, stop); } @Override public Map<String, Double> zrevrangewithscores(String key, long start, long stop) { return (Map<String, Double>) executeCommand(CommandEnum.ZREVRANGE_WITHSCORES, key, start, stop); } private Map<String, Double> zrevrangewithscores0(Jedis j, String key, long start, long stop) { Set<Tuple> set = j.zrevrangeWithScores(key, start, stop); Map<String, Double> map = convert4zrangewithscores(set); return map; } @Override public Set<String> zrevrangebyscore(String key, double max, double min) { return (Set<String>) executeCommand(CommandEnum.ZREVRANGEBYSCORE, key, max, min); } private Set<String> zrevrangebyscore0(Jedis j, String key, double max, double min) { return j.zrevrangeByScore(key, max, min); } @Override public Set<String> zrevrangebyscore(String key, String max, String min) { return (Set<String>) executeCommand(CommandEnum.ZREVRANGEBYSCORE_STRING, key, max, min); } private Set<String> zrevrangebyscore_string(Jedis j, String key, String max, String min) { return j.zrevrangeByScore(key, max, min); } @Override public Set<String> zrevrangebyscore(String key, double max, double min, int offset, int count) { return (Set<String>) executeCommand(CommandEnum.ZREVRANGEBYSCORE_OFFSET_COUNT, key, max, min, offset, count); } private Set<String> zrevrangebyscore_offset_count(Jedis j, String key, double max, double min, int offset, int count) { return j.zrevrangeByScore(key, max, min, offset, count); } @Override public Set<String> zrevrangebyscore(String key, String max, String min, int offset, int count) { return (Set<String>) executeCommand(CommandEnum.ZREVRANGEBYSCORE_OFFSET_COUNT_STRING, key, max, min, offset, count); } private Set<String> zrevrangebyscore_offset_count_string(Jedis j, String key, String max, String min, int offset, int count) { return j.zrevrangeByScore(key, max, min, offset, count); } @Override public Map<String, Double> zrevrangebyscorewithscores(String key, double max, double min) { return (Map<String, Double>) executeCommand(CommandEnum.ZREVRANGEBYSCORE_WITHSCORES, key, max, min); } private Map<String, Double> zrevrangebyscorewithscores0(Jedis j, String key, double max, double min) { Set<Tuple> set = j.zrevrangeByScoreWithScores(key, max, min); Map<String, Double> map = convert4zrangewithscores(set); return map; } @Override public Map<String, Double> zrevrangebyscorewithscores(String key, String max, String min) { return (Map<String, Double>) executeCommand(CommandEnum.ZREVRANGEBYSCORE_WITHSCORES_STRING, key, max, min); } private Map<String, Double> zrevrangebyscorewithscores_string(Jedis j, String key, String max, String min) { Set<Tuple> set = j.zrevrangeByScoreWithScores(key, max, min); Map<String, Double> map = convert4zrangewithscores(set); return map; } @Override public Map<String, Double> zrevrangebyscorewithscores(String key, double max, double min, int offset, int count) { return (Map<String, Double>) executeCommand(CommandEnum.ZREVRANGEBYSCORE_WITHSCORES_OFFSET_COUNT, key, max, min, offset, count); } private Map<String, Double> zrevrangebyscorewithscores_offset_count(Jedis j, String key, double max, double min, int offset, int count) { Set<Tuple> set = j.zrevrangeByScoreWithScores(key, max, min, offset, count); Map<String, Double> map = convert4zrangewithscores(set); return map; } @Override public Map<String, Double> zrevrangebyscorewithscores(String key, String max, String min, int offset, int count) { return (Map<String, Double>) executeCommand(CommandEnum.ZREVRANGEBYSCORE_WITHSCORES_OFFSET_COUNT_STRING, key, max, min, offset, count); } private Map<String, Double> zrevrangebyscorewithscores_offset_count_string(Jedis j, String key, String max, String min, int offset, int count) { Set<Tuple> set = j.zrevrangeByScoreWithScores(key, max, min, offset, count); Map<String, Double> map = convert4zrangewithscores(set); return map; } @Override public Long zrevrank(String key, String member) { return (Long) executeCommand(CommandEnum.ZREVRANK, key, member); } private Long zrevrank0(Jedis j, String key, String member) { return j.zrevrank(key, member); } @Override public Double zscore(String key, String member) { return (Double) executeCommand(CommandEnum.ZSCORE, key, member); } private Double zscore0(Jedis j, String key, String member) { return j.zscore(key, member); } @Override public Long zunionstore(String destination, String... keys) { return (Long) executeCommand(CommandEnum.ZUNIONSTORE, destination, keys); } private Long zunionstore0(Jedis j, String destination, String... keys) { return j.zunionstore(destination, keys); } @Override public Long zunionstoremax(String destination, String... keys) { return (Long) executeCommand(CommandEnum.ZUNIONSTORE_MAX, destination, keys); } private Long zunionstoremax0(Jedis j, String destination, String... keys) { return j.zunionstore(destination, new ZParams().aggregate(Aggregate.MAX), keys); } @Override public Long zunionstoremin(String destination, String... keys) { return (Long) executeCommand(CommandEnum.ZUNIONSTORE_MIN, destination, keys); } private Long zunionstoremin0(Jedis j, String destination, String... keys) { return j.zunionstore(destination, new ZParams().aggregate(Aggregate.MIN), keys); } @Override public Long zunionstore(String destination, Map<String, Integer> weightkeys) { return (Long) executeCommand(CommandEnum.ZUNIONSTORE_WEIGHTS, destination, weightkeys); } @SuppressWarnings("deprecation") private Long zunionstore_weights(Jedis j, String destination, Map<String, Integer> weightkeys) { Object[] objs = convert4zstore(weightkeys); String[] keys = (String[]) objs[0]; int [] weights = (int[]) objs[1]; return j.zunionstore(destination, new ZParams().weights(weights), keys); } @Override public Long zunionstoremax(String destination, Map<String, Integer> weightkeys) { return (Long) executeCommand(CommandEnum.ZUNIONSTORE_WEIGHTS_MAX, destination, weightkeys); } @SuppressWarnings("deprecation") private Long zunionstore_weights_max(Jedis j, String destination, Map<String, Integer> weightkeys) { Object[] objs = convert4zstore(weightkeys); String[] keys = (String[]) objs[0]; int [] weights = (int[]) objs[1]; return j.zunionstore(destination, new ZParams().weights(weights).aggregate(Aggregate.MAX), keys); } @Override public Long zunionstoremin(String destination, Map<String, Integer> weightkeys) { return (Long) executeCommand(CommandEnum.ZUNIONSTORE_WEIGHTS_MIN, destination, weightkeys); } @SuppressWarnings("deprecation") private Long zunionstore_weights_min(Jedis j, String destination, Map<String, Integer> weightkeys) { Object[] objs = convert4zstore(weightkeys); String[] keys = (String[]) objs[0]; int [] weights = (int[]) objs[1]; return j.zunionstore(destination, new ZParams().weights(weights).aggregate(Aggregate.MIN), keys); } @Override public ScanResult<Map.Entry<String, Double>> zscan(String key, String cursor) { return (ScanResult<Map.Entry<String, Double>>) executeCommand(CommandEnum.ZSCAN, new Object[] { key, cursor }); } private ScanResult<Map.Entry<String, Double>> zscan0(Jedis j, String key, String cursor) { redis.clients.jedis.ScanResult<Tuple> sr = j.zscan(key, cursor); return new ScanResult<Map.Entry<String, Double>>(sr.getStringCursor(), convert(sr.getResult())); } @Override public ScanResult<Map.Entry<String, Double>> zscan(String key, String cursor, int count) { return (ScanResult<Map.Entry<String, Double>>) executeCommand(CommandEnum.ZSCAN_COUNT, new Object[] { key, cursor, count }); } private ScanResult<Map.Entry<String, Double>> zscan_count(Jedis j, String key, String cursor, int count) { ScanParams param = new ScanParams(); param.count(count); redis.clients.jedis.ScanResult<Tuple> sr = j.zscan(key, cursor, param); return new ScanResult<Map.Entry<String, Double>>(sr.getStringCursor(), convert(sr.getResult())); } @Override public ScanResult<Map.Entry<String, Double>> zscan(String key, String cursor, String pattern) { return (ScanResult<Map.Entry<String, Double>>) executeCommand(CommandEnum.ZSCAN_MATCH, new Object[] { key, cursor, pattern }); } private ScanResult<Map.Entry<String, Double>> zscan_match(Jedis j, String key, String cursor, String pattern) { ScanParams param = new ScanParams(); param.match(pattern); redis.clients.jedis.ScanResult<Tuple> sr = j.zscan(key, cursor, param); return new ScanResult<Map.Entry<String, Double>>(sr.getStringCursor(), convert(sr.getResult())); } @Override public ScanResult<Map.Entry<String, Double>> zscan(String key, String cursor, String pattern, int count) { return (ScanResult<Map.Entry<String, Double>>) executeCommand(CommandEnum.ZSCAN_MATCH_COUNT, new Object[] { key, cursor, pattern, count }); } private ScanResult<Map.Entry<String, Double>> zscan_match_count(Jedis j, String key, String cursor, String pattern, int count) { ScanParams param = new ScanParams(); param.match(pattern); param.count(count); redis.clients.jedis.ScanResult<Tuple> sr = j.zscan(key, cursor, param); return new ScanResult<Map.Entry<String, Double>>(sr.getStringCursor(), convert(sr.getResult())); } private List<Map.Entry<String, Double>> convert(List<Tuple> list) { if (list == null || list.isEmpty()) return Collections.emptyList(); List<Map.Entry<String, Double>> l = new ArrayList<Map.Entry<String,Double>>(list.size()); for (Tuple tuple : list) { Map.Entry<String, Double> entry = new AbstractMap.SimpleEntry<String, Double>(tuple.getElement(), tuple.getScore()); l.add(entry); } return l; } // ~ -------------------------------------------------------------------------------------------------- HyperLogLog @Override public Long pfadd(String key, String... elements) { return (Long) executeCommand(CommandEnum.PFADD, new Object[] { key, elements }); } private Long pfadd0(Jedis j, String key, String... elements) { return j.pfadd(key, elements); } @Override public Long pfcount(String... keys) { return (Long) executeCommand(CommandEnum.PFCOUNT, new Object[] { keys }); } private Long pfcount0(Jedis j, String... keys) { return j.pfcount(keys); } @Override public String pfmerge(String destkey, String... sourcekeys) { return (String) executeCommand(CommandEnum.PFMERGE, new Object[] { destkey, sourcekeys }); } private String pfmerge0(Jedis j, String destkey, String... sourcekeys) { return j.pfmerge(destkey, sourcekeys); } // ~ ----------------------------------------------------------------------------------------------------- Pub/Sub @Override public RedisPubSub psubscribe(RedisPsubscribeHandler handler, String... patterns) { return psubscribe0(handler, patterns); } private RedisPubSub psubscribe0(final RedisPsubscribeHandler handler, final String... patterns) { final int permits = patterns.length; final Semaphore s = new Semaphore(permits); s.drainPermits(); final JedisPubSub jps = new JedisPubSubAdapter() { @Override public void onPMessage(String pattern, String channel, String message) { handler.onMessage(pattern, channel, message); } @Override public void onPSubscribe(String pattern, int subscribedChannels) { s.release(); handler.onPsubscribe(pattern, subscribedChannels); } }; Thread t = new Thread(new Runnable() { @Override public void run() { Jedis j = null; try { j = jedis(); j.psubscribe(jps, patterns); } catch (Exception e) { RedisException re = handleException(e, j); handler.onException(re); } finally { s.release(permits); } } }, "redis-psubscribe-" + Thread.currentThread().getId()); t.start(); // wait all channels be subscribed try { s.acquire(permits); } catch (InterruptedException e) {} RedisPubSub rps = new DefaultRedisPubSub(jps); return rps; } @Override public Long publish(String channel, String message) { return (Long) executeCommand(CommandEnum.PUBLISH, channel, message); } private Long publish0(Jedis j, String channel, String message) { return j.publish(channel, message); } @Override public void punsubscribe(RedisPubSub pubsub, String... patterns) { executeCommand(CommandEnum.PUNSUBSCRIBE, new Object[] { pubsub, patterns }); } private String punsubscribe0(DefaultRedisPubSub pubsub, String... patterns) { pubsub.punsubscribe(patterns); return OK; } @Override public RedisPubSub subscribe(RedisSubscribeHandler handler, String... channels) { return subscribe0(handler, channels); } private RedisPubSub subscribe0(final RedisSubscribeHandler handler, final String... channels) { final int permits = channels.length; final Semaphore s = new Semaphore(permits); s.drainPermits(); final JedisPubSub jps = new JedisPubSubAdapter() { @Override public void onMessage(String channel, String message) { handler.onMessage(channel, message); } @Override public void onSubscribe(String channel, int subscribedChannels) { s.release(); handler.onSubscribe(channel, subscribedChannels); } }; Thread t = new Thread(new Runnable() { @Override public void run() { Jedis j = null; try { j = jedis(); j.subscribe(jps, channels); } catch (Exception e) { RedisException re = handleException(e, j); handler.onException(re); } finally { s.release(permits); } } }, "redis-subscribe-" + Thread.currentThread().getId()); t.start(); // wait all channels be subscribed try { s.acquire(permits); } catch (InterruptedException e) {} RedisPubSub rps = new DefaultRedisPubSub(jps); return rps; } @Override public void unsubscribe(RedisPubSub pubsub, String... channels) { executeCommand(CommandEnum.UNSUBSCRIBE, new Object[] { pubsub, channels }); } private String unsubscribe0(DefaultRedisPubSub pubsub, String... channels) { pubsub.unsubscribe(channels); return OK; } @Override public List<String> pubsubchannels(String pattern) { if (pattern == null || pattern.equals("")) pattern = "*"; return (List<String>) executeCommand(CommandEnum.PUBSUB_CHANNELS, new Object[] { pattern }); } private List<String> pubsubchannels0(Jedis j, String pattern) { return j.pubsubChannels(pattern); } @Override public Long pubsubnumpat() { return (Long) executeCommand(CommandEnum.PUBSUB_NUMPAT); } private Long pubsubnumpat0(Jedis j) { return j.pubsubNumPat(); } @Override public Map<String, String> pubsubnumsub(String... channels) { return (Map<String, String>) executeCommand(CommandEnum.PUBSUB_NUMSUB, new Object[] { channels }); } private Map<String, String> pubsubnumsub0(Jedis j, String... channels) { return j.pubsubNumSub(channels); } // ~ ------------------------------------------------------------------------------------------------ Transactions // Transaction command execution sequence. // MULTI ... -> ... EXEC // MULTI ... -> DISCARD // WATCH -> MULTI ... -> ... EXEC // WATCH -> UNWATCH -> MULTI ... -> ... EXEC // WATCH -> MULTI ... -> UNWATCH -> ... EXEC // WATCH ... -> ... MULTI ... -> ... EXEC @Override public String discard(RedisTransaction t) { return (String) executeCommand(CommandEnum.DISCARD, new Object[] { t }); } private String discard0(DefaultRedisTransaction t) { try { return t.discard(); } finally { unbind(); } } @Override public List<Object> exec(RedisTransaction t) { return (List<Object>) executeCommand(CommandEnum.EXEC, new Object[] { t }); } private List<Object> exec0(DefaultRedisTransaction t) { try { return t.exec(); } finally { unbind(); } } @Override public RedisTransaction multi() { return (RedisTransaction) executeCommand(CommandEnum.MULTI, new Object[] {}); } private RedisTransaction multi0(Jedis j) { Transaction t = j.multi(); bind(j); return new DefaultRedisTransaction(j, t, this); } @Override public String unwatch() { return (String) executeCommand(CommandEnum.UNWATCH, new Object[] {}); } private String unwatch0(Jedis j) { try { return j.unwatch(); } finally { unbind(); } } @Override public String watch(String... keys) { return (String) executeCommand(CommandEnum.WATCH, new Object[] { keys }); } private String watch0(Jedis j, String... keys) { String r = j.watch(keys); bind(j); return r; } private void bind(Jedis j) { THREAD_LOCAL_JEDIS.set(j); } private void unbind() { THREAD_LOCAL_JEDIS.remove(); } private boolean isBound() { return THREAD_LOCAL_JEDIS.get() != null; } // ~ --------------------------------------------------------------------------------------------------- Scripting @Override public Object eval(String script) { List<String> el = Collections.emptyList(); return eval(script, el, el); } @Override public Object eval(String script, List<String> keys) { return eval(script, keys, new ArrayList<String>(0)); } @Override public Object eval(String script, List<String> keys, List<String> args) { return executeCommand(CommandEnum.EVAL, script, keys, args); } private Object eval0(Jedis j, String script, List<String> keys, List<String> args) { return j.eval(script, keys, args); } @Override public Object evalsha(String sha1) { List<String> el = Collections.emptyList(); return evalsha(sha1, el, el); } @Override public Object evalsha(String sha1, List<String> keys) { return evalsha(sha1, keys, new ArrayList<String>(0)); } @Override public Object evalsha(String sha1, List<String> keys, List<String> args) { return executeCommand(CommandEnum.EVALSHA, sha1, keys, args); } private Object evalsha0(Jedis j, String script, List<String> keys, List<String> args) { return j.evalsha(script, keys, args); } @Override public Boolean scriptexists(String sha1) { return scriptexists(new String[] { sha1 })[0]; } @Override public Boolean[] scriptexists(String... sha1) { return (Boolean[]) executeCommand(CommandEnum.SCRIPT_EXISTS, new Object[] { sha1 }); } private Boolean[] scriptexists0(Jedis j, String... sha1) { return j.scriptExists(sha1).toArray(new Boolean[sha1.length]); } @Override public String scriptflush() { return (String) executeCommand(CommandEnum.SCRIPT_FLUSH); } private String scriptflush0(Jedis j) { return j.scriptFlush(); } @Override public String scriptkill() { return (String) executeCommand(CommandEnum.SCRIPT_KILL); } private String scriptkill0(Jedis j) { return j.scriptKill(); } @Override public String scriptload(String script) { return (String) executeCommand(CommandEnum.SCRIPT_LOAD, script); } private String scriptload0(Jedis j, String script) { return j.scriptLoad(script); } // ~ ------------------------------------------------------------------------------------------------- Connection @Override public String auth(String password) { return auth0(password); } private String auth0(String password) { pool.destroy(); unbind(); this.password = password; pool = new JedisPool(convert(poolConfig), host, port, timeoutInMillis, password, database); return OK; } @Override public String echo(String message) { return (String) executeCommand(CommandEnum.ECHO, message); } private String echo0(Jedis j, String message) { return j.echo(message); } @Override public String ping() { return (String) executeCommand(CommandEnum.PING); } private String ping0(Jedis j) { return j.ping(); } @Override public String quit() { return quit0(); } private String quit0() { pool.destroy(); return OK; } @Override public String select(int index) { return select0(index); } private String select0(int index) { if (database == index) { return OK; } this.database = index; pool = new JedisPool(convert(poolConfig), host, port, timeoutInMillis, password, database); return OK; } // ~ ------------------------------------------------------------------------------------------------------ Server @Override public String bgrewriteaof() { return (String) executeCommand(CommandEnum.BGREWRITEAOF); } private String bgrewriteaof0(Jedis j) { return j.bgrewriteaof(); } @Override public String bgsave() { return (String) executeCommand(CommandEnum.BGSAVE); } private String bgsave0(Jedis j) { return j.bgsave(); } @Override public String clientgetname() { return (String) executeCommand(CommandEnum.CLIENT_GETNAME); } private String clientgetname0(Jedis j) { return j.clientGetname(); } @Override public String clientkill(String ip, int port) { return (String) executeCommand(CommandEnum.CLIENT_KILL, ip + ":" + port); } @Override public String clientkill(String client) { return (String) executeCommand(CommandEnum.CLIENT_KILL, client); } private String clientkill0(Jedis j, String client) { return j.clientKill(client); } @Override public List<String> clientlist() { return (List<String>) executeCommand(CommandEnum.CLIENT_LIST); } private List<String> clientlist0(Jedis j) { String lines = j.clientList(); String[] sarr = lines.split("\n"); return Arrays.asList(sarr); } @Override public String clientsetname(String connectionname) { return (String) executeCommand(CommandEnum.CLIENT_SETNAME, connectionname); } private String clientsetname0(Jedis j, String connectionname) { return j.clientSetname(connectionname); } @Override public Map<String, String> configget(String parameter) { return (Map<String, String>) executeCommand(CommandEnum.CONFIG_GET, parameter); } private Map<String, String> configget0(Jedis j, String parameter) { Map<String, String> map = new LinkedHashMap<String, String>(); List<String> l = j.configGet(parameter); for (int i = 0; i < l.size(); i += 2) { String name = l.get(i); String value = null; if (i + 1 < l.size()) { value = l.get(i + 1); value = ("".equals(value) ? null : value); } map.put(name, value); } return map; } @Override public String configresetstat() { return (String) executeCommand(CommandEnum.CONFIG_RESETSTAT); } private String configresetstat0(Jedis j) { return j.configResetStat(); } @Override public String configset(String parameter, String value) { return (String) executeCommand(CommandEnum.CONFIG_SET, parameter, value); } private String configset0(Jedis j, String parameter, String value) { return j.configSet(parameter, value); } @Override public Long dbsize() { return (Long) executeCommand(CommandEnum.DBSIZE); } private Long dbsize0(Jedis j) { return j.dbSize(); } @Override public String debugobject(String key) { return (String) executeCommand(CommandEnum.DEBUG_OBJECT, key); } private String debugobject0(Jedis j, String key) { return debug0(j, DebugParams.OBJECT(key)); } @Override public String debugsegfault() { return (String) executeCommand(CommandEnum.DEBUG_SEGFAULT); } private String debugsegfault0(Jedis j) { return debug0(j, DebugParams.SEGFAULT()); } private String debug0(Jedis j, DebugParams params) { return j.debug(params); } @Override public String flushall() { return (String) executeCommand(CommandEnum.FLUSH_ALL); } private String flushall0(Jedis j) { return j.flushAll(); } @Override public String flushdb() { return (String) executeCommand(CommandEnum.FLUSH_DB); } private String flushdb0(Jedis j) { return j.flushDB(); } @Override public String info() { return info(null); } @Override public String info(String section) { return (String) executeCommand(CommandEnum.INFO, section); } private String info0(Jedis j, String section) { if (section == null) { return j.info(); } else { return j.info(section); } } @Override public Long lastsave() { return (Long) executeCommand(CommandEnum.LAST_SAVE); } private Long lastsave0(Jedis j) { return j.lastsave(); } @Override public void monitor(RedisMonitorHandler handler) { executeCommand(CommandEnum.MONITOR, handler); } private String monitor0(Jedis j, final RedisMonitorHandler handler) { JedisMonitor jm = new JedisMonitor() { @Override public void onCommand(String command) { handler.onCommand(command); } }; j.monitor(jm); return OK; } @Override public String save() { return (String) executeCommand(CommandEnum.SAVE); } private String save0(Jedis j) { return j.save(); } @Override public String shutdown(boolean save) { return (String) executeCommand(CommandEnum.SHUTDOWN, save); } private String shutdown0(Jedis j, boolean save) { return j.shutdown(); } @Override public String slaveof(String host, int port) { return (String) executeCommand(CommandEnum.SLAVEOF, host, port); } private String slaveof0(Jedis j, String host, int port) { return j.slaveof(host, port); } @Override public String slaveofnoone() { return (String) executeCommand(CommandEnum.SLAVEOF_NONOE); } private String slaveofnoone(Jedis j) { return j.slaveofNoOne(); } @Override public List<Slowlog> slowlogget() { return (List<Slowlog>) executeCommand(CommandEnum.SLOWLOG_GET); } private List<Slowlog> slowlogget0(Jedis j) { List<redis.clients.util.Slowlog> logs = j.slowlogGet(); return convert4slowlog(logs); } private List<Slowlog> convert4slowlog(List<redis.clients.util.Slowlog> logs) { List<Slowlog> slist = new ArrayList<Slowlog>(logs.size()); for (redis.clients.util.Slowlog log : logs) { Slowlog sl = new Slowlog(log.getId(), log.getTimeStamp(), log.getExecutionTime(), log.getArgs()); slist.add(sl); } return slist; } @Override public List<Slowlog> slowlogget(long len) { return (List<Slowlog>) executeCommand(CommandEnum.SLOWLOG_GET_LEN, len); } private List<Slowlog> slowlogget0(Jedis j, long len) { List<redis.clients.util.Slowlog> logs = j.slowlogGet(len); return convert4slowlog(logs); } @Override public String slowlogreset() { return (String) executeCommand(CommandEnum.SLOWLOG_RESET); } private String slowlogreset0(Jedis j) { return j.slowlogReset(); } @Override public Long slowloglen() { return (Long) executeCommand(CommandEnum.SLOWLOG_LEN); } private Long slowloglen0(Jedis j) { return j.slowlogLen(); } @Override public void sync() { executeCommand(CommandEnum.SYNC); } private String sync0(Jedis j) { j.sync(); return OK; } @Override public Long time() { return (Long) executeCommand(CommandEnum.TIME); } private Long time0(Jedis j) { List<String> l = j.time(); return Long.parseLong(l.get(0)) * 1000 + Long.parseLong(l.get(1)) / 1000; } @Override public Long microtime() { return (Long) executeCommand(CommandEnum.TIME_MICRO); } private Long microtime0(Jedis j) { List<String> l = j.time(); return Long.parseLong(l.get(0)) * 1000 * 1000 + Long.parseLong(l.get(1)); } // ~ ------------------------------------------------------------------------------------------------------------- private Object executeCommand(CommandEnum cmd, Object... args) { Jedis j = null; try { j = jedis(); switch (cmd) { // Keys case DEL: return del0(j, (String[]) args[0]); case DUMP: return dump0(j, (String) args[0]); case EXISTS: return exists0(j, (String) args[0]); case EXPIRE: return expire0(j, (String) args[0], (Integer) args[1]); case EXPIREAT: return expireat0(j, (String) args[0], (Long) args[1]); case KEYS: return keys0(j, (String) args[0]); case MIGRATE: return migrate0(j, (String) args[0], (Integer) args[1], (String) args[2], (Integer) args[3], (Integer) args[4]); case MOVE: return move0(j, (String) args[0], (Integer) args[1]); case OBJECT_REFCOUNT: return objectrefcount0(j, (String) args[0]); case OBJECT_ENCODING: return objectencoding0(j, (String) args[0]); case OBJECT_IDLETIME: return objectidletime0(j, (String) args[0]); case PERSIST: return persist0(j, (String) args[0]); case PEXPIRE: return pexpire0(j, (String) args[0], (Long) args[1]); case PEXPIREAT: return pexpireat0(j, (String) args[0], (Long) args[1]); case PTTL: return pttl0(j, (String) args[0]); case RANDOMKEY: return randomkey0(j); case RENAME: return rename0(j, (String) args[0], (String) args[1]); case RENAMENX: return renamenx0(j, (String) args[0], (String) args[1]); case RESTORE: return restore0(j, (String) args[0], (Integer) args[1], (byte[]) args[2]); case SORT: return sort0(j, (String) args[0]); case SORT_DESC: return sort_desc(j, (String) args[0], (Boolean) args[1]); case SORT_ALPHA_DESC: return sort_alpha_desc(j, (String) args[0], (Boolean) args[1], (Boolean) args[2]); case SORT_OFFSET_COUNT: return sort_offset_count(j, (String) args[0], (Integer) args[1], (Integer) args[2]); case SORT_OFFSET_COUNT_ALPHA_DESC: return sort_offset_count_alpha_desc(j, (String) args[0], (Integer) args[1], (Integer) args[2], (Boolean) args[3], (Boolean) args[4]); case SORT_BY_GET: return sort_by_get(j, (String) args[0], (String) args[1], (String[]) args[2]); case SORT_BY_DESC_GET: return sort_by_desc_get(j, (String) args[0], (String) args[1], (Boolean) args[2], (String[]) args[3]); case SORT_BY_ALPHA_DESC_GET: return sort_by_alpha_desc_get(j, (String) args[0], (String) args[1], (Boolean) args[2], (Boolean) args[3], (String[]) args[4]); case SORT_BY_OFFSET_COUNT_GET: return sort_by_offset_count_get(j, (String) args[0], (String) args[1], (Integer) args[2], (Integer) args[3], (String[]) args[4]); case SORT_BY_OFFSET_COUNT_ALPHA_DESC_GET: return sort_by_offset_count_alpha_desc_get(j, (String) args[0], (String) args[1], (Integer) args[2], (Integer) args[3], (Boolean) args[4], (Boolean) args[5], (String[]) args[6]); case SORT_DESTINATION: return sort_destination(j, (String) args[0], (String) args[1]); case SORT_DESC_DESTINATION: return sort_desc_destination(j, (String) args[0], (Boolean) args[1], (String) args[2]); case SORT_ALPHA_DESC_DESTINATION: return sort_alpha_desc_destination(j, (String) args[0], (Boolean) args[1], (Boolean) args[2], (String) args[3]); case SORT_OFFSET_COUNT_DESTINATION: return sort_offset_count_destination(j, (String) args[0], (Integer) args[1], (Integer) args[2], (String) args[3]); case SORT_OFFSET_COUNT_ALPHA_DESC_DESTINATION: return sort_offset_count_alpha_desc_destination(j, (String) args[0], (Integer) args[1], (Integer) args[2], (Boolean) args[3], (Boolean) args[4], (String) args[5]); case SORT_BY_DESTINATION_GET: return sort_by_destination_get(j, (String) args[0], (String) args[1], (String) args[2], (String[]) args[3]); case SORT_BY_DESC_DESTINATION_GET: return sort_by_desc_destination_get(j, (String) args[0], (String) args[1], (Boolean) args[2], (String) args[3], (String[]) args[4]); case SORT_BY_ALPHA_DESC_DESTINATION_GET: return sort_by_alpha_desc_destination_get(j, (String) args[0], (String) args[1], (Boolean) args[2], (Boolean) args[3], (String) args[4], (String[]) args[5]); case SORT_BY_OFFSET_COUNT_DESTINATION_GET: return sort_by_offset_count_destination_get(j, (String) args[0], (String) args[1], (Integer) args[2], (Integer) args[3], (String) args[4], (String[]) args[5]); case SORT_BY_OFFSET_COUNT_ALPHA_DESC_DESTINATION_GET: return sort_by_offset_count_alpha_desc_destination_get(j, (String) args[0], (String) args[1], (Integer) args[2], (Integer) args[3], (Boolean) args[4], (Boolean) args[5], (String) args[6], (String[]) args[7]); case TTL: return ttl0(j, (String) args[0]); case TYPE: return type0(j, (String) args[0]); case SCAN: return scan0(j, (String) args[0]); case SCAN_COUNT: return scan_count(j, (String) args[0], (Integer) args[1]); case SCAN_MATCH: return scan_match(j, (String) args[0], (String) args[1]); case SCAN_MATCH_COUNT: return scan_match_count(j, (String) args[0], (String) args[1], (Integer) args[2]); // Strings case APPEND: return append0(j, (String) args[0], (String) args[1]); case BITCOUNT: return bitcount0(j, (String) args[0]); case BITCOUNT_START_END: return bitcount0(j, (String) args[0], (Long) args[1], (Long) args[2]); case BITNOT: return bitnot0(j, (String) args[0], (String) args[1]); case BITAND: return bitand0(j, (String) args[0], (String[]) args[1]); case BITOR: return bitor0(j, (String) args[0], (String[]) args[1]); case BITXOR: return bitxor0(j, (String) args[0], (String[]) args[1]); case BITPOS: return bitpos0(j, (String) args[0], (Boolean) args[1]); case BITPOS_START: return bitpos0(j, (String) args[0], (Boolean) args[1], (Long) args[2]); case BITPOS_START_END: return bitpos0(j, (String) args[0], (Boolean) args[1], (Long) args[2], (Long) args[3]); case DECR: return decr0(j, (String) args[0]); case DECRBY: return decrby0(j, (String) args[0], (Long) args[1]); case GET: return get0(j, (String) args[0]); case GETBIT: return getbit0(j, (String) args[0], (Long) args[1]); case GETRANGE: return getrange0(j, (String) args[0], (Long) args[1], (Long) args[2]); case GETSET: return getset0(j, (String) args[0], (String) args[1]); case INCR: return incr0(j, (String) args[0]); case INCRBY: return incrby0(j, (String) args[0], (Long) args[1]); case INCRBYFLOAT: return incrbyfloat0(j, (String) args[0], (Double) args[1]); case MGET: return mget0(j, (String[]) args[0]); case MSET: return mset0(j, (String[]) args[0]); case MSETNX: return msetnx0(j, (String[]) args[0]); case PSETEX: return psetex0(j, (String) args[0], (Integer) args[1], (String) args[2]); case SET: return set0(j, (String) args[0], (String) args[1]); case SETXX: return setxx0(j, (String) args[0], (String) args[1]); case SETNXEX: return setnxex0(j, (String) args[0], (String) args[1], (Integer) args[2]); case SETNXPX: return setnxpx0(j, (String) args[0], (String) args[1], (Integer) args[2]); case SETXXEX: return setxxex0(j, (String) args[0], (String) args[1], (Integer) args[2]); case SETXXPX: return setxxpx0(j, (String) args[0], (String) args[1], (Integer) args[2]); case SETBIT: return setbit0(j, (String) args[0], (Long) args[1], (Boolean) args[2]); case SETEX: return setex0(j, (String) args[0], (Integer) args[1], (String) args[2]); case SETNX: return setnx0(j, (String) args[0], (String) args[1]); case SETRANGE: return setrange0(j, (String) args[0], (Long) args[1], (String) args[2]); case STRLEN: return strlen0(j, (String) args[0]); // Hashes case HDEL: return hdel0(j, (String) args[0], (String[]) args[1]); case HEXISTS: return hexists0(j, (String) args[0], (String) args[1]); case HGET: return hget0(j, (String) args[0], (String) args[1]); case HGETALL: return hgetall0(j, (String) args[0]); case HINCRBY: return hincrby0(j, (String) args[0], (String) args[1], (Long) args[2]); case HINCRBYFLOAT: return hincrbyfloat0(j, (String) args[0], (String) args[1], (Double) args[2]); case HKEYS: return hkeys0(j, (String) args[0]); case HLEN: return hlen0(j, (String) args[0]); case HMGET: return hmget0(j, (String) args[0], (String[]) args[1]); case HMSET: return hmset0(j, (String) args[0], (Map<String, String>) args[1]); case HSET: return hset0(j, (String) args[0], (String) args[1], (String) args[2]); case HSETNX: return hsetnx0(j, (String) args[0], (String) args[1], (String) args[2]); case HVALS: return hvals0(j, (String) args[0]); case HSCAN: return hscan0(j, (String) args[0], (String) args[1]); case HSCAN_COUNT: return hscan_count(j, (String) args[0], (String) args[1], (Integer) args[2]); case HSCAN_MATCH: return hscan_match(j, (String) args[0], (String) args[1], (String) args[2]); case HSCAN_MATCH_COUNT: return hscan_match_count(j, (String) args[0], (String) args[1], (String) args[2], (Integer) args[3]); // Lists case BLPOP: return blpop0(j, (Integer) args[0], (String[]) args[1]); case BRPOP: return brpop0(j, (Integer) args[0], (String[]) args[1]); case BRPOPLPUSH: return brpoplpush0(j, (String) args[0], (String) args[1], (Integer) args[2]); case LINDEX: return lindex0(j, (String) args[0], (Long) args[1]); case LINSERT_BEFORE: return linsertbefore0(j, (String) args[0], (String) args[1], (String) args[2]); case LINSERT_AFTER: return linsertafter0(j, (String) args[0], (String) args[1], (String) args[2]); case LLEN: return llen0(j, (String) args[0]); case LPOP: return lpop0(j, (String) args[0]); case LPUSH: return lpush0(j, (String) args[0], (String[]) args[1]); case LPUSHX: return lpushx0(j, (String) args[0], (String) args[1]); case LRANGE: return lrange0(j, (String) args[0], (Long) args[1], (Long) args[2]); case LREM: return lrem0(j, (String) args[0], (Long) args[1], (String) args[2]); case LSET: return lset0(j, (String) args[0], (Long) args[1], (String) args[2]); case LTRIM: return ltrim0(j, (String) args[0], (Long) args[1], (Long) args[2]); case RPOP: return rpop0(j, (String) args[0]); case RPOPLPUSH: return rpoplpush0(j, (String) args[0], (String) args[1]); case RPUSH: return rpush0(j, (String) args[0], (String[]) args[1]); case RPUSHX: return rpushx0(j, (String) args[0], (String) args[1]); // Sets case SADD: return sadd0(j, (String) args[0], (String[]) args[1]); case SCARD: return scard0(j, (String) args[0]); case SDIFF: return sdiff0(j, (String[]) args[0]); case SDIFFSTORE: return sdiffstore0(j, (String) args[0], (String[]) args[1]); case SINTER: return sinter0(j, (String[]) args[0]); case SINTERSTORE: return sinterstore0(j, (String) args[0], (String[]) args[1]); case SISMEMBER: return sismember0(j, (String) args[0], (String) args[1]); case SMEMBERS: return smembers0(j, (String) args[0]); case SMOVE: return smove0(j, (String) args[0], (String) args[1], (String) args[2]); case SPOP: return spop0(j, (String) args[0]); case SRANDMEMBER: return srandmember0(j, (String) args[0], (Integer) args[1]); case SREM: return srem0(j, (String) args[0], (String[]) args[1]); case SUNION: return sunion0(j, (String[]) args[0]); case SUNIONSTORE: return sunionstore0(j, (String) args[0], (String[]) args[1]); case SSCAN: return sscan0(j, (String) args[0], (String) args[1]); case SSCAN_COUNT: return sscan_count(j, (String) args[0], (String) args[1], (Integer) args[2]); case SSCAN_MATCH: return sscan_match(j, (String) args[0], (String) args[1], (String) args[2]); case SSCAN_MATCH_COUNT: return sscan_match_count(j, (String) args[0], (String) args[1], (String) args[2], (Integer) args[3]); // Sorted Set case ZADD: return zadd0(j, (String) args[0], (Map<String, Double>) args[1]); case ZCARD: return zcard0(j, (String) args[0]); case ZCOUNT: return zcount0(j, (String) args[0], (Double) args[1], (Double) args[2]); case ZCOUNT_STRING: return zcount0(j, (String) args[0], (String) args[1], (String) args[2]); case ZINCRBY: return zincrby0(j, (String) args[0], (Double) args[1], (String) args[2]); case ZINTERSTORE: return zinterstore0(j, (String) args[0], (String[]) args[1]); case ZINTERSTORE_MAX: return zinterstoremax0(j, (String) args[0], (String[]) args[1]); case ZINTERSTORE_MIN: return zinterstoremin0(j, (String) args[0], (String[]) args[1]); case ZINTERSTORE_WEIGHTS: return zinterstore_weights(j, (String) args[0], (Map<String, Integer>) args[1]); case ZINTERSTORE_WEIGHTS_MAX: return zinterstore_weights_max(j, (String) args[0], (Map<String, Integer>) args[1]); case ZINTERSTORE_WEIGHTS_MIN: return zinterstore_weights_min(j, (String) args[0], (Map<String, Integer>) args[1]); case ZLEXCOUNT: return zlexcount(j, (String) args[0], (String) args[1], (String) args[2]); case ZRANGE: return zrange0(j, (String) args[0], (Long) args[1], (Long) args[2]); case ZRANGE_WITHSCORES: return zrangewithscores0(j, (String) args[0], (Long) args[1], (Long) args[2]); case ZRANGEBYSCORE: return zrangebyscore0(j, (String) args[0], (Double) args[1], (Double) args[2]); case ZRANGEBYSCORE_STRING: return zrangebyscore_string(j, (String) args[0], (String) args[1], (String) args[2]); case ZRANGEBYSCORE_OFFSET_COUNT: return zrangebyscore_offset_count(j, (String) args[0], (Double) args[1], (Double) args[2], (Integer) args[3], (Integer) args[4]); case ZRANGEBYSCORE_OFFSET_COUNT_STRING: return zrangebyscore_offset_count_string(j, (String) args[0], (String) args[1], (String) args[2], (Integer) args[3], (Integer) args[4]); case ZRANGEBYSCORE_WITHSCORES: return zrangebyscorewithscores0(j, (String) args[0], (Double) args[1], (Double) args[2]); case ZRANGEBYSCORE_WITHSCORES_STRING: return zrangebyscorewithscores_string(j, (String) args[0], (String) args[1], (String) args[2]); case ZRANGEBYSCORE_WITHSCORES_OFFSET_COUNT: return zrangebyscorewithscores_offset_count(j, (String) args[0], (Double) args[1], (Double) args[2], (Integer) args[3], (Integer) args[4]); case ZRANGEBYSCORE_WITHSCORES_OFFSET_COUNT_STRING: return zrangebyscorewithscores_offset_count_string(j, (String) args[0], (String) args[1], (String) args[2], (Integer) args[3], (Integer) args[4]); case ZRANGEBYLEX: return zrangebylex(j, (String) args[0], (String) args[1], (String) args[2]); case ZRANGEBYLEX_OFFSET_COUNT: return zrangebylex(j, (String) args[0], (String) args[1], (String) args[2], (Integer) args[3], (Integer) args[4]); case ZRANK: return zrank0(j, (String) args[0], (String) args[1]); case ZREM: return zrem0(j, (String) args[0], (String[]) args[1]); case ZREMRANGEBYLEX: return zremrangebylex(j, (String) args[0], (String) args[1], (String) args[2]); case ZREMRANGEBYRANK: return zremrangebyrank0(j, (String) args[0], (Long) args[1], (Long) args[2]); case ZREMRANGEBYSCORE: return zremrangebyscore0(j, (String) args[0], (Double) args[1], (Double) args[2]); case ZREMRANGEBYSCORE_STRING: return zremrangebyscore_string(j, (String) args[0], (String) args[1], (String) args[2]); case ZREVRANGE: return zrevrange0(j, (String) args[0], (Long) args[1], (Long) args[2]); case ZREVRANGE_WITHSCORES: return zrevrangewithscores0(j, (String) args[0], (Long) args[1], (Long) args[2]); case ZREVRANGEBYSCORE: return zrevrangebyscore0(j, (String) args[0], (Double) args[1], (Double) args[2]); case ZREVRANGEBYSCORE_STRING: return zrevrangebyscore_string(j, (String) args[0], (String) args[1], (String) args[2]); case ZREVRANGEBYSCORE_OFFSET_COUNT: return zrevrangebyscore_offset_count(j, (String) args[0], (Double) args[1], (Double) args[2], (Integer) args[3], (Integer) args[4]); case ZREVRANGEBYSCORE_OFFSET_COUNT_STRING: return zrevrangebyscore_offset_count_string(j, (String) args[0], (String) args[1], (String) args[2], (Integer) args[3], (Integer) args[4]); case ZREVRANGEBYSCORE_WITHSCORES: return zrevrangebyscorewithscores0(j, (String) args[0], (Double) args[1], (Double) args[2]); case ZREVRANGEBYSCORE_WITHSCORES_STRING: return zrevrangebyscorewithscores_string(j, (String) args[0], (String) args[1], (String) args[2]); case ZREVRANGEBYSCORE_WITHSCORES_OFFSET_COUNT: return zrevrangebyscorewithscores_offset_count(j, (String) args[0], (Double) args[1], (Double) args[2], (Integer) args[3], (Integer) args[4]); case ZREVRANGEBYSCORE_WITHSCORES_OFFSET_COUNT_STRING: return zrevrangebyscorewithscores_offset_count_string(j, (String) args[0], (String) args[1], (String) args[2], (Integer) args[3], (Integer) args[4]); case ZREVRANK: return zrevrank0(j, (String) args[0], (String) args[1]); case ZSCORE: return zscore0(j, (String) args[0], (String) args[1]); case ZUNIONSTORE: return zunionstore0(j, (String) args[0], (String[]) args[1]); case ZUNIONSTORE_MAX: return zunionstoremax0(j, (String) args[0], (String[]) args[1]); case ZUNIONSTORE_MIN: return zunionstoremin0(j, (String) args[0], (String[]) args[1]); case ZUNIONSTORE_WEIGHTS: return zunionstore_weights(j, (String) args[0], (Map<String, Integer>) args[1]); case ZUNIONSTORE_WEIGHTS_MAX: return zunionstore_weights_max(j, (String) args[0], (Map<String, Integer>) args[1]); case ZUNIONSTORE_WEIGHTS_MIN: return zunionstore_weights_min(j, (String) args[0], (Map<String, Integer>) args[1]); case ZSCAN: return zscan0(j, (String) args[0], (String) args[1]); case ZSCAN_COUNT: return zscan_count(j, (String) args[0], (String) args[1], (Integer) args[2]); case ZSCAN_MATCH: return zscan_match(j, (String) args[0], (String) args[1], (String) args[2]); case ZSCAN_MATCH_COUNT: return zscan_match_count(j, (String) args[0], (String) args[1], (String) args[2], (Integer) args[3]); // HyperLogLog case PFADD: return pfadd0(j, (String) args[0], (String[]) args[1]); case PFCOUNT: return pfcount0(j, (String[]) args[0]); case PFMERGE: return pfmerge0(j, (String) args[0], (String[]) args[1]); // Pub/Sub case PUBLISH: return publish0(j, (String) args[0], (String) args[1]); case PUNSUBSCRIBE: return punsubscribe0((DefaultRedisPubSub) args[0], (String[]) args[1]); case UNSUBSCRIBE: return unsubscribe0((DefaultRedisPubSub) args[0], (String[]) args[1]); case PUBSUB_CHANNELS: return pubsubchannels0(j, (String) args[0]); case PUBSUB_NUMSUB: return pubsubnumsub0(j, (String[]) args[0]); case PUBSUB_NUMPAT: return pubsubnumpat0(j); // Transactions case DISCARD: return discard0((DefaultRedisTransaction) args[0]); case EXEC: return exec0((DefaultRedisTransaction) args[0]); case MULTI: return multi0(j); case UNWATCH: return unwatch0(j); case WATCH: return watch0(j, (String[]) args[0]); // Scripting case EVAL: return eval0(j, (String) args[0], (List<String>) args[1], (List<String>) args[2]); case EVALSHA: return evalsha0(j, (String) args[0], (List<String>) args[1], (List<String>) args[2]); case SCRIPT_EXISTS: return scriptexists0(j, (String[]) args[0]); case SCRIPT_FLUSH: return scriptflush0(j); case SCRIPT_KILL: return scriptkill0(j); case SCRIPT_LOAD: return scriptload0(j, (String) args[0]); // Connection case ECHO: return echo0(j, (String) args[0]); case PING: return ping0(j); // Server case BGREWRITEAOF: return bgrewriteaof0(j); case BGSAVE: return bgsave0(j); case CLIENT_KILL: return clientkill0(j, (String) args[0]); case CLIENT_LIST: return clientlist0(j); case CLIENT_GETNAME: return clientgetname0(j); case CLIENT_SETNAME: return clientsetname0(j, (String) args[0]); case CONFIG_GET: return configget0(j, (String) args[0]); case CONFIG_SET: return configset0(j, (String) args[0], (String) args[1]); case CONFIG_RESETSTAT: return configresetstat0(j); case DBSIZE: return dbsize0(j); case DEBUG_OBJECT: return debugobject0(j, (String) args[0]); case DEBUG_SEGFAULT: return debugsegfault0(j); case FLUSH_ALL: return flushall0(j); case FLUSH_DB: return flushdb0(j); case INFO: return info0(j, (String) args[0]); case LAST_SAVE: return lastsave0(j); case MONITOR: return monitor0(j, (RedisMonitorHandler) args[0]); case SAVE: return save0(j); case SHUTDOWN: return shutdown0(j, (Boolean) args[0]); case SLAVEOF: return slaveof0(j, (String) args[0], (Integer) args[1]); case SLAVEOF_NONOE: return slaveofnoone(j); case SLOWLOG_LEN: return slowloglen0(j); case SLOWLOG_GET: return slowlogget0(j); case SLOWLOG_GET_LEN: return slowlogget0(j, (Long) args[0]); case SLOWLOG_RESET: return slowlogreset0(j); case SYNC: return sync0(j); case TIME: return time0(j); case TIME_MICRO: return microtime0(j); default: throw new IllegalArgumentException("Wrong command"); } } catch (Exception e) { RedisException re = handleException(e, j, args); if (re instanceof RedisConnectionException) { j = null; } throw re; } finally { release(j); } } RedisException handleException(Exception e, Jedis j, Object... args) { unbind(); if (e instanceof JedisConnectionException) { return new RedisConnectionException(String.format("Connect to redis server<host=%s, port=%s> failed.", host, port), e); } if (e instanceof JedisDataException) { return new RedisDataException(String.format("Redis data <args=%s> process failed.", Arrays.toString(args)), e); } return new RedisException(e); } private Jedis jedis() { Jedis j = THREAD_LOCAL_JEDIS.get(); if (j == null) { j = pool.getResource(); } return j; } private void release(Jedis j) { if (isBound()) { // in transaction context don't return jedis connection to pool. return; } else { if (j != null) { j.close(); } } } }