redis管道功能使用

管道概念详解

我们平常执行redis的命令都是一条一条执行,比如set aa aa,get aa。那么这个时候我们要在客户端执行两次命令才能完成任务。那么为了解决这个痛点,redis提供了一个将命令打包的功能,然后redis服务器进行批量执行这些打包好的命令。

 

在redis-cli中使用管道

好,接下来进行演示,首先我们在控制台使用。用 redis-cli这个控制台来进行命令打包。命令如下:

./redis-cli <<EOF,然后回车

 接下来就可以输入一组命令了,比如输入以下命令:

set aa AA (每输入一条命令按回车)

get aa

set bb BB

输入的命令结束后,再次输入EOF结束命令打包,然后redis就会执行这些命令。

 OK,搞定,这是一种方式执行管道命令。下面介绍第二种方式。

 

将redis命令写入一个文件来实现管道操作

也很简单,就是将redis命令写入一个文件,文件后缀名任意,一般命名为txt,我这里已经提前写好了:

 执行的命令也很简单:

./redis-cli < cmd.txt

cmd.txt 是要执行命令文件,位置以你的位置为准,我这个文件正好在redis安装目录下。我们来看下执行结果:

 

 正好再次用命令行的管道方式将key读取出来:

 大功告成。

 

那么可能很多人要问,如果我在管道命令中间某些命令执行出错会怎么办?那么接下来为你揭秘管道执行命令的原理。

 

管道执行命令原理

首先我们来了解下redis正常执行命令的过程。当多个客户端向redis发送命令的时候,比如set,get对key进行操作的命令。这些命令会首先放入redis的一个队列中。

然后redis服务器会去从队列中去取命令挨个执行。这样也就保证了redis的单线程。执行完一个命令后再次去队列中去取命令执行。

那么管道的命令也是放入队列中执行吗?是的,没错。表面上看,redis将管道命令一次性执行完毕了。其实,管道操作只是将多个命令放入到队列中了。只要放入到队列,redis在执行这些命令的时候还是会遵循执行完一个命令才继续从队列中获取下一个命令执行。

所以这样管道执行命令就有这样一个问题,他执行的命令的时候可能会被加塞。也就是中途有人插队。举个例子:

你的管道命令是这样:

set aa aa

set bb bb

可是这时候另一个客户端向redis发送了一个命令,set cc cc,这时候在redis的命令队列中可能出现的命令顺序是:

set aa aa

set cc cc

set bb bb

还有可能 set cc cc 在第一行或者最后一行,但是不可能出现 set bb 比 set aa 先执行,也就是说redis保证管道内的命令执行顺序。

那么既然是这样,对于之前提出的问题就应该有了答案。当管道内的命令出错的时候,并不会影响到其他命令,因为整个管道的命令都是挨个执行,某一个出错并不会影响到别的命令。他跟redis的事务还是有本质的区别的。

总而言之,redis管道仍然是挨个执行命令,跟你一条条redis命令执行没有区别。区别有两点:

1.管道中执行的redis命令保证顺序,但是不能保证不被加塞

2.在管道中执行redis命令,可以减少客户端和redis服务器的网络开销。因为一次性将多个命令发送到了队列中。

 

posted @ 2025-04-02 22:33  诸葛匹夫  阅读(99)  评论(0)    收藏  举报