关于redis的python客户端程序

来源:互联网 发布:淘宝手机店铺宝贝分类 编辑:程序博客网 时间:2024/05/13 05:45

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相关的连接的操作

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

徐建海
0 0