Memcached之客户端

Memcached之服务器端简单介绍了Memcached的Server功能,了解Memcached的服务器端负责数据的存储和cache的失效管理。对Memcached来说,它的理念非常简单,一半逻辑在服务器,一半逻辑在客户端。那么作为它的客户端,对分布式来说需要实现几个功能:Memcached的协议实现,支持数据编码、解码,路由和sharding, 服务器状态的管理,以及失效的转移。

简介

在Memcached的Java客户端中,最常用的为SpyMemcached和XMemcached。笔者将这两种客户端做了个对比:

功能特点SpymemcachedXmemcached
网络传输NioNio
协议binary, ASCIIbinary, ASCII, Kestrel
高可用支持故障转移支持fail和standby模式
连接池NY
其它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算法。

  • 网络数据管理
    管理配置的服务器集群,维护服务器的状态;对每个服务器都建立链接;根据路由选择的服务器,发送和接收数据。
    该模块是客户端的核心和技术重点,包括:

    1. NIO这个是毫无疑问的,其次ByteBuffer的处理,是选择heap buffer还是direct buffer, 主要涉及到数据的二次复制问题。
    2. 基于reactor模式的数据处理。
    3. 基于pipe line模型的数据流处理,包括encode/decode。

《Memcached之客户端》 架构图片

总结

Memcached客户端,主要看网络传输处理这部分。对比Spymemcached和Xmemcached来说,后者的基于Nio, reactor处理更加干净,代码清晰易读,不重复,感觉相对舒服。至于实际应用中如何选择,则根据具体的业务场景和架构具体分析了。

    原文作者:落日无风
    原文地址: https://www.jianshu.com/p/ba18be431b66
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞