memcached是款优秀的分布式缓存工具。spymemcached的底层实现NIO.从众多招聘网站,看出NIO是众多公司的硬性要求了。研究下spymemcached源码,对开发工程师提高自身NIO功底是非常不错的实践。
1.剖析MemcachedConnection 对象
1.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对象‘
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操作请求写入
3.2 请求处理过程
当然复杂的协议解析,需要去看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