Jedis API接口及说明
原创大约 21 分钟
以下代码是早期学习Redis时所做的注释和记录,那时的Redis还是4.x版本。
虽然目前Redis已经更新到了7.x版本,有些数据类型也发生了变化,但至少没有根本性的变化,而且其中大多数的数据类型还是可用的。
下面的代码基本上囊括了对Redis所有数据类型的操作,以及它们的应用场景。
例如,可以将它作为键值对
,作为分布式锁
,作为自增列表
或有序列表
等工具使用。
package com.jedis;
import java.util.List;
import java.util.Map;
import java.util.Set;
import redis.clients.jedis.SortingParams;
import redis.clients.jedis.ZParams;
import sun.misc.Sort;
/**
* Jedis API接口及说明
*
*/
public interface IJedis {
/**
* 1.键值相关操作接口说明
*
*/
// 清空所有的库
public void flushAll();
// 清空库中所有的键
public void flushDB();
// 返回当前数据库中key的数目
public long dbsize();
// 选择数据库
public void select(final int index);
// 输出系统中所有的key
public Set<String> keys(final String keys);
// 判断该键是否存在,存在返回1,否则返回0
public boolean exists(final String key);
// 删除指定的Key
public long del(final String... keys);
// 重命名指定的Key,如果参数中的两个Keys的命令相同,或者是源Key不存在,该命令都会返回相关的错误信息。如果newKey已经存在,则直接覆盖
public void rename(final String oldkey, final String newkey);
// 如果新值不存在,则将参数中的原值修改为新值。其它条件和RENAME一致
public boolean renamenx(final String oldkey, final String newkey);
// 设置某个key的过期时间(单位:秒),在超过该时间后,Key被自动的删除。如果该Key在超时之前被修改,与该键关联的超时将被移除
public boolean expire(final String key, final int seconds);
// EXPIREAT的作用和EXPIRE类似,都用于为 key 设置生存时间。不同在于 EXPIREAT命令接受的时间参数是 UNIX时间戳(unix timestamp)
public boolean expireAt(final String key, final long unixTime);
// 通过ttl命令查看一下指定Key的剩余存活时间(秒数),0表示已经过期,-1表示永不过期
public long ttl(final String key);
// 移除某个Key的生存时间
public long persist(final String key);
// 查看Key所储存的值的类型
public long type(final String key);
// 将当前数据库中的Key移入到ID为dbIndex的数据库中
public boolean move(final String key, final int dbIndex);
// 随机返回key空间的一个
public String randomkey();
/*******************************************************************************************************************************************************/
/**
* 2.字符串数据类型(String)接口说明
*
* 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,
* 如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M
*/
// 设定该Key持有指定的字符串Value,如果该Key已经存在,则覆盖其原有值
public void set(final String key, final String value);
// 获取指定Key的Value,如果该Key不存在,返回nil
public byte[] get(final String key);
// 原子性的设置该Key为指定的Value,返回该Key的原有值,如果该Key之前并不存在,则返回nil
public byte[] getSet(final String key, final String value);
// 返回一组指定Keys的Values的列表。
public List<byte[]> mget(final String... keys);
// 如果指定的Key不存在,则设定该Key持有指定字符串Value,此时其效果等价于SET命令。相反,如果该Key已经存在,该命令将不做任何操作并返回
public boolean setnx(final String key, final String value);
// 指定Key的过期时间(单位:秒),即在seconds的时间期限内可以获取key所对应的value值,过期之后返回nil
public boolean setex(final String key, final int seconds, final String value);
// 该命令原子性的完成参数中所有key/value的设置操作,如果在这一批Keys中有任意一个Key已经存在了,那么该操作将全部回滚,即所有的修改都不会生效
public boolean msetnx(final String... keysvalues);
// 将指定Key的Value原子性的递增1。如果该Key不存在,其初始值为0,在incr之后其值为1,返回递增后的值
public void incr(final String key);
// 同incr类似,增加指定的值,如果该Key不存在,其初始值为0
public void incrBy(final String key, final long integer);
// 将指定Key的Value原子性的递减1。如果该Key不存在,其初始值为-1,在decr之后其值仍为-1
public long decr(final String key);
// 同decr类似,减少指定的值,如果该Key不存在,其初始值为-1
public long decrBy(final String key, final long integer);
// 如果该Key已经存在,APPEND命令将参数Value的数据追加到已存在Value的末尾。如果该Key不存在,APPEND命令将会创建一个新的Key/Value。返回追加后的Value的长度
public long append(final String key, final String value);
/*******************************************************************************************************************************************************/
/**
* 3.Hashes数据类型接口说明
*
* 我们可以将Redis中的Hashes类型看成具有String Key和String Value的map容器。所以该类型非常适合于存储值对象的信息。如Username、Password和Age等
* 如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间
* 每一个Hash可以存储4,294,967,295个键值对
*/
// 为指定的Key设定Field/Value对,如果Key不存在,该命令将创建新Key以参数中的Field/Value对,如果参数中的Field在该Key中已经存在,则用新值覆盖其原有值
public boolean hset(final String key, final String field, final String value);
// 返回参数中Field的关联值,如果参数中的Key或Field不存在,返回nil
public void hget(final String key, final String field);
// 只有当参数中的Key或Field不存在的情况下,为指定的Key设定Field/Value对,否则该命令不会进行任何操作
public void hsetnx(final String key, final String field, final String value);
// 逐对依次设置参数中给出的Field/Value对。如果其中某个Field已经存在,则用新值覆盖原有值。如果Key不存在,则创建新Key,同时设定参数中的Field/Value
public void hmset(final String key, final Map<String, String> hash);
// 获取和参数中指定Fields关联的一组Values。如果请求的Field不存在,其值返回nil。如果Key不存在,该命令将其视为空Hash,因此返回一组null
public byte[] hmget(final String key, final String... fields);
// 增加指定Key中指定Field关联的Value的值。如果Key或Field不存在,该命令将会创建一个新Key或新Field,并将其关联的Value初始化为0,之后再指定数字增加的操作。返回运算后的值
public long hincrBy(final String key, final String field, final long value);
// 判断指定Key中的指定Field是否存在
public void hexists(final String key, final String field);
// 从指定Key的Hashes
// Value中删除参数中指定的多个字段,如果不存在的字段将被忽略。如果Key不存在,则将其视为空Hashes,并返回0。返回实际删除的Field数量
public void hdel(final String key, final String... fields);
// 获取该Key所包含的Field的数量
public void hlen(final String key);
// 返回指定Key的所有Fields名
public List<byte[]> hkeys(final String key);
// 返回指定Key的所有Values名
public List<byte[]> hvals(final String key);
// 获取该键包含的所有Field/Value。其返回格式为一个Field、一个Value,并以此类推
public Map<byte[], byte[]> hgetAll(final String key);
/*******************************************************************************************************************************************************/
/**
* 4.字符链表(List)数据类型接口说明
*
* 在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素
* 在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除
* List中可以包含的最大元素数量是4,294,967,295(42亿左右)
*/
/*
* 在指定Key所关联的List Value的头部插入参数中给出的所有Values。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表,
* 之后再将数据从链表的头部插入。如果该键的Value不是链表类型,该命令将返回相关的错误信息
*/
public void lpush(final String key, final String... string);
/*
* 在指定Key所关联的List Value的尾部插入参数中给出的所有Values。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表
* 之后再将数据从链表的尾部插入。如果该键的Value不是链表类型,该命令将返回相关的错误信息
*/
public void rpush(final String key, final String... string);
// 返回指定Key关联的链表中元素的数量,如果该Key不存在,则返回0。如果与该Key关联的Value的类型不是链表,则返回相关的错误信息
public long llen(final String key);
/*
* 返回指定范围内元素的列表。该命令的参数start和end都是0-based。即0表示链表头部(leftmost)的第一个元素
* 其中start的值也可以为负值,-1将表示链表中的最后一个元素,即尾部元素,-2表示倒数第二个并以此类推
* 该命令在获取元素时,start和end位置上的元素也会被取出。如果start的值大于链表中元素的数量,空链表将会被返回
* 如果end的值大于元素的数量,该命令则获取从start(包括start)开始,链表中剩余的所有元素
*/
public List<byte[]> lrange(final String key, final long start, final long end);
/*
* 该命令将仅保留指定范围内的元素,从而保证链接中的元素数量相对恒定。start和stop参数都是0-based,0表示头部元素
* 和其他命令一样,start和stop也可以为负值,-1表示尾部元素。如果start大于链表的尾部,或start大于stop,该命令不错报错,
* 而是返回一个空的链表, 与此同时该Key也将被删除。如果stop大于元素的数量,则保留从start开始剩余的所有元素
*/
public void ltrim(final String key, final long start, final long end);
// 该命令将返回链表中指定位置(index)的元素,index是0-based,表示头部元素,如果index为-1,表示尾部元素。如果与该Key关联的不是链表,该命令将返回相关的错误信息
public byte[] lindex(final String key, final long index);
// 设定链表中指定位置index的值为新值,其中0表示第一个元素,即头部元素,-1表示尾部元素。如果索引值Index超出了链表中元素的数量范围,该命令将返回相关的错误信息
public void lset(final String key, final long index, final String value);
/*
* 在指定Key关联的链表中,删除前count个值等于value的元素。如果count大于0,从头向尾遍历并删除,如果count小于0,
* 则从尾向头遍历并删除 如果count等于0,则删除链表中所有等于value的元素。如果指定的Key不存在,则直接返回0,返回被删除的元素数量
*/
public long lrem(final String key, long count, final String value);
// 返回并弹出指定Key关联的链表中的第一个元素,即头部元素。如果该Key不存在,返回nil
public byte[] lpop(final String key);
// 返回并弹出指定Key关联的链表中的最后一个元素,即尾部元素。如果该Key不存在,返回nil
public byte[] rpop(final String key);
/*
* 原子性的从与srckey键关联的链表尾部弹出一个元素,同时再将弹出的元素插入到与dstkey键关联的链表的头部
* 如果srckey键不存在,该命令将返回nil,同时不再做任何其它的操作了。如果srckey和dstkey是同一个键,
* 则相当于原子性的将其关联链表中的尾部元素移到该链表的头部
*/
public byte[] rpoplpush(final String srckey, final String dstkey);
/*******************************************************************************************************************************************************/
/**
* 5.字符集合(Set)数据类型接口说明
*
* 在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作
* 需要说明的是,这些操作的时间复杂度为O(1),即常量时间内完成次操作。Set可包含的最大元素数量是4,294,967,295
* 和List类型不同的是,Set集合中不允许出现重复的元素,这一点和C++标准库中的set容器是完全相同的。换句话说,如果多次添加相同元素,Set中将仅保留该元素的一份拷贝
* 和List类型相比,Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如unions、intersections和differences
* 由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销
*/
/*
* 如果在插入的过程用,参数中有的成员在Set中已经存在,该成员将被忽略,而其它成员仍将会被正常插入
* 如果执行该命令之前,该Key并不存在,该命令将会创建一个新的Set,此后再将参数中的成员陆续插入
* 如果该Key的Value不是Set类型,该命令将返回相关的错误信息
*/
public boolean sadd(final String key, final String... members);
// 获取名为Key的Set中的所有成员
public List<byte[]> smembers(final String key);
// 从与Key关联的Set中删除参数中指定的成员,不存在的参数成员将被忽略,如果该Key并不存在,将视为空Set处理
public void srem(final String key, final String... members);
// 随机的移除并返回Set中的某一成员。由于Set中元素的布局不受外部控制,因此无法像List那样确定哪个元素位于Set的头部或者尾部
public byte[] spop(final String key);
/*
* 原子性的将参数中的成员从srckey键移入到dstkey键所关联的Set中。因此在某一时刻,该成员或者出现在source中,或者出现在dstkey中
* 如果该成员在srckey中并不存在,该命令将不会再执行任何操作并返回0,否则,该成员将从srckey移入到dstkey
* 如果此时该成员已经在dstkey中存在,那么该命令仅是将该成员从srckey中移出。如果和Key关联的Value不是Set,将返回相关的错误信息
*/
public boolean smove(final String srckey, final String dstkey, final String member);
// 获取Set中成员的数量
public long scard(final String key);
// 判断参数中指定成员是否已经存在于与Key相关联的Set集合中
public boolean sismember(final String key, final String member);
// 该命令将返回参数中所有Keys关联的Sets中成员的交集。因此如果参数中任何一个Key关联的Set为空,或某一Key不存在,那么该命令的结果将为空集
public List<byte[]> sinter(final String... keys);
// 该命令和sinter命令在功能上完全相同,两者之间唯一的差别是sinter返回交集的结果成员,而该命令将交集成员存储在dstkey关联的Set中。如果dstkey键已经存在,该操作将覆盖它的成员
public void sinterstore(final String dstkey, final String... keys);
// 该命令将返回参数中所有Keys关联的Sets中成员的并集。
public List<byte[]> sunion(final String... keys);
// 该命令和sunion命令在功能上完全相同,两者之间唯一的差别是sunion返回并集的结果成员,而该命令将并集成员存储在dstkey关联的Set中。如果dstkey键已经存在,该操作将覆盖它的成员
public void sunionstore(final String dstkey, final String... keys);
/*
* 返回参数中第一个Key所关联的Set和其后所有Keys所关联的Sets中成员的差异。如果Key不存在,则视为空Set
* 如果:
* set1:1,2,one,two,three
* set2:hello,world,1,2,4
* 则sdiff set1 set2返回:
* one,two,three
*/
public List<byte[]> sdiff(final String... keys);
// 该命令和SDIFF命令在功能上完全相同,两者之间唯一的差别是SDIFF返回差异的结果成员,而该命令将差异成员存储在dstkey关联的Set中。如果dstkey键已经存在,该操作将覆盖它的成员
public void sdiffstore(final String dstkey, final String... keys);
// 和SPOP一样,随机的返回Set中的一个成员,不同的是该命令并不会删除返回的成员
public void srandmember(final String key);
/*******************************************************************************************************************************************************/
/**
* 6.有序集合(Sorted-Sets)数据类型接口说明
*
* Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中
* 它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序
* 然而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的
* 在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数,由于Sorted-Sets中的成员在集合中的位置是有序的
* 因此,即便是访问位于集合中部的成员也仍然是非常高效的。
* 事实上,Redis所具有的这一特征在很多其它类型的数据库中是很难实现的,换句话说,在该点上要想达到和Redis同样的高效,在其它数据库中进行建模是非常困难的
*/
/*
* 在该命令中我们可以指定多组score/member作为参数。如果在添加时参数中的某一成员已经存在,该命令将更新此成员的分数为新值,同时再将该成员基于新值重新排序
* 如果键不存在,该命令将为该键创建一个新的Sorted-Sets Value,并将score/member对插入其中
* 如果该键已经存在,但是与其关联的Value不是Sorted-Sets类型,相关的错误信息将被返回
*/
public boolean zadd(final String key, final double score, final String member);
// 该命令将移除参数中指定的成员,其中不存在的成员将被忽略。如果与该Key关联的Value不是Sorted-Set,相应的错误信息将被返回
public boolean zrem(final String key, final String... members);
/*
* 该命令将为指定Key中的指定成员增加指定的分数。如果成员不存在,该命令将添加该成员并假设其初始分数为0,此后再将其分数加上increment
* 如果Key不存在,该命令将创建该Key及其关联的Sorted-Sets,并包含参数指定的成员,其分数为increment参数
* 如果与该Key关联的不是Sorted-Sets类型, 相关的错误信息将被返回
*/
public Double zincrby(final String key, final double score, final String member);
// Sorted-Set中的成员都是按照分数从低到高的顺序存储,该命令将返回参数中指定成员的位置值,其中0表示第一个成员,它是Sorted-Set中分数最低的成员
public long zrank(final String key, final String member);
// 该命令的功能和zrank基本相同,唯一的差别在于该命令获取的索引是从高到低排序后的位置,同样0表示第一个元素,即分数最高的成员
public long zrevrank(final String key, final String member);
/*
* 该命令按顺序返回在参数start和stop指定范围内的成员,这里start和stop参数都是0-based,即0表示第一个成员,-1表示最后一个成员
* 如果start大于该Sorted-Set中的最大索引值,或start > stop,此时一个空集合将被返回
* 如果stop大于最大索引值,该命令将返回从start到集合的最后一个成员
* 如果命令中带有可选参数withscores选项,则在返回的结果中将包含每个成员的分数值,如value1, score1, value2, score2...
*/
public List<byte[]> zrange(final String key, final long start, final long end);
// 该命令的功能和zrange基本相同,唯一的差别在于该命令是通过反向排序获取指定位置的成员,即从高到低的顺序。如果成员具有相同的分数,则按降序字典顺序排序
public List<byte[]> zrevrange(final String key, final long start, final long end);
/*
* 该命令将按照score(在min和max之间)的值返回从小到大排序的集合,即满足表达式min <= score <= max的成员
* 如果成员具有相同的分数,则按成员的字典顺序返回。该命令将同时返回score值,如value1, score1, value2, score2...
* 注意:这里检索的范围为score
*/
public List<byte[]> zrangeWithScores(final String key, final long start, final long end);
// 该命令除了排序方式是基于从高到低的分数排序之外,其它功能和参数含义均与zrangeWithScores相同
public List<byte[]> zrevrangeWithScores(final String key, final long start, final long end);
/*
* 该命令与zrange类似,将按照score(在min和max之间)的值返回从小到大排序的集合,即满足表达式min <= score <= max的成员
* 如果命令中带有可选参数withscores选项,则在返回的结果中将包含每个成员的分数值,如value1, score1, value2, score2...
*/
public List<byte[]> zrangeByScore(final String key, final double min, final double max);
public List<byte[]> zrangeByScore(final String key, final String min, final String max);
// 该命令与zrangeByScore类似,但可以通过offset与count方式进行分页
public List<byte[]> zrangeByScore(final String key, final double min, final double max, final int offset, int count);
/*
* 该命令将按照score(在min和max之间)的值返回从小到大排序的集合,即满足表达式min <= score <= max的成员
* 如果成员具有相同的分数,则按成员的字典顺序返回。该命令将同时返回score值,如value1, score1, value2, score2...
* 注意:这里检索的范围为score
*/
public List<byte[]> zrangeByScoreWithScores(final String key, final double min, final double max);
// 该命令与zrangeByScoreWithScores类似,但可以通过offset与count方式进行分页
public List<byte[]> zrangeByScoreWithScores(final String key, final double min, final double max, final int offset, final int count);
// 获取与该Key相关联的Sorted-Sets中包含的成员数量
public long zcard(final String key);
// 获取指定Key的指定成员的分数
public Double zscore(final String key, final String member);
// 获取指定Key的指定成员的分数
public void watch(final String... keys);
// 给指定的Key的成员排序
public Sort sort(final String key);
public Sort sort(final String key, final SortingParams sortingParameters, final String dstkey);
public Sort sort(final String key, final String dstkey);
public void blpop(final String[] args);
public void brpop(final String[] args);
// 该命令用于获取分数(score)在min和max之间的成员数量
public long zcount(final String key, final double min, final double max);
public long zcount(final String key, final String min, final String max);
public void zremrangeByRank(final String key, final long start, final long end);
public void zremrangeByScore(final String key, final double start, final double end);
public void zremrangeByScore(final String key, final String start, final String end);
public void zunionstore(final String dstkey, final String... sets);
public void zunionstore(final String dstkey, final ZParams params, final String... sets);
public void zinterstore(final String dstkey, final String... sets);
public void zinterstore(final String dstkey, final ZParams params, final String... sets);
/*******************************************************************************************************************************************************/
/**
* 7.服务器相关命令
*
*/
// 将数据同步保存到磁盘
public void save();
// 将数据同步保存到磁盘
public void bgsave();
// 返回上次成功将数据保存到磁盘的Unix时戳
public void lastsave();
// 将数据同步保存到磁盘,然后关闭服务
public void shundown();
// 服务连接测试
public void ping();
}
感谢支持
更多内容,请移步《超级个体》。