前言
这次的内容是我自己为了总结Redis知识而扩充的,但是Redis的强大,以及适用范围之广可不是单单一篇博文就能总结清的。所以这次准备继续总结,因为第一个问题,Redis的批量操作,是我在面试过程中被真实问到的,当时没答上来,也是因为确实没了解过Redis的批量操作。
当时的问题,我还记得比较清晰:Redis执行批量操作的功能是什么?使用场景就是搞促销活动时,会做预缓存,会往缓存里放大批数据,如果直接放的话那么会很慢,怎么能提高效率呢?
Redis的批量操作-管道(pipeline)
首先Redis的管道(pipeline)并不是Redis服务端提供的功能,而是Redis客户端为了减少网络交互而提供的一种功能。
正常的一次Redis网络交互如下:
pipeline主要就是将多个请求合并,进行一次提交给Redis服务器,Redis服务器将所有请求处理完成之后,再一次性返回给客户端。
下面我们分析一下 pipeline 的原理
pipeline的一个交互过程是这样的:
-
客户端进程调用 write 命令将消息写入到操作系统内核为套接字分配的 发送缓冲区send buffer 。
-
客户端操作系统通过网络路由,将 send buffer 中的数据发送给服务器操作系统为套接字分配的接 收缓冲区 receive buffer 。
-
服务端进程调用 read 命令从 receive buffer 中取出数据进行处理,然后调用 write 命令将相应信息写入到服务端的 send buffer 中。
-
服务端操作系统通过网络路由,将 send buffer 中的数据发送给客户端操作系统的 receive buffer 。
-
客户端进程调用read命令将数据从 receive buffer 中取出进行业务处理。
在使用 pipeline 时需要注意:
-
pipeline执行的操作,和mget,mset,hmget这样的操作不同,pipeline的操作是不具备原子性的。
-
还有在集群模式下因为数据是被分散在不同的slot里面的,因此在进行批量操作的时候,不能保证操作的数据都在同一台服务器的slot上,所以集群模式下是禁止执行像mget、mset、pipeline等批量操作的,如果非要使用批量操作&