Redis和Java之间的爱恨情仇之使用命令

介绍这些Redis的命令在代码中的操作,挑选一些有代表性的命令,我相信jedis的命令和Redis客户端的命令大差不差!

命令

get/set

public static void test1(Jedis jedis) {
        //先清空数据库,来避免上一组测试带来的影响
        jedis.flushAll();

        jedis.set("key","111");
        jedis.set("key2","222");

        String str1 = jedis.get("key");
        System.out.println(str1);
}

同时还可以添加参数

public static void test1(Jedis jedis) {
        //先清空数据库,来避免上一组测试带来的影响
        jedis.flushAll();

        SetParams setParams = new SetParams();
        setParams.ex(10);
        setParams.xx();
        jedis.set("key","111",setParams);
        jedis.set("key2","222");

        String str1 = jedis.get("key");
        System.out.println(str1);
}

exists

public static void test2(Jedis jedis) {
        jedis.flushAll();
        jedis.set("key","111");
        jedis.set("key2","222");

        System.out.println(jedis.exists("key"));
}

del

public static void test2(Jedis jedis) {
        jedis.flushAll();
        jedis.set("key","111");
        jedis.set("key2","222");

        System.out.println(jedis.exists("key"));
        long str1 = jedis.del("key");
        System.out.println(str1);
}

同样支持删除多个key操作

public static void test2(Jedis jedis) {
        jedis.flushAll();
        jedis.set("key","111");
        jedis.set("key2","222");

        System.out.println(jedis.exists("key"));
        long str1 = jedis.del("key");
        System.out.println(str1);
        System.out.println(jedis.del("key", "key2"));
}

Question:C语言都支持变长参数列表了,C++肯定更支持了啊,为啥C++的redis-plus-plus没有采取变长参数列表,来实现对应的接口呢?


Answer:Java这里的变长参数列表,是要求变长参数必须是相同类型的,是带有类型检查的,printf这块虽然给出的参数类型可能不同,但是Java中也可以进行对于的类型检查(付出一些运行时开销)

C++的变长参数列表,是没有类型检查的,全凭我们自觉,C++更倾向于能在编译期检查以及自己发现问题

keys

private static void test3(Jedis jedis) {
        jedis.flushAll();

        jedis.set("key", "value");
        jedis.set("key2", "value");
        jedis.set("key3", "value");
        jedis.set("key4", "value");

        Set<String> set = jedis.keys("*");
        //Redis中的key不能重复,而且也不在意顺序
}

Question:为啥Java中直接返回了一个集合类(对于C++中的容器),而C++要搞的那么复杂,搞个迭代器之类的?


Answer:考虑到Java和C++的语法区别,有两方面原因

  1. 和C兼容
  2. 极致的性能

当C++中使用插入迭代器来作为获取返回值的结果的时候,就留下了更多的可能性;假设,现在有多组redis服务器,redis客户端,需要获取到这N个redis服务器中所有的key,最终汇总到一起

  1. 按照Java的写法:分别针对N个服务器,调用N次keys,然后得到N个set,再把这些set合并到一起去
  2. 按照C++的写法,分别针对N个服务器,调用N次keys,但是这N次keys的结果,可以使用同一个插入迭代器,往同一个容器中插入(相比于上面的Java的实现,少了一步合并的操作)

性能是极致了,但是代码写起来就更麻烦一些(开发效率受到影响了)

expire / ttl

 private static void test4(Jedis jedis) {
        jedis.flushAll();

        jedis.set("key", "value");
        jedis.expire("key", 10);

        System.out.println(jedis.ttl("key"));
}

强制休眠,来查看ttl命令的效果

private static void test4(Jedis jedis) throws InterruptedException {
        jedis.flushAll();

        jedis.set("key", "value");
        jedis.expire("key", 10);

        Thread.sleep(3000);
        System.out.println(jedis.ttl("key"));
}

type

private static void test5(Jedis jedis) {
        jedis.flushAll();
        
        jedis.set("key", "value");
        System.out.println(jedis.type("key"));
}

private static void test5(Jedis jedis) {
        jedis.flushAll();

        jedis.set("key", "value");
        System.out.println(jedis.type("key"));

        jedis.lpush("key1", "value", "value2", "value3");
        System.out.println(jedis.type("key1"));

        jedis.hset("key2", "value", "value2");
        System.out.println(jedis.type("key2"));

        jedis.sadd("key3", "value1", "value2", "value3");
        System.out.println(jedis.type("key3"));

        jedis.zadd("key4",10,"haha");
        System.out.println(jedis.type("key4"));
}

这些就是比较典型的命令啦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值