Memcached之服务器端简单介绍了Memcached的Server功能,了解Memcached的服务器端负责数据的存储和cache的失效管理。对Memcached来说,它的理念非常简单,一半逻辑在服务器,一半逻辑在客户端。那么作为它的客户端,对分布式来说需要实现几个功能:Memcached的协议实现,支持数据编码、解码,路由和sharding, 服务器状态的管理,以及失效的转移。
简介
在Memcached的Java客户端中,最常用的为SpyMemcached和XMemcached。笔者将这两种客户端做了个对比:
功能特点 | Spymemcached | Xmemcached |
---|---|---|
网络传输 | Nio | Nio |
协议 | binary, ASCII | binary, ASCII, Kestrel |
高可用 | 支持故障转移 | 支持fail和standby模式 |
连接池 | N | Y |
其它 | CAS操作,支持自动重连 | 支持动态增删节点,支持JMX |
客户端功能实现
网络上存在很多Spymemcached等客户端的介绍,本文就不重复了。我们今天来讨论一下,如果我们自己用Java来实现一个客户端的话,我们来看看如何设计。
- 客户端API定义
首先,作为客户端我们将为需要缓存的地方提供相关的API, 通常来说跟操作数据库一样CRUD。对缓存来说,Set与Update都是做同样的事情,所以这两个都为Set。我们拿最简单的读来进行举列:
1. get(String key) 单个的读取
2. getBulk(List<String keys> keys) 批量的读取
操作的封装
对Set, Get, Del等不同的操作,封装成不同的Command。路由/cluster
针对command的key,根据配置的hash算法,来决定选择某个或者某批server。常用的一致性hash算法。-
网络数据管理
管理配置的服务器集群,维护服务器的状态;对每个服务器都建立链接;根据路由选择的服务器,发送和接收数据。
该模块是客户端的核心和技术重点,包括:- NIO这个是毫无疑问的,其次ByteBuffer的处理,是选择heap buffer还是direct buffer, 主要涉及到数据的二次复制问题。
- 基于reactor模式的数据处理。
- 基于pipe line模型的数据流处理,包括encode/decode。
总结
Memcached客户端,主要看网络传输处理这部分。对比Spymemcached和Xmemcached来说,后者的基于Nio, reactor处理更加干净,代码清晰易读,不重复,感觉相对舒服。至于实际应用中如何选择,则根据具体的业务场景和架构具体分析了。