jedis
进行 redis
中的一些通用命令
- get/set
- exists
- del
- keys
- expire/ttl
- kype
接下来介绍这些redis
的命令在代码中的曹组哦,不会覆盖到所有的命令
一个优秀的库,一定是非常容易上手的
基础操作
get/set
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool; public class RedisDemo { public static void test1(Jedis jedis) { System.out.println("get 和 set 的使用"); // 先清空一下数据库,避免上一组测试的残留数据影响到下一次组测试结果 jedis.flushAll(); jedis.set("key1", "111"); jedis.set("key2", "222"); String value1 = jedis.get("key1"); String value2 = jedis.get("key2"); System.out.println("value1 = " + value1); System.out.println("value2 = " + value2); } public static void main(String[] args) { // 连接到 Redis 服务器上 JedisPool jedisPool = new JedisPool("localhost",6379); // 从 Redis 连接池中取一个连接出来 // 连接用完之后要释放,此处的释放不一定是真的关闭 TCP 连接,而是将连接放回到池子里 // 因为是在 try 后面的()里面进行取连接的,执行结束后会自动关闭 try(Jedis jedis = jedisPool.getResource()) { // Redis 的各种命令,就对应到 Jedis 对象的各种方法 test1(jedis); } }
}
- 运行结果
ex/xx/nx
params.ex(10);
params.xx();
jedis.set("key3","333", params);
ex
、xx
、nx
等指令,含义和前面我们学习的指令意思一样。不过要调用这些指令的话,需要一个额外的参数来接收这些信息,然后传到set
里面
del/exists
public static void test2(Jedis jedis) { System.out.println("exists 和 del"); jedis.flushAll(); jedis.set("key1", "111"); jedis.set("key2", "222"); System.out.println("key1 = " + jedis.get("key1")); System.out.println("key2 = " + jedis.get("key2")); boolean result = jedis.exists("key1"); System.out.println("redult1 = " + result); jedis.del("key2"); boolean result2 = jedis.exists("key2"); System.out.println("进行 del key2 操作"); System.out.println("result2 = " + result2);
}
long result2 = jedis.del("key2");
System.out.println("进行 del key2 操作");
System.out.println("result2 = " + result2);
del
的时候,返回类型是long
,返回值是 1 代表删除成功,是 0 代表删除失败
keys
public static void test3(Jedis jedis) { System.out.println("keys"); jedis.flushAll(); jedis.set("key1", "111"); jedis.set("key2", "222"); jedis.set("key3", "333"); jedis.set("key4", "444"); // redis 中的 key 不能重复,不在意顺序,所以用 set 表示 Set<String> keys = jedis.keys("*"); System.out.println(keys);
}// keys
// [key1, key2, key3, key4]
expire/ttl
public static void test4(Jedis jedis) { System.out.println("expire 和 ttl"); jedis.flushAll(); jedis.set("key1", "111"); jedis.expire("key1", 10); long time = jedis.ttl("key1"); System.out.println("time: " + time);
}// expire 和 ttl
// time: 10
- 这里由于执行速度太快,所以
ttl
一直都是10s
,我们可以让他休眠一下再执行
public static void test4(Jedis jedis) { System.out.println("expire 和 ttl"); jedis.flushAll(); jedis.set("key1", "111"); jedis.expire("key1", 10); try { Thread.sleep(4000); } catch (InterruptedException e) { throw new RuntimeException(e); } long time = jedis.ttl("key1"); System.out.println("time: " + time);
}
- 休眠
4s
type
public static void test5(Jedis jedis) { System.out.println("type"); jedis.flushAll(); jedis.set("key", "111"); String type = jedis.type("key"); System.out.println("type: " + type); // 有序集合 list(顺序很重要、可重复) jedis.lpush("key2", "111", "222", "333"); type = jedis.type("key2"); System.out.println("type: " + type); // hash,key-(filed1-value1)、(field2-value2)...... jedis.hset("key3", "f1", "111"); type = jedis.type("key3"); System.out.println("type: " + type); // 无序集合 set(顺序不重要、不可重复) jedis.sadd("key4","111", "222", "333"); type = jedis.type("key4"); System.out.println("type: " + type); // 升/降序集合(按照参数 score 来排序) jedis.zadd("key5", 10, "zhangsan"); type = jedis.type("key5"); System.out.println("type: " + type);
}type
type: string
type: list
type: hash
type: set
type: zset
字符串操作
mget 和 mset
一次操作多组键值对
public static void test1(Jedis jedis) { jedis.mset("key1", "value1","key2", "value2", "key3", "value3"); List<String> mget = jedis.mget("key1", "key2", "key3"); System.out.println(mget);
}
- 输出:
[value 1, value 2, value 3]
append
如果 key
已经存在,并且是一个 string
,命令会将 value
追加到原有 string
的后面。如果 key
不存在,则效果等同于 `set
public static void test2(Jedis jedis) { jedis.flushAll(); jedis.append("key", "aaa"); String value = jedis.get("key"); System.out.println(value); jedis.append("key", "bbb"); value = jedis.get("key"); System.out.println(value);
}// 输出结果:
aaa
aaabbb
getrange 和 setrange
getrange
:返回key
对应的string
的⼦串,由start
和end
确定(左闭右闭)。Java
中的 `substring
setrange
:从start
开始替换,直到给的字符串替换完为止
public static void test3(Jedis jedis) { jedis.flushAll(); jedis.set("key", "abcdefg"); String value = jedis.getrange("key", 1, 4); System.out.println(value); System.out.println(jedis.get("key")); jedis.setrange("key", 0, "hhh"); value = jedis.get("key"); System.out.println(value);
}//运行结果:
bcde
abcdefg
hhhdefg
setnx
不存在才能设置,存在则设置失败
public static void test4(Jedis jedis) { jedis.flushAll(); long n = jedis.setnx("key", "value"); System.out.println(n); String value = jedis.get("key"); System.out.println(value); n = jedis.setnx("key", "value2"); System.out.println(n); value = jedis.get("key"); System.out.println(value);
}//运行结果
1
value
0
value
setnx
设置成功返回1
,失败返回0
psetex
设置 key
的过期时间(单位 ms
)
psetex key 时间 value
public static void test5(Jedis jedis) { jedis.flushAll(); jedis.psetex("key", 1000, "value"); try { Thread.sleep(500); } catch (InterruptedException e) { throw new RuntimeException(e); } long ttl = jedis.pttl("key"); System.out.println(ttl);
}//运行结果
495
- 通过
sleep
休眠一段时间,可以更好的看到过期时间的变化 - 获取到的时间不一定刚好
1000-500
,因为pttl
本身也是有时间开销的
incr/decr 和 incrby/decrby
public static void test6(Jedis jedis) { jedis.flushAll(); jedis.set("key", "0"); jedis.incr("key"); System.out.println(jedis.get("key")); jedis.decr("key"); System.out.println(jedis.get("key")); jedis.incrBy("key", 10); System.out.println(jedis.get("key")); jedis.decrBy("key", 5); System.out.println(jedis.get("key"));
}//运行结果1
0
10
5