【redis】Jedis 操作 Redis 基础指令(上)
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