keys(String pattern) {
+ return new HashSet<>();
+ }
+
+ /**
+ * 同时设置一个或多个 key-value 对。
+ * 如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用 MSETNX 命令:它只会在所有给定 key 都不存在的情况下进行设置操作。
+ * MSET 是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。
+ *
+ * 例子:
+ * Cache cache = RedisKit.use(); // 使用 Redis 的 cache
+ * cache.mset("k1", "v1", "k2", "v2"); // 放入多个 key value 键值对
+ * List list = cache.mget("k1", "k2"); // 利用多个键值得到上面代码放入的值
+ *
+ */
+ @Override
+ public String mset(Object... keysValues) {
+ if (keysValues.length % 2 != 0) {
+ throw new IllegalArgumentException("wrong number of arguments for met, keysValues length can not be odd");
+ }
+ JedisCluster jedisCluster = getJedisCluster();
+ try {
+ byte[][] kv = new byte[keysValues.length][];
+ for (int i = 0; i < keysValues.length; i++) {
+ if (i % 2 == 0) {
+ kv[i] = keyToBytes(keysValues[i]);
+ } else {
+ kv[i] = valueToBytes(keysValues[i]);
+ }
+
+ }
+ return jedisCluster.mset(kv);
+ } finally {
+ close(jedisCluster);
+ }
+ }
+
+ /**
+ * 返回所有(一个或多个)给定 key 的值。
+ * 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。
+ */
+ @SuppressWarnings("rawtypes")
+ @Override
+ public List mget(Object... keys) {
+ JedisCluster jedisCluster = getJedisCluster();
+ try {
+ byte[][] keysBytesArray = keysToBytesArray(keys);
+ List data = jedisCluster.mget(keysBytesArray);
+ return valueListFromBytesList(data);
+ } finally {
+ close(jedisCluster);
+ }
+ }
+
+ /**
+ * 将 key 中储存的数字值减一。
+ * 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。
+ * 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
+ * 本操作的值限制在 64 位(bit)有符号数字表示之内。
+ * 关于递增(increment) / 递减(decrement)操作的更多信息,请参见 INCR 命令。
+ */
+ @Override
+ public Long decr(Object key) {
+ JedisCluster jedisCluster = getJedisCluster();
+ try {
+ return jedisCluster.decr(keyToBytes(key));
+ } finally {
+ close(jedisCluster);
+ }
+ }
+
+ /**
+ * 将 key 所储存的值减去减量 decrement 。
+ * 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECRBY 操作。
+ * 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
+ * 本操作的值限制在 64 位(bit)有符号数字表示之内。
+ * 关于更多递增(increment) / 递减(decrement)操作的更多信息,请参见 INCR 命令。
+ */
+ @Override
+ public Long decrBy(Object key, long longValue) {
+ JedisCluster jedisCluster = getJedisCluster();
+ try {
+ return jedisCluster.decrBy(keyToBytes(key), longValue);
+ } finally {
+ close(jedisCluster);
+ }
+ }
+
+ /**
+ * 将 key 中储存的数字值增一。
+ * 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
+ * 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
+ * 本操作的值限制在 64 位(bit)有符号数字表示之内。
+ */
+ @Override
+ public Long incr(Object key) {
+ JedisCluster jedisCluster = getJedisCluster();
+ try {
+ return jedisCluster.incr(keyToBytes(key));
+ } finally {
+ close(jedisCluster);
+ }
+ }
+
+ /**
+ * 将 key 所储存的值加上增量 increment 。
+ * 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。
+ * 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
+ * 本操作的值限制在 64 位(bit)有符号数字表示之内。
+ * 关于递增(increment) / 递减(decrement)操作的更多信息,参见 INCR 命令。
+ */
+ @Override
+ public Long incrBy(Object key, long longValue) {
+ JedisCluster jedisCluster = getJedisCluster();
+ try {
+ return jedisCluster.incrBy(keyToBytes(key), longValue);
+ } finally {
+ close(jedisCluster);
+ }
+ }
+
+ /**
+ * 检查给定 key 是否存在。
+ */
+ @Override
+ public boolean exists(Object key) {
+ JedisCluster jedisCluster = getJedisCluster();
+ try {
+ return jedisCluster.exists(keyToBytes(key));
+ } finally {
+ close(jedisCluster);
+ }
+ }
+
+ /**
+ * 从当前数据库中随机返回(不删除)一个 key 。
+ * cluster模式下,该命令被禁用
+ */
+ @Override
+ public String randomKey() {
+ return null;
+ }
+
+
+ /**
+ * 将 key 改名为 newkey 。
+ * 当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。
+ * 当 newkey 已经存在时, RENAME 命令将覆盖旧值。
+ */
+ @Override
+ public String rename(Object oldkey, Object newkey) {
+ JedisCluster jedisCluster = getJedisCluster();
+ try {
+ return jedisCluster.rename(keyToBytes(oldkey), keyToBytes(newkey));
+ } finally {
+ close(jedisCluster);
+ }
+ }
+
+ /**
+ * 将当前数据库的 key 移动到给定的数据库 db 当中。
+ * 如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。
+ * 因此,也可以利用这一特性,将 MOVE 当作锁(locking)原语(primitive)。
+ * cluster模式下,该命令被禁用
+ */
+ @Override
+ public Long move(Object key, int dbIndex) {
+ return null;
+ }
+
+ /**
+ * 将 key 原子性地从当前实例传送到目标实例的指定数据库上,一旦传送成功, key 保证会出现在目标实例上,而当前实例上的 key 会被删除。
+ * cluster模式下,该命令被禁用
+ */
+ @Override
+ public String migrate(String host, int port, Object key, int destinationDb, int timeout) {
+ return null;
+ }
+
+ /**
+ * 切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值。
+ * 默认使用 0 号数据库。
+ * 注意:在 Jedis 对象被关闭时,数据库又会重新被设置为初始值,所以本方法 select(...)
+ * 正常工作需要使用如下方式之一:
+ * 1:使用 RedisInterceptor,在本线程内共享同一个 Jedis 对象
+ * 2:使用 JbootRedis.call(ICallback) 进行操作
+ * 3:自行获取 Jedis 对象进行操作
+ */
+ @Override
+ public String select(int databaseIndex) {
+ return null;
+ }
+
+
+ /**
+ * 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。
+ * 在 Redis 中,带有生存时间的 key 被称为『易失的』(volatile)。
+ */
+ @Override
+ public Long expire(Object key, int seconds) {
+ JedisCluster jedisCluster = getJedisCluster();
+ try {
+ return jedisCluster.expire(keyToBytes(key), seconds);
+ } finally {
+ close(jedisCluster);
+ }
+ }
+
+ /**
+ * EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置生存时间。不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。
+ */
+ @Override
+ public Long expireAt(Object key, long unixTime) {
+ JedisCluster jedisCluster = getJedisCluster();
+ try {
+ return jedisCluster.expireAt(keyToBytes(key), unixTime);
+ } finally {
+ close(jedisCluster);
+ }
+ }
+
+ /**
+ * 这个命令和 EXPIRE 命令的作用类似,但是它以毫秒为单位设置 key 的生存时间,而不像 EXPIRE 命令那样,以秒为单位。
+ */
+ @Override
+ public Long pexpire(Object key, long milliseconds) {
+ JedisCluster jedisCluster = getJedisCluster();
+ try {
+ return jedisCluster.pexpire(keyToBytes(key), milliseconds);
+ } finally {
+ close(jedisCluster);
+ }
+ }
+
+ /**
+ * 这个命令和 EXPIREAT 命令类似,但它以毫秒为单位设置 key 的过期 unix 时间戳,而不是像 EXPIREAT 那样,以秒为单位。
+ */
+ @Override
+ public Long pexpireAt(Object key, long millisecondsTimestamp) {
+ JedisCluster jedisCluster = getJedisCluster();
+ try {
+ return jedisCluster.pexpireAt(keyToBytes(key), millisecondsTimestamp);
+ } finally {
+ close(jedisCluster);
+ }
+ }
+
+ /**
+ * 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
+ * 当 key 存在但不是字符串类型时,返回一个错误。
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public T getSet(Object key, Object value) {
+ JedisCluster jedisCluster = getJedisCluster();
+ try {
+ return (T) valueFromBytes(jedisCluster.getSet(keyToBytes(key), valueToBytes(value)));
+ } finally {
+ close(jedisCluster);
+ }
+ }
+
+ /**
+ * 移除给定 key 的生存时间,将这个 key 从『易失的』(带生存时间 key )转换成『持久的』(一个不带生存时间、永不过期的 key )。
+ */
+ @Override
+ public Long persist(Object key) {
+ JedisCluster jedisCluster = getJedisCluster();
+ try {
+ return jedisCluster.persist(keyToBytes(key));
+ } finally {
+ close(jedisCluster);
+ }
+ }
+
+ /**
+ * 返回 key 所储存的值的类型。
+ */
+ @Override
+ public String type(Object key) {
+ JedisCluster jedisCluster = getJedisCluster();
+ try {
+ return jedisCluster.type(keyToBytes(key));
+ } finally {
+ close(jedisCluster);
+ }
+ }
+
+ /**
+ * 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
+ */
+ @Override
+ public Long ttl(Object key) {
+ JedisCluster jedisCluster = getJedisCluster();
+ try {
+ return jedisCluster.ttl(keyToBytes(key));
+ } finally {
+ close(jedisCluster);
+ }
+ }
+
+ /**
+ * 这个命令类似于 TTL 命令,但它以毫秒为单位返回 key 的剩余生存时间,而不是像 TTL 命令那样,以秒为单位。
+ * cluster模式下,该命令被禁用
+ */
+ @Override
+ public Long pttl(Object key) {
+ return null;
+ }
+
+ /**
+ * 对象被引用的数量
+ * cluster模式下,该命令被禁用
+ */
+ @Override
+ public Long objectRefcount(Object key) {
+ return null;
+ }
+
+ /**
+ * 对象没有被访问的空闲时间
+ * cluster模式下,该命令被禁用
+ */
+ @Override
+ public Long objectIdletime(Object key) {
+ return null;
+ }
+
+
+ /**
+ * 将哈希表 key 中的域 field 的值设为 value 。
+ * 如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。
+ * 如果域 field 已经存在于哈希表中,旧值将被覆盖。
+ */
+ @Override
+ public Long hset(Object key, Object field, Object value) {
+ JedisCluster jedisCluster = getJedisCluster();
+ try {
+ return jedisCluster.hset(keyToBytes(key), fieldToBytes(field), valueToBytes(value));
+ } finally {
+ close(jedisCluster);
+ }
+ }
+
+ /**
+ * 同时将多个 field-value (域-值)对设置到哈希表 key 中。
+ * 此命令会覆盖哈希表中已存在的域。
+ * 如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。
+ */
+ @Override
+ public String hmset(Object key, Map