列表操作
lpush/rpush 和 lpop/rpop
- 将一个或者多个元素从左/右侧放入(头/尾插)到
list
中- 依次头插
- 从
list
左/右侧取出元素(即头/尾删)
public static void test1(Jedis jedis) {
jedis.flushAll();
long n = jedis.lpush("key", "1", "2", "3", "4");
System.out.println(n);
String value = jedis.lpop("key");
System.out.println(value);
value = jedis.lpop("key");
System.out.println(value);
value = jedis.lpop("key");
System.out.println(value);
value = jedis.lpop("key");
System.out.println(value);
}
//输出结果
4
4
3
2
1
- 返回值:插入后
list
的长度
lrange
获取从 start
到 end
区间的所有元素,左闭右闭
public static void test2(Jedis jedis) {
jedis.flushAll();
jedis.rpush("key", "1", "2", "3", "4");
List<String> values = jedis.lrange("key", 1, 3);
System.out.println(values);
}
//输出结果
[2, 3, 4]
rpush
,从右往左插入
blpop
- 返回值
List
是一个二元组,[0]
表示key
,[1]
表示value
- 超时时间设为
0
表示死等 - 在执行同时,起一个
redis-cli
,插入数据,即可以看到blpop
的返回结果
**注意:**在代码中另起一个线程,直接通过当前
jedis
这个连接插入数据是不行的,必须另起一个jedis
连接
public static void test3(Jedis jedis) {
jedis.flushAll();
while(true) {
List<String> values = jedis.blpop(0, "key");
System.out.println(values);
}
}
lindex
public static void test4(Jedis jedis) {
jedis.flushAll();
jedis.rpush("key", "1", "2", "3", "4");
String value = jedis.lindex("key", 3);
System.out.println(value);
}
//输出结果
4
- 参数是元素的下标
linsert
将新元素插入到指定元素前/后
public static void test5(Jedis jedis) {
jedis.flushAll();
jedis.rpush("key", "a", "b", "c", "d");
jedis.linsert("key", ListPosition.BEFORE, "c", "100");
List<String> values = jedis.lrange("key", 0, -1);
System.out.println(values);
}
//输出结果
[a, b, 100, c, d]
BEFORE
:ListPostion.BEFORE
AFTER
:ListPPostion.BEFORE
llen
获取 list
的长度
public static void test6(Jedis jedis) {
jedis.flushAll();
jedis.rpush("key", "1", "2", "3", "4");
long n = jedis.llen("key");
System.out.println(n);
}
//返回结果
4
哈希表操作
hset 和 hget
public static void test1(Jedis jedis) {
jedis.flushAll();
jedis.hset("key", "name", "zhangsan");
jedis.hset("key", "age", "20");
String name = jedis.hget("key", "name");
System.out.println(name);
String age = jedis.hget("key", "age");
System.out.println(age);
}
//输出结果
zhangsan
20
hexists 和 hdel
public static void test2(Jedis jedis) {
jedis.flushAll();
jedis.hset("key", "name", "zhangsan");
boolean ok = jedis.hexists("key", "name");
System.out.println(ok);
jedis.hdel("key", "name");
ok = jedis.hexists("key", "name");
System.out.println(ok);
}
hdel
删除的是field
del
删除的是key
hkeys 和 hval
hkeys
:获取所有key
hval
:获取所有value
public static void test3(Jedis jedis) {
jedis.flushAll();
jedis.hset("key", "name", "zhangsan");
jedis.hset("key", "age", "20");
Set<String> keys = jedis.hkeys("key");
System.out.println(keys);
List<String> values = jedis.hvals("key");
System.out.println(values);
}
//输出结果
[name, age]
[zhangsan, 20]
hmget
一次获取 hash
中多个字段的值
public static void test4(Jedis jedis) {
jedis.flushAll();
jedis.hset("key", "name", "zhangsan");
jedis.hset("key", "age", "20");
jedis.hset("key", "gender", "man");
List<String> values = jedis.hmget("key", "name", "age", "gender", "hh", "kk");
System.out.println(values);
}
//输出结果:[zhangsan, 20, man, null, null]
hlen
获取 hash
中的所有字段的个数
public static void test5(Jedis jedis) {
jedis.flushAll();
jedis.hset("key", "name", "zhangsan");
jedis.hset("key", "age", "20");
long n = jedis.hlen("key");
System.out.println(n);
}
//输出结果:2
hincrby 和 hincrbyfloate
public static void test6(Jedis jedis) {
jedis.hset("key", "age", "20");
long n = jedis.hincrBy("key", "age", 10);
System.out.println(n);
String value = jedis.hget("key", "age");
System.out.println(value);
double dn = jedis.hincrByFloat("key", "age", 5.5);
System.out.println(dn);
value = jedis.hget("key", "age");
System.out.println(value);
}
//输出结果
30
30
35.5
35.5
集合操作
sadd 和 smembers
- 将一个或者多个元素添加到
set
中,重复的元素无法添加到set
中 - 获取一个
set
中的所有元素,**元素之间的顺序是无序的!!!
public static void test1(Jedis jedis) {
jedis.flushAll();
jedis.sadd("key", "aaa", "bbb", "ccc");
Set<String> members = jedis.smembers("key");
System.out.println(members);
}
//返回结果:[aaa, ccc, bbb]
srem 和 sismember
- 将制定的元素从
set
中删除 - 用于检查元素是否属于集合
set
中
public static void test2(Jedis jedis) {
jedis.flushAll();
jedis.sadd("key", "aaa", "bbb", "ccc");
boolean ok = jedis.sismember("key", "aaa");
System.out.println(ok);
long n = jedis.srem("key", "aaa", "bbb");
System.out.println(n);
ok = jedis.sismember("key", "aaa");
System.out.println(ok);
}
//运行结果
true
2
false
scard
获取一个 set
的基数(cardinality
),即 set
中的元素个数
public static void test3(Jedis jedis) {
jedis.flushAll();
jedis.sadd("key", "aaa", "bbb", "ccc");
long n = jedis.scard("key");
System.out.println(n);
}
//输出结果
3
sinter
获取给定 set
的交集中的元素
public static void test4(Jedis jedis) {
jedis.flushAll();
jedis.sadd("key1", "aaa", "bbb", "ccc");
jedis.sadd("key2", "aaa", "bbb", "ddd");
Set<String> results = jedis.sinter("key1", "key2");
System.out.println(results);
}
//输出结果
[aaa, bbb]
sunion
获取给定 set
的并集中的元素
public static void test5(Jedis jedis) {
jedis.flushAll();
jedis.sadd("key1", "aaa", "bbb", "ccc");
jedis.sadd("key2", "aaa", "bbb", "ddd");
Set<String> results = jedis.sunion("key1", "key2");
System.out.println(results);
}
//输出结果
[aaa, ccc, bbb, ddd]
sdiff
获取给定 set
的差集中的元素
public static void test6(Jedis jedis) {
jedis.flushAll();
jedis.sadd("key1", "aaa", "bbb", "ccc");
jedis.sadd("key2", "aaa", "bbb", "ddd");
Set<String> results = jedis.sdiff("key1", "key2");
System.out.println(results);
}
//输出结果
[ccc]
有序集合操作
zadd 和 zrange
public static void test1(Jedis jedis) {
jedis.flushAll();
jedis.zadd("key", 100, "吕布");
jedis.zadd("key", 98, "赵云");
jedis.zadd("key", 95, "典韦");
jedis.zadd("key", 92, "关羽");
jedis.zadd("key", 70, "刘备");
List<String> members = jedis.zrange("key", 0, -1);
System.out.println(members);
List<Tuple> membersWithScore = jedis.zrangeWithScores("key", 0, -1);
System.out.println(membersWithScore);
}
//输出结果
[刘备, 关羽, 典韦, 赵云, 吕布]
[[刘备,70.0], [关羽,92.0], [典韦,95.0], [赵云,98.0], [吕布,100.0]]
- 如果需要逆序输出,只要使用
ZREVRANGE
即可
zrem 和 zcard
- 删除指定元素
- 获取一个
zset
的计数,即元素个数
public static void test2(Jedis jedis) {
jedis.flushAll();
jedis.zadd("key", 100, "吕布");
jedis.zadd("key", 98, "赵云");
jedis.zadd("key", 95, "典韦");
jedis.zadd("key", 92, "关羽");
jedis.zadd("key", 70, "刘备");
long n = jedis.zcard("key");
System.out.println(n);
n = jedis.zrem("key", "吕布", "赵云");
System.out.println(n);
n = jedis.zcard("key");
System.out.println(n);
}
//输出结果
5
2
3
zrem
返回的是删除成功的元素个数
zcount
返回分数在 min
和 max
之间元素的个数,默认情况下 min
和 max
都是包含的,可以通过 ()
排除
public static void test3(Jedis jedis) {
jedis.flushAll();
jedis.zadd("key", 100, "吕布");
jedis.zadd("key", 98, "赵云");
jedis.zadd("key", 95, "典韦");
jedis.zadd("key", 92, "关羽");
jedis.zadd("key", 70, "刘备");
long n = jedis.zcount("key", 92, 98);
System.out.println(n);
}
//输出结果
3
- 闭区间
zpopmax 和 zpopmin
删除并返回分数最高/最低的 count
个元素
public static void test4(Jedis jedis) {
jedis.flushAll();
jedis.zadd("key", 100, "吕布");
jedis.zadd("key", 98, "赵云");
jedis.zadd("key", 95, "典韦");
jedis.zadd("key", 92, "关羽");
jedis.zadd("key", 70, "刘备");
Tuple tuple = jedis.zpopmax("key");
System.out.println(tuple);
tuple = jedis.zpopmin("key");
System.out.println(tuple);
}
//返回结果
[吕布,100.0]
[刘备,70.0]
zrank
- 获取指定
member
的下标
public static void test5(Jedis jedis) {
jedis.flushAll();
jedis.zadd("key", 100, "吕布");
jedis.zadd("key", 98, "赵云");
jedis.zadd("key", 95, "典韦");
jedis.zadd("key", 92, "关羽");
jedis.zadd("key", 70, "刘备");
long n = jedis.zrank("key", "赵云");
System.out.println(n);
n = jedis.zrevrank("key", "赵云");
System.out.println(n);
}
//输出结果
3
1
- 分别是从前往后和从后往前
zscore
- 返回指定元素的分数
public static void test6(Jedis jedis) {
jedis.flushAll();
jedis.zadd("key", 100, "吕布");
jedis.zadd("key", 98, "赵云");
jedis.zadd("key", 95, "典韦");
jedis.zadd("key", 92, "关羽");
jedis.zadd("key", 70, "刘备");
double score = jedis.zscore("key", "赵云");
System.out.println(score);
}
//输出结果
98.0
zincrby
public static void test7(Jedis jedis) {
jedis.flushAll();
jedis.zadd("key", 100, "吕布");
double n = jedis.zincrby("key", 10, "吕布");
System.out.println(n);
n = jedis.zincrby("key", -20, "吕布");
System.out.println(n);
}
//输出结果
110.0
90.0
zinterstore
求交集,结果保存到另一个 key
中
public static void test8(Jedis jedis) {
jedis.flushAll();
jedis.zadd("key1", 100, "吕布");
jedis.zadd("key1", 98, "赵云");
jedis.zadd("key1", 95, "典韦");
jedis.zadd("key2", 100, "吕布");
jedis.zadd("key2", 98, "赵云");
jedis.zadd("key2", 92, "关羽");
long n = jedis.zinterstore("key3", "key1", "key2");
System.out.println(n);
List<Tuple> tuples = jedis.zrangeWithScores("key3", 0, -1);
System.out.println(tuples);
}
//输出结果
2
[[赵云,196.0], [吕布,200.0]]
- 将
key1
和key2
中交集部分,放到key3
中
总结
Jedis
这个库的本质就是针对 redis
的各种命令进行封装。调用某个方法,就相当于在 redis
客户端中敲下了对应的命令