Redis如何使用pipeline
0浏览
收藏
大家好,我们又见面了啊~本文《Redis如何使用pipeline》的内容中将会涉及到等等。如果你正在学习数据库相关知识,欢迎关注我,以后会给大家带来更多数据库相关文章,希望我们能一起进步!下面就开始本文的正式内容~
使用 pipeline
Redis 是基于请求-响应模型的 TCP 服务器。意味着单次请求 RTT(往返时间),取决于当前网络状况 。这会导致单个 Redis 请求可能非常快,比如通过本地环路网卡。可能非常慢,比如处于网络状况不佳的环境。
另一方面,Redis 每次请求-响应,都涉及到 read 和 write 系统调用。甚至会触发多次 epoll_wait 系统调用(Linux 平台)。这导致 Redis 不断在用户态和内核态进行切换。
static int connSocketRead(connection *conn, void *buf, size_t buf_len) {
// read 系统调用
int ret = read(conn->fd, buf, buf_len);}static int connSocketWrite(connection *conn, const void *data, size_t data_len) {
// write 系统调用
int ret = write(conn->fd, data, data_len);}int aeProcessEvents(aeEventLoop *eventLoop, int flags) {
// 事件触发,Linux 下为 epoll_wait 系统调用
numevents = aeApiPoll(eventLoop, tvp);}
那么,如何节省往返时间和系统调用次数呢?批处理是一个好的办法。
为此,Redis 提供了 「pipeline」。pipeline 的原理很简单,将多个命令打包成「一个命令」发送。Redis 收到后,解析成多个命令执行。最终将多个结果打包返回。
「pipeline 可以有效的提升 Redis 性能」。
但是,使用 pipeline 有几点需要你留意
-
「pipeline 不能保证原子性」。在一次 pipeline 命令执行期间,可能会执行其它 client 发起的命令。请记住,pipeline 只是批量处理命令。想要保证原子性,使用 MULTI 或者 Lua 脚本。
-
「单次 pipeline 命令不宜过多」。当使用 pipeline 时,Redis 会将 pipeline 命令的响应结果,暂存在内存 Reply buffer 中,等待所有命令执行完毕后返回。如果 pipeline 命令过多,可能会导致占用较多内存。可以将单个 pipeline 拆分成多个 pipeline。
以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于数据库的相关知识,也可关注golang学习网公众号。
版本声明 本文转载于:亿速云 如有侵犯,请联系 删除
- 怎么使用Python实现二分法查找
- WIN8共享打印机拒绝访问的处理方法
