001/**
002 * Copyright (c) 2015-2022, Michael Yang 杨福海 (fuhai999@gmail.com).
003 * <p>
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 * <p>
008 * http://www.apache.org/licenses/LICENSE-2.0
009 * <p>
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package io.jboot.support.redis;
017
018import redis.clients.jedis.BinaryJedisPubSub;
019import redis.clients.jedis.JedisPubSub;
020
021import java.util.Collection;
022import java.util.List;
023import java.util.Map;
024import java.util.Set;
025
026/**
027 * 参考: com.jfinal.plugin.redis
028 * JbootRedis 命令文档: http://redisdoc.com/
029 */
030public interface JbootRedis {
031
032
033    /**
034     * 存放 key value 对到 redis
035     * 如果 key 已经持有其他值, SET 就覆写旧值,无视类型。
036     * 对于某个原本带有生存时间(TTL)的键来说, 当 SET 命令成功在这个键上执行时, 这个键原有的 TTL 将被清除。
037     */
038    String set(Object key, Object value);
039
040
041    /**
042     * 当且仅当 key 不存在能成功设置
043     *
044     * @param key
045     * @param value 设置成功,返回 1,设置失败,返回 0
046     * @return
047     */
048    Long setnx(Object key, Object value);
049
050    /**
051     * 存放 key value 对到 redis
052     * 如果 key 已经持有其他值, SET 就覆写旧值,无视类型。
053     * 此方法用了修改 incr 等的值
054     */
055    String setWithoutSerialize(Object key, Object value);
056
057
058    /**
059     * 存放 key value 对到 redis,并将 key 的生存时间设为 seconds (以秒为单位)。
060     * 如果 key 已经存在, SETEX 命令将覆写旧值。
061     */
062    String setex(Object key, int seconds, Object value);
063
064    /**
065     * 返回 key 所关联的 value 值
066     * 如果 key 不存在那么返回特殊值 nil 。
067     */
068    @SuppressWarnings("unchecked")
069    <T> T get(Object key);
070
071    /**
072     * 获取 数据不进行反序列 , 如果之前设置的是非String类型,得到String后自行转化
073     *
074     * @param key
075     * @return
076     */
077    String getWithoutSerialize(Object key);
078
079    /**
080     * 删除给定的一个 key
081     * 不存在的 key 会被忽略。
082     */
083    Long del(Object key);
084
085    /**
086     * 删除给定的多个 key
087     * 不存在的 key 会被忽略。
088     */
089    Long del(Object... keys);
090
091    /**
092     * 查找所有符合给定模式 pattern 的 key 。
093     * KEYS * 匹配数据库中所有 key 。
094     * KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
095     * KEYS h*llo 匹配 hllo 和 heeeeello 等。
096     * KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
097     * 特殊符号用 \ 隔开
098     */
099    Set<String> keys(String pattern);
100
101    /**
102     * 同时设置一个或多个 key-value 对。
103     * 如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用 MSETNX 命令:它只会在所有给定 key 都不存在的情况下进行设置操作。
104     * MSET 是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。
105     * <pre>
106     * 例子:
107     * mset("k1", "v1", "k2", "v2");            // 放入多个 key value 键值对
108     * List list = cache.mget("k1", "k2");              // 利用多个键值得到上面代码放入的值
109     * </pre>
110     */
111    String mset(Object... keysValues);
112
113    /**
114     * 返回所有(一个或多个)给定 key 的值。
115     * 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。
116     */
117    List mget(Object... keys);
118
119    /**
120     * 将 key 中储存的数字值减一。
121     * 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。
122     * 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
123     * 本操作的值限制在 64 位(bit)有符号数字表示之内。
124     * 关于递增(increment) / 递减(decrement)操作的更多信息,请参见 INCR 命令。
125     */
126    Long decr(Object key);
127
128    /**
129     * 将 key 所储存的值减去减量 decrement 。
130     * 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECRBY 操作。
131     * 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
132     * 本操作的值限制在 64 位(bit)有符号数字表示之内。
133     * 关于更多递增(increment) / 递减(decrement)操作的更多信息,请参见 INCR 命令。
134     */
135    Long decrBy(Object key, long value);
136
137    /**
138     * 将 key 中储存的数字值增一。
139     * 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
140     * 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
141     * 本操作的值限制在 64 位(bit)有符号数字表示之内。
142     */
143    Long incr(Object key);
144
145    /**
146     * 将 key 所储存的值加上增量 increment 。
147     * 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。
148     * 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
149     * 本操作的值限制在 64 位(bit)有符号数字表示之内。
150     * 关于递增(increment) / 递减(decrement)操作的更多信息,参见 INCR 命令。
151     */
152    Long incrBy(Object key, long value);
153
154    /**
155     * 检查给定 key 是否存在。
156     */
157    boolean exists(Object key);
158
159    /**
160     * 从当前数据库中随机返回(不删除)一个 key 。
161     */
162    String randomKey();
163
164    /**
165     * 将 key 改名为 newkey 。
166     * 当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。
167     * 当 newkey 已经存在时, RENAME 命令将覆盖旧值。
168     */
169    String rename(Object oldkey, Object newkey);
170
171    /**
172     * 将当前数据库的 key 移动到给定的数据库 db 当中。
173     * 如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。
174     * 因此,也可以利用这一特性,将 MOVE 当作锁(locking)原语(primitive)。
175     */
176    Long move(Object key, int dbIndex);
177
178    /**
179     * 将 key 原子性地从当前实例传送到目标实例的指定数据库上,一旦传送成功, key 保证会出现在目标实例上,而当前实例上的 key 会被删除。
180     */
181    String migrate(String host, int port, Object key, int destinationDb, int timeout);
182
183    /**
184     * 切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值。
185     * 默认使用 0 号数据库。
186     * 注意:在 Jedis 对象被关闭时,数据库又会重新被设置为初始值,所以本方法 select(...)
187     * 正常工作需要使用如下方式之一:
188     * 1:使用 RedisInterceptor,在本线程内共享同一个 Jedis 对象
189     * 2:使用 JbootRedis.call(ICallback) 进行操作
190     * 3:自行获取 Jedis 对象进行操作
191     */
192    String select(int databaseIndex);
193
194    /**
195     * 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。
196     * 在 JbootRedis 中,带有生存时间的 key 被称为『易失的』(volatile)。
197     */
198    Long expire(Object key, int seconds);
199
200    /**
201     * EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置生存时间。不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。
202     */
203    Long expireAt(Object key, long unixTime);
204
205    /**
206     * 这个命令和 EXPIRE 命令的作用类似,但是它以毫秒为单位设置 key 的生存时间,而不像 EXPIRE 命令那样,以秒为单位。
207     */
208    Long pexpire(Object key, long milliseconds);
209
210    /**
211     * 这个命令和 EXPIREAT 命令类似,但它以毫秒为单位设置 key 的过期 unix 时间戳,而不是像 EXPIREAT 那样,以秒为单位。
212     */
213    Long pexpireAt(Object key, long millisecondsTimestamp);
214
215    /**
216     * 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
217     * 当 key 存在但不是字符串类型时,返回一个错误。
218     */
219    <T> T getSet(Object key, Object value);
220
221    /**
222     * 移除给定 key 的生存时间,将这个 key 从『易失的』(带生存时间 key )转换成『持久的』(一个不带生存时间、永不过期的 key )。
223     */
224    Long persist(Object key);
225
226    /**
227     * 返回 key 所储存的值的类型。
228     */
229    String type(Object key);
230
231    /**
232     * 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
233     */
234    Long ttl(Object key);
235
236    /**
237     * 这个命令类似于 TTL 命令,但它以毫秒为单位返回 key 的剩余生存时间,而不是像 TTL 命令那样,以秒为单位。
238     */
239    Long pttl(Object key);
240
241    /**
242     * 对象被引用的数量
243     */
244    Long objectRefcount(Object key);
245
246    /**
247     * 对象没有被访问的空闲时间
248     */
249    Long objectIdletime(Object key);
250
251    /**
252     * 将哈希表 key 中的域 field 的值设为 value 。
253     * 如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。
254     * 如果域 field 已经存在于哈希表中,旧值将被覆盖。
255     */
256    Long hset(Object key, Object field, Object value);
257
258    /**
259     * 同时将多个 field-value (域-值)对设置到哈希表 key 中。
260     * 此命令会覆盖哈希表中已存在的域。
261     * 如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。
262     */
263    String hmset(Object key, Map<Object, Object> hash);
264
265    /**
266     * 返回哈希表 key 中给定域 field 的值。
267     */
268    <T> T hget(Object key, Object field);
269
270    /**
271     * 返回哈希表 key 中,一个或多个给定域的值。
272     * 如果给定的域不存在于哈希表,那么返回一个 nil 值。
273     * 因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。
274     */
275    List hmget(Object key, Object... fields);
276
277    /**
278     * 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
279     */
280    Long hdel(Object key, Object... fields);
281
282    /**
283     * 查看哈希表 key 中,给定域 field 是否存在。
284     */
285    boolean hexists(Object key, Object field);
286
287    /**
288     * 返回哈希表 key 中,所有的域和值。
289     * 在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。
290     */
291    Map hgetAll(Object key);
292
293    /**
294     * 返回哈希表 key 中所有域的值。
295     */
296    List hvals(Object key);
297
298    /**
299     * 返回哈希表 key 中的所有域。
300     * 底层实现此方法取名为 hfields 更为合适,在此仅为与底层保持一致
301     */
302    Set<Object> hkeys(Object key);
303
304    /**
305     * 返回哈希表 key 中域的数量。
306     */
307    Long hlen(Object key);
308
309    /**
310     * 为哈希表 key 中的域 field 的值加上增量 increment 。
311     * 增量也可以为负数,相当于对给定域进行减法操作。
312     * 如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
313     * 如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。
314     * 对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。
315     * 本操作的值被限制在 64 位(bit)有符号数字表示之内。
316     */
317    Long hincrBy(Object key, Object field, long value);
318
319    /**
320     * 为哈希表 key 中的域 field 加上浮点数增量 increment 。
321     * 如果哈希表中没有域 field ,那么 HINCRBYFLOAT 会先将域 field 的值设为 0 ,然后再执行加法操作。
322     * 如果键 key 不存在,那么 HINCRBYFLOAT 会先创建一个哈希表,再创建域 field ,最后再执行加法操作。
323     * 当以下任意一个条件发生时,返回一个错误:
324     * 1:域 field 的值不是字符串类型(因为 redis 中的数字和浮点数都以字符串的形式保存,所以它们都属于字符串类型)
325     * 2:域 field 当前的值或给定的增量 increment 不能解释(parse)为双精度浮点数(double precision floating point number)
326     * HINCRBYFLOAT 命令的详细功能和 INCRBYFLOAT 命令类似,请查看 INCRBYFLOAT 命令获取更多相关信息。
327     */
328    Double hincrByFloat(Object key, Object field, double value);
329
330
331    /**
332     * 返回列表 key 中,下标为 index 的元素。
333     * 下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,
334     * 以 1 表示列表的第二个元素,以此类推。
335     * 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
336     * 如果 key 不是列表类型,返回一个错误。
337     */
338    <T> T lindex(Object key, long index);
339
340
341    /**
342     * 返回列表 key 的长度。
343     * 如果 key 不存在,则 key 被解释为一个空列表,返回 0 .
344     * 如果 key 不是列表类型,返回一个错误。
345     */
346    Long llen(Object key);
347
348    /**
349     * 移除并返回列表 key 的头元素。
350     */
351    @SuppressWarnings("unchecked")
352    <T> T lpop(Object key);
353
354    /**
355     * 将一个或多个值 value 插入到列表 key 的表头
356     * 如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,
357     * 对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,
358     * 这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。
359     * 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。
360     * 当 key 存在但不是列表类型时,返回一个错误。
361     */
362    Long lpush(Object key, Object... values);
363
364    /**
365     * 将列表 key 下标为 index 的元素的值设置为 value 。
366     * 当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误。
367     * 关于列表下标的更多信息,请参考 LINDEX 命令。
368     */
369    String lset(Object key, long index, Object value);
370
371    /**
372     * 根据参数 count 的值,移除列表中与参数 value 相等的元素。
373     * count 的值可以是以下几种:
374     * count 大于 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
375     * count 小于 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
376     * count 等于 0 : 移除表中所有与 value 相等的值。
377     */
378    Long lrem(Object key, long count, Object value);
379
380    /**
381     * 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。
382     * 下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
383     * 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
384     * <pre>
385     * 例子:
386     * 获取 list 中所有数据:cache.lrange(listKey, 0, -1);
387     * 获取 list 中下标 1 到 3 的数据: cache.lrange(listKey, 1, 3);
388     * </pre>
389     */
390    List lrange(Object key, long start, long end);
391
392    /**
393     * 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
394     * 举个例子,执行命令 LTRIM list 0 2 ,表示只保留列表 list 的前三个元素,其余元素全部删除。
395     * 下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
396     * 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
397     * 当 key 不是列表类型时,返回一个错误。
398     */
399    String ltrim(Object key, long start, long end);
400
401    /**
402     * 移除并返回列表 key 的尾元素。
403     */
404    <T> T rpop(Object key);
405
406    /**
407     * 命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:
408     * 将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。
409     * 将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。
410     */
411    @SuppressWarnings("unchecked")
412    <T> T rpoplpush(Object srcKey, Object dstKey);
413
414    /**
415     * 将一个或多个值 value 插入到列表 key 的表尾(最右边)。
416     * 如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如
417     * 对一个空列表 mylist 执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,
418     * 等同于执行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。
419     * 如果 key 不存在,一个空列表会被创建并执行 RPUSH 操作。
420     * 当 key 存在但不是列表类型时,返回一个错误。
421     */
422    Long rpush(Object key, Object... values);
423
424    /**
425     * BLPOP 是列表的阻塞式(blocking)弹出原语。
426     * 它是 LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。
427     * 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。
428     */
429    List blpop(Object... keys);
430
431    /**
432     * BLPOP 是列表的阻塞式(blocking)弹出原语。
433     * 它是 LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。
434     * 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。
435     */
436    List blpop(Integer timeout, Object... keys);
437
438    /**
439     * BRPOP 是列表的阻塞式(blocking)弹出原语。
440     * 它是 RPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BRPOP 命令阻塞,直到等待超时或发现可弹出元素为止。
441     * 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的尾部元素。
442     * 关于阻塞操作的更多信息,请查看 BLPOP 命令, BRPOP 除了弹出元素的位置和 BLPOP 不同之外,其他表现一致。
443     */
444    List brpop(Object... keys);
445
446    /**
447     * BRPOP 是列表的阻塞式(blocking)弹出原语。
448     * 它是 RPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BRPOP 命令阻塞,直到等待超时或发现可弹出元素为止。
449     * 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的尾部元素。
450     * 关于阻塞操作的更多信息,请查看 BLPOP 命令, BRPOP 除了弹出元素的位置和 BLPOP 不同之外,其他表现一致。
451     */
452    List brpop(Integer timeout, Object... keys);
453
454    /**
455     * 使用客户端向 JbootRedis 服务器发送一个 PING ,如果服务器运作正常的话,会返回一个 PONG 。
456     * 通常用于测试与服务器的连接是否仍然生效,或者用于测量延迟值。
457     */
458    String ping();
459
460    /**
461     * 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
462     * 假如 key 不存在,则创建一个只包含 member 元素作成员的集合。
463     * 当 key 不是集合类型时,返回一个错误。
464     */
465    Long sadd(Object key, Object... members);
466
467    /**
468     * 返回集合 key 的基数(集合中元素的数量)。
469     */
470    Long scard(Object key);
471
472    /**
473     * 移除并返回集合中的一个随机元素。
474     * 如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER 命令。
475     */
476    <T> T spop(Object key);
477
478    /**
479     * 返回集合 key 中的所有成员。
480     * 不存在的 key 被视为空集合。
481     */
482    Set smembers(Object key);
483
484    /**
485     * 判断 member 元素是否集合 key 的成员。
486     */
487    boolean sismember(Object key, Object member);
488
489    /**
490     * 返回多个集合的交集,多个集合由 keys 指定
491     */
492    Set sinter(Object... keys);
493
494    /**
495     * 返回集合中的一个随机元素。
496     */
497    <T> T srandmember(Object key);
498
499    /**
500     * 返回集合中的 count 个随机元素。
501     * 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。
502     * 如果 count 大于等于集合基数,那么返回整个集合。
503     * 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
504     * 该操作和 SPOP 相似,但 SPOP 将随机元素从集合中移除并返回,而 SRANDMEMBER 则仅仅返回随机元素,而不对集合进行任何改动。
505     */
506    List srandmember(Object key, int count);
507
508    /**
509     * 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。
510     */
511    Long srem(Object key, Object... members);
512
513    /**
514     * 返回多个集合的并集,多个集合由 keys 指定
515     * 不存在的 key 被视为空集。
516     */
517    Set sunion(Object... keys);
518
519    /**
520     * 返回一个集合的全部成员,该集合是所有给定集合之间的差集。
521     * 不存在的 key 被视为空集。
522     */
523    Set sdiff(Object... keys);
524
525    /**
526     * 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
527     * 如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,
528     * 并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
529     */
530    Long zadd(Object key, double score, Object member);
531
532    Long zadd(Object key, Map<Object, Double> scoreMembers);
533
534    /**
535     * 返回有序集 key 的基数。
536     */
537    Long zcard(Object key);
538
539    /**
540     * 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
541     * 关于参数 min 和 max 的详细使用方法,请参考 ZRANGEBYSCORE 命令。
542     */
543    Long zcount(Object key, double min, double max);
544
545    /**
546     * 为有序集 key 的成员 member 的 score 值加上增量 increment 。
547     */
548    Double zincrby(Object key, double score, Object member);
549
550    /**
551     * 返回有序集 key 中,指定区间内的成员。
552     * 其中成员的位置按 score 值递增(从小到大)来排序。
553     * 具有相同 score 值的成员按字典序(lexicographical order )来排列。
554     * 如果你需要成员按 score 值递减(从大到小)来排列,请使用 ZREVRANGE 命令。
555     */
556    List zrange(Object key, long start, long end);
557
558    /**
559     * 返回有序集 key 中,指定区间内的成员。
560     * 其中成员的位置按 score 值递减(从大到小)来排列。
561     * 具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。
562     * 除了成员按 score 值递减的次序排列这一点外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一样。
563     */
564    List zrevrange(Object key, long start, long end);
565
566    /**
567     * 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
568     * 有序集成员按 score 值递增(从小到大)次序排列。
569     */
570    List zrangeByScore(Object key, double min, double max);
571
572    /**
573     * 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
574     * 排名以 0 为底,也就是说, score 值最小的成员排名为 0 。
575     * 使用 ZREVRANK 命令可以获得成员按 score 值递减(从大到小)排列的排名。
576     */
577    Long zrank(Object key, Object member);
578
579    /**
580     * 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。
581     * 排名以 0 为底,也就是说, score 值最大的成员排名为 0 。
582     * 使用 ZRANK 命令可以获得成员按 score 值递增(从小到大)排列的排名。
583     */
584    Long zrevrank(Object key, Object member);
585
586    /**
587     * 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
588     * 当 key 存在但不是有序集类型时,返回一个错误。
589     */
590    Long zrem(Object key, Object... members);
591
592    /**
593     * 返回有序集 key 中,成员 member 的 score 值。
594     * 如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。
595     */
596    Double zscore(Object key, Object member);
597
598    /**
599     * 发布
600     *
601     * @param channel
602     * @param message
603     */
604    void publish(String channel, String message);
605
606    /**
607     * 发布
608     *
609     * @param channel
610     * @param message
611     */
612    void publish(byte[] channel, byte[] message);
613
614
615    /**
616     * 订阅
617     *
618     * @param listener
619     * @param channels
620     */
621    void subscribe(JedisPubSub listener, final String... channels);
622
623    /**
624     * 订阅
625     *
626     * @param binaryListener
627     * @param channels
628     */
629    void subscribe(BinaryJedisPubSub binaryListener, final byte[]... channels);
630
631    /**
632     * 扫描
633     *
634     * @param pattern
635     * @param scanCount
636     * @return
637     */
638    RedisScanResult<String> scan(String pattern, String cursor, int scanCount);
639
640
641    byte[] keyToBytes(Object key);
642
643    Object keyFromBytes(byte[] bytes);
644
645    String bytesToKey(byte[] bytes);
646
647    byte[][] keysToBytesArray(Object... keys);
648
649
650    void fieldSetFromBytesSet(Set<byte[]> data, Set<Object> result);
651
652    byte[] valueToBytes(Object value);
653
654    Object valueFromBytes(byte[] bytes);
655
656    byte[][] valuesToBytesArray(Object... valuesArray);
657
658    void valueSetFromBytesSet(Set<byte[]> data, Set<Object> result);
659
660    List valueListFromBytesList(Collection<byte[]> data);
661
662    List keyValueListFromBytesList(List<byte[]> data);
663
664    Object eval(String script, int keyCount, String... params);
665
666}
667
668
669
670
671
672