一、前言
一般我们做Web后台开发的,肯定都用过Redis,而Jedis呢,则是Java官方推荐的redis客户端之一,我们本系列的几篇文章都将来学习Redis的一些特性,而本文的重点则是Jedis中主要方法的学习。虽然经常用jedis的一些方法,但没有系统的学习整理过,遇到同事写的一些方法还有点不懂,所以趁此机会来整理下。
二、Jedis介绍
Jedis是Java官方推荐的Redis客户端之一,在Java中使用的话,我们一般都是使用Jedis的方法来进行操作。首先,要使用Jedis的话,需要引入Maven文件:
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
至于使用Jedis的话,配置完成JedisPool之后,直接从里面取Jedis对象使用即可,我们主要是来看下它的方法,由于Jedis对象的方法太多,我们来根据它支持的数据类型进行分类,然后来进行学习。Redis支持的数据类型特别多,比如String,List,Set,SortedSet,Hash等。
1. 针对Key的操作
该目录下介绍的方法一般都是通用的,针对所有类型的key进行操作的,我们来简单看下。
// 删除给定的一个或多个 key,如果key不存在,会被忽略
public Long del(final String... keys)
// 返回key存在的数量
public Long exists(final String... keys)
// 查询key是否存在
public Boolean exists(final String key)
// 查找所有符合给定正则表达式的key
public Set<String> keys(final String pattern)
// 移除给定 key 的生存时间,将这个 key 从带生存时间的key 转换成永久的永不过期的 key;
public Long persist(final String key)
// 以秒为单位,返回key的剩余生存时间
public Long pttl(final String key)
// 以毫秒为单位,返回key的剩余生存时间
public Long ttl(final String key)
// 从当前库中随机返回一个key
public String randomKey()
// 返回key所储存的值的类型,返回的类型如"string", "list", "set"
public String type(final String key)
// 修改key的名称,如果newKey已经存在,将会覆盖掉;如果oldkey与newkey相同或者key不存在时,异常;
public String rename(final String oldkey, final String newkey)
// 当且仅当 newkey 不存在时,将 oldkey 改名为 newkey;而如果oldkey不存在,异常;
public Long renamenx(final String oldkey, final String newkey)
// 将当前库中的key移动到另一个库中,如果当前库和给定库有相同名字的给定key,或者key不存在于当前库,
// 那么 MOVE 操作没有任何效果。因此,也可以利用这一特性,将 MOVE 当作锁(locking)原语(primitive);
public Long move(final String key, final int dbIndex)
1.1 dump 和 restore 方法
public byte[] dump(final String key)
该方法用于对key进行序列化,并返回被序列化的值,而对应的restore方法可以将序列化后的值反序列化为Redis的key。序列化生成的值有以下几个特点:
- 它带有 64 位的校验和,用于检测错误,restore在进行反序列化之前会先检查校验和;
- 值的编码格式和 RDB 文件保持一致;
- RDB 版本会被编码在序列化值当中,如果因为 Redis 的版本不同造成 RDB 格式不兼容,那么 Redis会拒绝对这个值进行反序列化操作;
- 序列化的值不包括任何生存时间信息;
而对于 restore 方法,来简单看下:
public String restore(final String key, final int ttl, final byte[] serializedValue)
用于反序列化,参数 ttl
表示key的生存时间,单位是毫秒,为0表示不设置生存时间;在执行反序列化之前会先对序列化值的 RDB 版本和数据校验和进行检查,如果 RDB 版本不相同或者数据不完整的话,那么 restore会拒绝进行反序列化,并抛出异常。
1.2 expire,pexpire,expireAt,和 pexpireAt 方法
public Long expire(final String key, final int seconds)
public Long pexpire(final String key, final long milliseconds)
首先来看下 expire 方法。该方法用于设置key的过期时间,在 Redis 中,带有生存时间的 key 被称为 volatile。
- 生存时间可以通过使用DEL命令来删除整个key来移除,也可以通过使用set或者getset进行覆盖,而如果一个命令只是修改(alter)一个带生存时间的 key 的值而不是用一个新的 key 值来代替(replace)它的话,那么生存时间不会被改变,比如命令incr,lpush等;
- 另一方面,如果使用 rename对一个 key 进行改名,那么改名后的 key 的生存时间和改名前一样;rename 的另一种操作可能是,尝试将一个带生存时间的 key 改名成另一个带生存时间的 another_key ,这时旧的 another_key (以及它的生存时间)会被删除,然后旧的 key 会改名为 another_key,因此,新的 another_key 的生存时间也和原本的 key 一样;
- 而使用 persist方法可以在不删除 key 的情况下,移除 key 的生存时间,让 key 重新成为一个 persistent的 key;
- 当然可以对一个已经带有生存时间的 key 执行 EXPIRE 命令,新指定的生存时间会取代旧的生存时间;
而 pexpire 方法就比较简单了,和expire方法类似,但该方法设置过期时间的单位是毫秒,而不是秒。
public Long expireAt(final String key, final long unixTime)
public Long pexpireAt(final String key, final long millisecondsTimestamp)
而 expireAt 方法,该方法和 expire 方法类似,都是用于为key设置生存时间,不同在于该方法接受的时间参数是 UNIX 时间戳(unix timestamp),单位是秒;而 pexpireAt 方法同样和expireAt方法类似,不同的是该方法以毫秒为单位设置过期时间的UNIX时间戳。
1.3 migrate 方法
public String migrate(final String host, final int port, final String key,
final int destinationDb, final int timeout)
将 key 原子性地从当前实例传送到目标实例的指定数据库上,一旦传送成功,key保证会出现在目标实例上,而当前实例上的 key 会被删除。这个命令是一个原子操作,它在执行的时候会阻塞进行迁移的两个实例,直到以下任意结果发生:迁移成功,迁移失败,等到超时。
命令的内部实现是这样的:
它在当前实例对给定 key 执行 DUMP 命令 ,将它序列化,然后传送到目标实例,目标实例再使用 RESTORE 对数据进行反序列化,并将反序列化所得的数据添加到数据库中;当前实例就像目标实例的客户端那样,只要看到 RESTORE 命令返回 OK ,它就会调用 DEL 删除自己数据库上的 key 。
如要了解更多该命令,可以参考:http://doc.redisfans.com/key/migrate.html
1.4 sort 方法
public List<String> sort(final String key)
public List<String> sort(final String key, final SortingParams sortingParameters)
public Long sort(final String key, final String dstkey)
public Long sort(final String key, final SortingParams sortingParameters, final String dstkey)
sort方法用于返回给定列表(List),集合(Set),有序集合(Sorted Set)的key中经过排序的元素,后两个方法表示将排序后的结果保存到dstkey中。其中,排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较。
其中排序分为多种方式,ASC/DESC,使用ALPHA 修饰符对字符串排序,使用limit 限制排序后的返回结果,使用外部key进行排序等,这里就不一一介绍了,详细介绍可以参考:http://doc.redisfans.com/key/sort.html
2. String操作
由于大部分方法都比较简单,所以学习的时候直接看注释就可以,对于一些稍微复杂点的方法,再单独拿出来学习下。
2.1 set方法
// 缓存的基础方法,如果key已经存在,则进行覆盖;value的长度不能超过1073741824字节,
// 也就是1G,时间复杂度:O(1);
public String set(final String key, String value)
而针对另一个重载的set方法,我们来看下:
public String set(final String key, final String value, final String nxxx, final String expx,
final long time)
该方法在上一个方法基础上,增加了过期时间及key存在时是否覆盖设置:
- nxxx,该值只能是
NX
和XX
。NX
表示只有当key不存在时才进行set操作;而XX
则表示只有当key存在时才进行set操作;- expx,该值只能是
EX
和PX
。这个参数表示数据过期时间的单位,EX
表示单位是秒,PX
代表毫秒;- time,表示过期时间,单位是expx所设置的单位;
2.2 mset 和 msetnx 方法
首先,mset方法表示同时设置多个键值对,而如果key存在的话将会进行覆盖;而 msetnx 方法和 mset 稍有些不同,该方法只会在所有给定key都不存在的情况下进行操作,只要有一个key存在,该方法就不会进行set操作;
public String mset(final String... keysvalues)
jedis.mset("name", "zhang", "age", "12");
public Long msetnx(final String... keysvalues)
- 这两个方法都是原子性的,而 msetnx 方法可以用作设置多个不同 key 表示不同字段(field)的唯一性逻辑对象(unique logic object),所有字段要么全被设置,要么全不被设置;
- 而对 mset 方法而言,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。
我们可以根据这两点进行一些特殊的操作。
2.3 incr,incrBy,incrByFloat,decr 和 decrBy 方法
首先,前三个方法都是用于递增操作,对于 incr 方法来说,是将key中储存的数字加1,如果key不存在,key的值会先初始化为0再加1,不过需要注意的是:
这是一个针对字符串的操作,因为 Redis 没有专用的整数类型,所以 key 内储存的字符串被解释为十进制 64 位有符号整数来执行 INCR 操作,所以该操作的值限制在 64 位(bit)有符号数字表示之内。
public Long incr(final String key)
public Long incrBy(final String key, final long integer)
public Double incrByFloat(final String key, final double value)
public Long decr(final String key)
public Long decrBy(final String key, final long integer)
而 incrBy 方法,是为key中储存的数字加上增量 integer,另一个方法 incrByFloat 是为key中储存的数字加上浮点增量value,其他情况都是和 incr方法相同的。而针对 incrByFloat,无论是 key 的值,还是增量 increment ,都可以使用像 2.0e7 、3e5 、90e-2 那样的指数符号(exponential notation)来表示。
而另外的两个方法 decr 和 decrBy 方法则是用于递减操作,一个是每次减1,另一个是每次减固定的数字。
2.4 setbit,getbit,bitop 和 bitcount
Jedis提供了一套对BitMaps进行操作的方法。
- 通过一个bit位来表示某个元素对应的值或者状态,其中key对应元素本身,value对应一串二进制,这就是BitMaps。BitMaps其实严格意义上并不算是一种数据结构,只是一个字符串, 但是它可以对字符串的位进行操作。
- 我们可以把 Bitmaps 想象成一个以 位 为单位的动态数组,数组最大下标232,因为Reids字符串的大小被限制在512M,数组的每个单元只能存储 0 和 1,数组的下标在Bitmaps中叫做偏移量;
其中Jedis中对bit的操作包括了如下4个方法:setbit
,getbit
,bitop
,bitcount
。
先简单看下 setbit
方法:
public Boolean setbit(String key, long offset, boolean value)
public Boolean setbit(String key, long offset, String value)
setbit 方法用于设置字符串key指定偏移量上的位(bit),其中有两个方法,其中第一个方法的
value
取值为true 或者 false,true 代表1,false 代表0;而第二个重载的方法传递的是一个字符串,但该字符串的值只能是1 或者 0;
再来看下对应的 getbit
方法:
public Boolean getbit(String key, long offset)
这个方法就比较简单,用于获取指定key对应的偏移量上的位。
来看下 bitcount
方法:
public Long bitcount(final String key)
public Long bitcount(final String key, long start, long end)
该方法用于计算给定字符串中,被设置为1的位的数量;第二个是计算某一段范围内的bit为1的数量,其中 start 和 end 表示字节,可以是负值。
再来看一下 bitop
方法:
public Long bitop(BitOP op, final String destKey, String... srcKeys)
bitop 方法用于对多个保存二进制位的字符串进行位操作,并将结果保存到 destKey上,其中该操作支持以下4中操作(Jedis中也就是枚举BitOP中的4个值):
- AND,对一个或多个 key 进行逻辑并操作,并将结果保存到 destkey;
- OR,对一个或多个 key 进行逻辑或操作,并将结果保存到 destkey;
- XOR,对一个或多个 key 进行逻辑异或操作,并将结果保存到 destkey;
- NOT,对给定 key 进行逻辑非操作,并将结果保存到 destkey;
除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入,执行结果将始终保存到 destkey 里面;而当Bitop处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作0,空的字符串也会被看作是包含0的字符串序列;
2.5 其他通用方法
// 该方法和最基础的set方法功能是一样的,不同的是该方法表示当且仅当key不存在的时候才进行set操作;
public Long setnx(final String key, final String value)
// 而该方法则等同于 set(String, String) + expire(String,int),用于设置过期时间,单位是秒;
public String setex(final String key, final int seconds, final String value)
// 该方法和setex类似,不过不同的是该方法的单位是毫秒;
public String psetex(final String key, final int milliseconds, final String value)
// 返回 key 所对应的字符串值,如果不存在,返回null,
// 假如 key 保存的值不是字符串类型,返回一个错误,因为 GET 只能用于处理字符串值
public String get(final String key)
// 返回一个或多个key对应的value值
public List<String> mget(final String... keys)
// 根据偏移量进行截取key对应的value值,其中偏移量可以为负,-1表示最后一个字符
public String getrange(String key, long startOffset, long endOffset)
// 将给定key的值设为value,并返回旧的value值
public String getSet(final String key, final String value)
// 用value参数覆盖给定key所存储的字符串值,从偏移量offset开始
// 比如字符串 hello world,偏移量是6,value是redis,那么执行完成后,字符串变为了hello redis;
public Long setrange(String key, long offset, String value)
// 返回key所储存的字符串的长度
public Long strlen(final String key)
// 如果 key已经存在并且是一个字符串,该方法将 value 追加到 key 原来的值的末尾;
// 如果 key不存在,该方法就简单地将给定 key 设为 value,就像执行 SET key value 一样;
public Long append(final String key, final String value)
3. hash相关
Jedis中 h 开头的方法通常都是用来操作哈希表的。其中与set相关的有如下三个方法:
public Long hset(final String key, final String field, final String value)
public String hmset(final String key, final Map<String, String> hash)
public Long hsetnx(final String key, final String field, final String value)
- hset方法表示通过哈希表存储指定的hash值,如果key不存在,则会创建一个新的哈希表来保存hash值;如果key存在,则旧值将会被覆盖;其中,key代表的是哈希表,filed表示的是哈希表中的域,value则是哈希表中域对应的值;
- hmset方法,表示同时将多个 field-value (域-值对)设置到哈希表 key 中,该命令会覆盖掉hash表中已经存在的域;
- hsetnx方法,表示将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在的时候才进行操作;若域 field 已经存在,该操作无效;而如果key不存在,则会创建一个新的哈希表;
接下来是hash操作中其他相关的方法:
// 表示删除哈希表key中指定的field,可以指定多个域
public Long hdel(final String key, final String... fields)
// 表示在给定的哈希表key中,指定的域是否存在
public Boolean hexists(final String key, final String field)
// 表示返回哈希表key中,给定的域filed的值
public String hget(final String key, final String field)
//方法表示返回哈希表中,所有的域和对应的值
public Map<String, String> hgetAll(final String key)
//方法表示为哈希表中域field的值递增常量value;增量也可以为负数,相当于对给定域进行减法操作;
public Long hincrBy(final String key, final String field, final long value)
// 为哈希表 key 中的域 field 递增浮点数增量value,如果hash表中没有域,那么会先将该域的值设为0,
// 然后再递增;如果没有key,则会先创建一个hash表;同样,value也可以是负数,相当于进行递减操作;
public Double hincrByFloat(final String key, final String field, final double value)
// 返回hash表key中的所有域
public Set<String> hkeys(final String key)
// 返回hash表key中所有域的值
public List<String> hvals(final String key)
// 返回hash表key中域的数量
public Long hlen(final String key)
// 返回hash表key中一个或多个域对应的值
public List<String> hmget(final String key, final String... fields)
4. list相关
而Jedis中与list列表相关的操作大部分是通过 L 开头的方法,当然还有一些其他的方法。由于方法比较简单,所以大部分方法直接看注释就可以了,一些稍微复杂的就拿出来单独介绍:
// 将列表 key 下标为 index 的元素的值设置为 value,不过与其他索引相关的列表命令类似,
// 从列表末尾开始访问元素时,索引可能为负值。
// 所以-1是最后一个元素,-2是倒数第二元素,and so on.
public String lset(final String key, final long index, final String value)
// lpop表示返回并移除列表key的第一个元素,rpop表示返回并移除列表key的最后一个元素
public String lpop(final String key)
public String rpop(final String key)
// 返回列表key中下标为index的元素,当然index可以是负值,-1表示倒数第一个元素;
public String lindex(final String key, final long index)
// 返回列表key的长度
public Long llen(final String key)
// 将一个或多个值插入到列表key的头部;如果有多个value,那么各个value的值按照从左
// 到右的顺序依次插入到头部;比如说多个值为a b c,那么插入到列表的值是c,b,a;
// 如果key不存在,就创建空列表并执行后续的插入操作;
public Long lpush(final String key, final String... strings)
// 将一个或多个value值插入到列表的尾部;比如value为a,b,c,那么插入后列表为a,b,c
public Long rpush(final String key, final String... strings)
// 将一个或多个 value 插入到列表 key的头部,当且仅当 key 存在并且是一个列表
// 和 lpush 方法不同,当 key不存在时,lpushx 方法什么也不做
public Long lpushx(final String key, final String... string)
// 将一个或多个 value 插入到列表 key 的尾部,当且仅当 key 存在并且是一个列表。
// 和 rpush 方法不同,当 key 不存在时,rpushx 方法什么也不做
public Long rpushx(final String key, final String... string)
4.1 lrem 和 ltrim方法
而针对lrem方法,我们可以简单看下:
public Long lrem(final String key, final long count, final String value)
该方法表示根据参数count类型,移除列表中与另一个参数value相等的元素。其中,count有以下三个值:
- count =0,移除列表中所有与value相等元素;
- count > 0,从列表的头部开始向尾部搜索,移除与 value 相等的元素,数量为 count;
- count < 0,从列表的尾部开始向头部搜索,移除与value相等的元素,数量为count;
另一个方法ltrim,用于对列表进行截取操作,其中参数start和end代表的是数组下标值:
public String ltrim(final String key, final long start, final long end)
举个例子,ltrim(key, 0, 2)
,表示只保留列表 list 的前三个元素,其余元素全部删除,当然也可以使用负数表示下标,-1 代表最后一个元素;一般情况下,该方法会配合lpush/rpush
这两个方法一起使用。
4.2 rpoplpush 和 brpoplpush方法
另一个方法 rpoplpush,该方法表示在一个原子时间内,先移除并返回列表srckey中的最后一个元素,然后将刚刚srckey返回的元素插入到列表dstkey中,作为该列表的头元素:
public String rpoplpush(final String srckey, final String dstkey)
比如说,两个列表srckey(a,b,c)和dstkey(x,y,z),执行该方法之后,srckey为(a,b),而dstkey为(c,x,y,z),返回的结果是c;如果两个列表相同,则列表中的尾部元素被移动到头部,并返回该元素,该操作可以看错是一个旋转操作。
而另一个方法 brpoplpush,则是 rpoplpush方法的阻塞版本,当列表source不为空时,该方法和 rpopLpush 方法是一样的;而当source为空时,该方法将会阻塞,直到等待超时或另一个操作将source进行 lpush 或者rpush为止。
public String brpoplpush(String source, String destination, int timeout)
其中timeout的单位是秒,如果是0,表示可以无限等待。
4.3 blpop 和 brpop方法
而针对 blpop 和 brpop 方法,就比较简单了:
// 该方法是lpop的阻塞版本,当给定列表内没有任何元素可以操作的时候,
// 连接将会阻塞,直到等待超时或发现有可操作元素为止。
public List<String> blpop(int timeout, String key)
// 该方法是rpop的阻塞版本,和上述类似
public List<String> brpop(int timeout, String key)
4.4 linsert 和 lrange方法
linsert方法表示将值value插入到列表key的某一个元素之前或之后:
public Long linsert(final String key, final LIST_POSITION where, final String pivot,
final String value)
当key不存在或者key中pivot不存在时,不执行任何操作。其中枚举 LIST_POSITION
包含了两个字段:BEFORE
,AFTER
。
而另一个方法lrange方法,则是返回列表key中指定区间内的元素:
public List<String> lrange(final String key, final long start, final long end)
其中start和end表示的是下标值,同样,也可也使用负值,注意是闭区间,比如说start,end 是0,2,则会返回列表中前三个元素。
5. Set集合
这里我们来简单介绍下有关Set集合的一些方法。
// 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略
public Long sadd(final String key, final String... members)
// 返回集合key中元素的数量
public Long scard(final String key)
// 返回集合key1和所有集合key2,key3...keyN 之间的差集
// key1 = [x, a, b, c]
// key2 = [c]
// key3 = [a, d]
// SDIFF key1,key2,key3 => [x, b]
public Set<String> sdiff(final String... keys)
// 这个方法的作用和 SDIFF 类似,但它将结果保存到 dstkey 集合,而不是简单地返回结果集,
// 如果 dstkey 集合已经存在,则将其覆盖,dstkey 可以是 key本身。
public Long sdiffstore(final String dstkey, final String... keys)
// 返回集合key1和所有集合key2,key3...keyN 之间的交集,不存在的 key 被视为空集;
// 当给定集合当中有一个空集时,结果也为空集
public Set<String> sinter(final String... keys)
// 和sinter类似,但它将结果保存到dstkey集合,
// 如果dstkey已经存在,则将其覆盖,dstkey可以是key本身
public Long sinterstore(final String dstkey, final String... keys)
// 判断元素member是否是集合key的成员
public Boolean sismember(final String key, final String member)
// 返回集合key的所有元素,不存在的key视为空集合
public Set<String> smembers(final String key)
// 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略
public Long srem(final String key, final String... members)
// 返回所有给定集合的并集
public Set<String> sunion(final String... keys)
// 和上面sunion类似,会将结果保存到集合dstkey中
public Long sunionstore(final String dstkey, final String... keys)
5.1 smove,spop,srandmember 方法
首先来看下 smove 方法:
public Long smove(final String srckey, final String dstkey, final String member)
- 该方法用于将元素从 srckey 集合移动到 dstkey 集合,是一个原子性操作。如果 srckey 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 srckey 集合中被移除,并添加到 dstkey 集合中去。
- 而当 dstkey 集合已经包含 member 元素时, SMOVE 命令只是简单地将 srckey 集合中的 member 元素删除。
而 spop 方法比较简单,用于移除并返回集合中的一个随机元素:
public String spop(final String key)
另外,srandmember 方法用于返回集合中的随机元素,有两个重载方法:
public String srandmember(final String key)
public List<String> srandmember(final String key, final int count)
第一个方法用于返回集合中的一个随机元素,第二个方法有一个参数count:
- 如果 count 为正数,且小于集合数量,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同;
- 如果 count 大于等于集合数量,那么返回整个集合;
- 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
该操作和 SPOP 相似,但 SPOP 是将随机元素从集合中移除并返回,而 srandmember 则仅仅返回随机元素,而不对集合进行任何改动。
6. SortedSet有序集合
有序集合类型算是Redis中比较高级的一种类型了,有序集合类型首先是集合类型,其次是通过为每个元素都关联一个分数(score)来保证集合的有序性,而有序则是指的是分数的有序,当前集合的元素仍是是不能相同,但分数是可以相同的。
- 有序集合类型使用散列表和跳跃表来实现,读取数据的时间复杂度是O(log(N));
- 有序集合可以通过修改元素的分数来调整某个元素的位置;
接下来我们来看一下一些方法的介绍:
// 该方法用于将一个或多个元素添加到有序集合key中,如果某夜member已经存在,
// 则更新member的score值,并重新插入该元素来保证该member在正确的位置上
public Long zadd(final String key, final double score, final String member)
public Long zadd(final String key, final Map<String, Double> scoreMembers)
public Long zadd(final String key, final double score, final String member,
final ZAddParams params)
public Long zadd(String key, Map<String, Double> scoreMembers, ZAddParams params)
// 获取有序集合中元素的数量
public Long zcard(final String key)
// 获取集合key中,score值在min和max之间的元素的数量(闭区间,包含min和max)
public Long zcount(final String key, final String min, final String max)
public Long zcount(final String key, final double min, final double max)
// 为集合key中成员member的score值加上增量,并调整位置,参数score可以是负数,表示递减
public Double zincrby(final String key, final double score, final String member)
public Double zincrby(String key, double score, String member, ZIncrByParams params)
// 返回集合key中指定区间内的成员,其中score值从小到大排列,start和end从0开始,0表示第一个元素,
public Set<String> zrange(final String key, final long start, final long end)
// 返回集合key中指定区间内的成员,其中score值从大到小排列
public Set<String> zrevrange(final String key, final long start, final long end)
// 返回集合key中,score 值介于 min 和 max 之间(包括min 或 max)的成员,按照score值从小到大的顺序
// 该方法有多个重载方法,这里不多说了
public Set<String> zrangeByScore(final String key, final double min, final double max)
// 返回集合key中,score值介于max和min之间的成员,按照score从大到小的顺序
public Set<String> zrevrangeByScore(final String key, final double max, final double min)
// 返回集合key中某一个元素在该集合内的排名,按照score值从小到大排列
public Long zrank(final String key, final String member)
// 返回集合key中某一个元素在该集合内的排名,按照score值从大到小排列
public Long zrevrank(final String key, final String member)
// 移除集合key中一个或多个元素
public Long zrem(final String key, final String... members)
// 移除集合key中指定区间内的成员,包含start,end,相当于下标
public Long zremrangeByRank(final String key, final long start, final long end)
// 移除集合key中所有score值介于min和max之间的元素(包含min和max)
public Long zremrangeByScore(final String key, final double start, final double end)
public Long zremrangeByScore(final String key, final String start, final String end)
// 返回集合key中成员member的score值
public Double zscore(final String key, final String member)
6.1 zunionstore 和 zinterstore方法
zunionstore方法用于计算一个或多个集合的并集,并将并集结果储存到dstkey集合中,默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 的值之和。当然有一个选项 AGGREGATE
可以设置指定score的模式,也就是通过参数ZParams的枚举对象Aggregate来指定具体的模式:
SUM,就是计算所有的和; MIN,取最小值,MAX,取最大值;
另外,还有一个选项 WEIGHTS
可以为有序集合指定一个乘法因子(multiplication factor),每个给定有序集的所有成员的 score 值都会乘以该有序集的因子。如果没有指定 WEIGHTS 选项,乘法因子默认设置为 1 ,其中该选项通过 ZParams
的 weightsByDouble
方法来指定。
public Long zunionstore(final String dstkey, final String... sets)
public Long zunionstore(final String dstkey, final ZParams params, final String... sets)
而另一个方法 zinterstore 则是用于计算一个和多个集合的交集,并将结果保存到dstkey集合中,其他参数则和 zunionstore 方法是一致的:
public Long zinterstore(final String dstkey, final String... sets)
public Long zinterstore(final String dstkey, final ZParams params, final String... sets)
本文参考自: 强烈推荐 - Redis 命令参考