什么是redis管道首先看一个例子
public static void test100w(){
//第一个例子是直接用put插入
Jedis jedis = new Jedis("172.30.154.123",6379);
jedis.auth("123456");
long start = System.currentTimeMillis();
for (int i =0;i<100000;i++){
jedis.set("key1"+i,"value"+i);
}
long end = System.currentTimeMillis();
System.out.println(end-start +"----普通set耗时");
//第二个使用管道
start = System.currentTimeMillis();
Pipeline p = jedis.pipelined();
for (int i =0;i<100000;i++){
p.set("key2"+i,"value"+i);
}
p.sync();
end = System.currentTimeMillis();
System.out.println(end-start +"----管道耗时");
jedis.close(); }
我本机的执行结果是:
109539----普通set耗时
497----管道耗时
第一个直接set的,如果用多线程跑,会快一点,但是不可能达到管道这个时间。
为什么管道这么快
管道的定义:客户端可以向服务器发送多个请求,而不必等待回复,并最终在一个步骤中读取回复。
正常情况下,每个请求命令发出后client通常会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client。
那么有没有这种情况client不用读取返回结果,redis依旧可以处理新请求
。这就是管道(Pipeline)。
通过pipeline方式当有大批量的操作时候。我们可以节省很多原来浪费在网络延迟的时间。需要注意到是用pipeline方式打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。
打包的命令越多,缓存消耗内存也越多。所以并是不是打包的命令越多越好。
具体多少合适需要根据具体情况测试。当然,使用Pipeline需要一定的容错性。并不是所有的提交都会被成功执行,如果不能成功执行,那么会在所有提交执行之后打印错误。也就是说管道中前面命令失败,后面命令不会有影响,继续执行。
管道的其他用法
其实管道和普通的的Jedis之类一样,有相同的方法。比如set,get,hmset等等。自己去实验吧。
这里我说的是用管道去删除有相同特性的的key。
我没用代码,直接用命令行的下面两个是一样的,一个是有密码,一个是没密码连接redis而已。主要的还是keys "key*" 这里,我是删除了刚刚插入的所有开头为key的键
src/redis-cli keys "key*" | xargs src/redis-cli del
src/redis-cli -h 172.30.154.123 -p 6379 -a 123456 keys "key*" | xargs src/redis-cli -h 172.30.154.123 -p 6379 -a 123456 del
网友评论