redis单线程模型及pipeline

1. redis单线程模型

redis处理数据过程

redis客户端对服务端的每次调用都经历了以下四个过程:
1. 客户端和服务端进行网络连接;
  客户端和服务器是socket通信方式,socket服务端监听可同时接受多个客户端请求,本质上与redis无关。
2. redis读写事件并向redis服务端发送数据;
  redis的客户端与服务器端通信是基于TCP连接。完成了上一个阶段的网络连接,redis客户端开始真正向服务器发起读写事件,此时redis客户端开始向建立的网络流中送数据,服务端可以理解为给每一个网络连接创建一个线程同时接收客户端的请求数据(此过程为多线程)。
3. redis服务端进行数据处理;
  服务端完成了第二阶段的数据接收,接下来开始依据接收到的数据做逻辑处理,然后得到处理后的数据。
4. 处理结果返回。
  服务端对数据处理完后,会立即将处理后的数据返回给客户端。

什么是redis的单线程

  redis会基于这些建立的连接去探测哪个连接已经接收完了客户端的请求数据(注意:不是探测哪个连接建立好了,而是探测哪个接收完了请求数据),而且这里的探测动作就是单线程的开始,一旦探测到则基于接收到的数据开始数据处理阶段,然后返回数据,再继续探测下一个已经接收完请求数据的网络连接。注意,从探测到服务端接收完数据开始处理再到数据返回,全程单线程。这就是所谓的redis单线程。

redis的单线程模式

  由于redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是redis的单线程基本模型。

2. redis pipeline

redis_conn.set("name", "zhangsan")
redis_conn.zadd("score", {val: sc for sc, val in enumerate(list("abcde"))})
redis_conn.sismember(...)

  以上代码片段执行了两个命令,也就是说通过网络发送了两次,通过网络传输就会造成网络延迟。如果使用pipeline就会简单很多了,pipeline就是把一组命令进行打包,然后一次性通过网络发送到redis,同时将执行的结果批量的返回回来

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import redis

pool = redis.ConnectionPool(host="127.0.0.1", port=6379, max_connections=32,
                            decode_responses=True)
redis_conn = redis.StrictRedis(connection_pool=pool)
redis_pipe = redis_conn.pipeline()

# 将数据写入pipeline
redis_pipe.set("name", "zhangsan")
redis_pipe.zadd("score", {val: sc for sc, val in enumerate(list("abcde"))})
redis_pipe.zrange("score", 0, -1, withscores=True)

# redis服务端数据处理
redis_pipe.execute()

注意:
   pipeline机制可以优化吞吐量,但无法提供原子性/事务保障,而这个可以通过 multi 等命令实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值