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