(番外篇)spymemcached源码分析

简介:

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

1.剖析MemcachedConnection 对象

    1.1类图

wKiom1e1fNmSFXvfAAEwammqb4g683.png


 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对象‘

wKiom1e1gAez6zFMAADj60gau40798.png


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操作请求写入

wKiom1e1gUmiTIuFAACTFz2W-N8434.png


3.2 请求处理过程


wKiom1e6vsTgxgMRAAC8EdyLzBQ799.png


wKiom1e6ys6il0IVAAEHYLPMiAw915.png

当然复杂的协议解析,需要去看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




本文转自 randy_shandong 51CTO博客,原文链接:http://blog.51cto.com/dba10g/1840065,如需转载请自行联系原作者

相关文章
|
3月前
|
存储 Java 调度
从零开始学习 Java:简单易懂的入门指南之线程池(三十六)
从零开始学习 Java:简单易懂的入门指南之线程池(三十六)
|
3月前
|
存储 Java
从零开始学习 Java:简单易懂的入门指南之Map集合(二十三)
从零开始学习 Java:简单易懂的入门指南之Map集合(二十三)
|
3月前
|
Java 调度
从零开始学习 Java:简单易懂的入门指南之多线程(三十四)
从零开始学习 Java:简单易懂的入门指南之多线程(三十四)
|
5月前
|
Java 数据库连接 数据库
源码分析系列教程(完) - 终章总结
源码分析系列教程(完) - 终章总结
27 0
源码分析系列教程(完) - 终章总结
|
3月前
|
Java
从零开始学习 Java:简单易懂的入门指南之HashMap及TreeMap源码解读(二十四)
从零开始学习 Java:简单易懂的入门指南之HashMap及TreeMap源码解读(二十四)
|
3月前
|
Java
从零开始学习 Java:简单易懂的入门指南之线程同步(三十五)
从零开始学习 Java:简单易懂的入门指南之线程同步(三十五)
|
4月前
|
SQL Kubernetes Java
深度剖析FlinkX(纯钧)源码
深度剖析FlinkX(纯钧)源码
80 0
|
5月前
|
XML 安全 数据库连接
温故知新-源码分析篇
温故知新-源码分析篇
22 0
|
6月前
|
Dart 安全 开发者
带你读《深入浅出Dart》二十、空安全
带你读《深入浅出Dart》二十、空安全
|
存储 缓存 前端开发
【ClassLoader】深入浅出的核心源码分析|周末学习
【ClassLoader】深入浅出的核心源码分析|周末学习
127 0
【ClassLoader】深入浅出的核心源码分析|周末学习