memcached是款优秀的分布式缓存工具。spymemcached的底层实现NIO.从众多招聘网站,看出NIO是众多公司的硬性要求了。研究下spymemcached源码,对开发工程师提高自身NIO功底是非常不错的实践。

1.剖析MemcachedConnection 对象

    1.1类图

(番外篇)spymemcached源码分析_第1张图片


 MemcachedConnection -是spymemcached的核心组件,表示到多台 mc 节点的连接 。本身是个线程对象。负责处理操作请求。

MemcachedConnection 若干重要属性:

    shouldOptimize - 是否需要优化多个连续的get操作 --> gets 默认true

    addedQueue - 用来记录排队到节点的操作

    selector - 监控到多个 mc 服务器的读写事件

    locator - 定位某个 mc 服务器


MemcachedClient :是对外提供的API,底层实现主要由MemcachedConnection 提供。

MemcachedClient若干重要属性:

    mconn - MemcachedConnection 

    opFact - 操作工厂

    transcoder - ×××

    tcService - 解码线程池服务

    connFactory - 连接工厂

Operation - 所有操作的基本接口。MemcachedConnection与MemcachedNode的信息传递单元。一个相同的操作分别按照不同协议,提供不同实现。



2.剖析MemcachedNode对象‘

(番外篇)spymemcached源码分析_第2张图片


MemcachedNode:定义到 单个memcached 服务器的连接。与配合NIO ,负责具体请求处理。

主要实现: 

  TCPMemcachedNodeImpl -   

        AsciiMemcachedNodeImpl - 

        BinaryMemcachedNodeImpl -

主要属性:

    socketAddress - 服务器地址  

    rbuf - 读缓冲区 默认大小 16384

    wbuf - 写缓冲区 默认大小 16384

    writeQ - 写队列

    readQ - 读队列

    inputQueue - 输入队列 memcachclient添加操作时先添加到 inputQueue中

    opQueueMaxBlockTime - 操作的最大阻塞时间 默认10秒

    reconnectAttempt - 重连尝试次数 volatile

    channel - socket 通道

    toWrite - 要向socket发送的字节数

    optimizedOp - 优化后的Operation 实现类是OptimizedGetImpl

       sk - channel注册到selector后的key

    shouldAuth - 是否需要认证 默认 false

 authLatch - 认证需要的Latch

    reconnectBlocked - 

    defaultOpTimeout - 操作默认超时时间 默认值 2.5秒

    continuousTimeout - 连续超时次数

    opFact - 操作工厂


NodeLocator - 根据 key hash 值查找节点  

    ArrayModNodeLocator - hash 值和节点列表长度取模,作为下标,简单的数组查询

    KetamaNodeLocator - Ketama一致性hash的实现

3.处理序列图


3.1操作请求写入

(番外篇)spymemcached源码分析_第3张图片


3.2 请求处理过程


(番外篇)spymemcached源码分析_第4张图片


当然复杂的协议解析,需要去看Operation接口相关。

由于spymemcached底层使用的NIO技术,阅读之前需要清除NIO几个重要概念,buffer,Selector,SelectKey。个人理解就是循环遍历SelectKey,来回注册事件,分别调用write和read方法。

一个普通的命令,粗略分为四个阶段:

(1)Connection state changed(建立连接)

(2) Transitioned state from WRITE_QUEUED to WRITING

(3)Transitioned state from WRITING to READING

(4)Transitioned state from READING to COMPLETE

结论

简单的整理成图,有个统一概念。NIO很容易理解,但难点是因为异步不好跟踪。

具体细节,结合其他资源。

http://my.oschina.net/yychao/blog/99873

http://my.oschina.net/astute/blog/93492