您的位置:首页 > 数据库 > Redis

关于redis的python客户端程序

2015-09-03 22:35 393 查看
redis也算是一个老东西了,2012就已经广泛使用了,目前公司实习的时候,整体的项目架构也使用redis存储hot news之类的,最近乘着放假,把源代码分析了一遍,大概的写一下。


阅读代码的时候,主要分成两个看:



redis-py : python 写的客户端

hiredis : c语言实现的客户端

为了提升python的客户端运行速度,当然首先选择hiredis啦,主要涉及到HiredisParser和PythonParser 两个部分,HiredisParser使用的底层的connection、 io、response 则是由hiredis提供的。



>

先看纯python代码 :



为了提升多个客户端的性能,使用了分布式的共享锁,主要是两个类: Lock 和 LuaLock(这个使用的是lua脚本实现的)

通信使用了socket进行,自己实现了 SocketBuffer , 读socket,并且放入缓冲,提升性能( SocketBuffer = 来源是socket的缓冲设计)。

而真正的socket的管理,是connection进行处理的,connection保存了socket的host、pid 、keep alive等性质,继承connection的还有SSLConnection( 基于握手的connection)、UnixDomainSocketConnection(基于unix域的连接), 显然,为了提升新能,ConnectionPool可以更好的复用connection,降低create和delete的开销,还有线程安全的实现 BlockingConnectionPool。

获取socket数据并进行命令解析的,是PythonParser和HiredisParser,读取数据,并按规定解析到相应的数据

redis客户端: StrictRedis 和 Redis(后向兼容而设计的),提供命令接口

PubSub : 提供redis的发布、订阅模型,def listen(self)使用了一个循环,进行监听,采用yield 生成器模型, class PubSubWorkerThread(threading.Thread):

Pipeline : 批处理,class BasePipeline(object)、class StrictPipeline(BasePipeline, StrictRedis)(空的实现) 、class Pipeline(BasePipeline, Redis)(空的实现)



诶, 代码不是自己写的,讲起来毕竟简单(talk is cheap, show me the code),并且并没有使用例子跟进


再看一下,hiredis的实现:

dapters/: 各种网络库的redis适配,比如 redis官方的ae 、linux通用库glib、ivykis 、libev 、libuv、libevent、macosx 、qt

dict : 哈希字典, 冲突采用链址解决

net : 关于网络的函数的处理

sds : 对字符串的处理,避免了长度等耗时操作以及’\0’的截断, 看一下定义

struct sdshdr {

int len;

int free;

char buf[];

};

async :异步处理相关,像回调函数链表、redis异步连接的上下文等

read : 读取相关, redisReader 和 redisReaderTask 优化读取操作

hiredis : redisReply、 redisContext相关的连接的操作


代码是工作的时候,粗粗的浏览的一下,具体的代码运行,还没有理解的很透彻,后面需要慢慢嚼。

徐建海
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: