memcache-client-forjava 源码分析之MemcachedCacheManager

接上文《memcache-client-forjava 源码分析之DefaultCacheImpl分析》,主要分析ICache另外一个针对Memcached缓存实现,重点实现了memcached的高可用能力。

由于底层访问复用了java_memcached-release包的实现,memcache-client-forjava只是在上层做了简单封装。本文重点分析下如何进行的封装,以提高自己的设计经验。个人认为,java_memcached-release源码阅读,比spymemcached更简单容易。spymemcached底层使用NIO,selector实现复用。而java_memcached-release使用的是pool技术实现复用。

要实现memcached高可用,重点注意以下方面

  1. node节点与key的对应关系
  2. node节点之间的数据复制
  3. node节点心跳探测
  4. cluster元配置信息管理

接下来主要从类图,数据存储,数据读取3个方面简单说明下。

1.整体类图

*Config信息:保存着解析XML元数据。在初始化时解析生成。

MemcachedCacheManager:管理元数据,提供IMemcachedCache对象聚集,以及Cluster对象关系数据。

MemcachedCache:操作memcached统一访问入口。

MemCachedClientHelper:处理Cluster与MemCachedClient关系帮助类

MemCachedClient:danga接口,所有Memcached操作均委派到它处理

ClusterProcessor:处理Node数据复制任务

2.启动序列

可以简单分为2部分:1.解析XML到*Config;2.按元数据构造对象。

3. put序列图

完成三部分工作

1)确认目标节点

2)保存数据

3)添加数据复制任务到队列。

4.get序列图

主要工作内容

1)两次获取。

2)注意,第二次获取,是否从其他节点获取数据,按照standby,active模式会有所区别。

3) 这里的standby模式不是我们理解的含义,被小坑了下。

集群的active和standby两种模式,前者速度可能在某些情况下稍慢(当key的确没有存在于集群任何一节点时,active模式会去尝试两个节点获取数据),但是具有数据恢复功能,后者速度比较快,但是没有数据恢复功能。

5.存疑

public Object get(String key)
{
   Object result = null;
   boolean isError = false;
   
   try
   {
      result = getCacheClient(key).get(key); 
   }
   catch(MemcachedException ex)
   {
      Logger.error(new StringBuilder(helper.getCacheName())
         .append(" cluster get error"),ex);
      
      isError = true;
   }
   
   
   if (result == null && helper.hasCluster())
      if (isError || helper.getClusterMode().equals
            (MemcachedClientClusterConfig.CLUSTER_MODE_ACTIVE))
   {
      List<MemCachedClient> caches = helper.getClusterCache();
      
      for(MemCachedClient cache : caches)
      {
         if (getCacheClient(key).equals(cache))
            continue;
         
         try
         {
            try
            {
               result = cache.get(key);
            }
            catch(MemcachedException ex)
            {
               Logger.error(new StringBuilder(helper.getCacheName())
                  .append(" cluster get error"),ex);
               
               continue;
            }
            //及时恢复宕机节点
            //仅仅判断另一台备份机器,不多次判断,防止效率低下
            if (helper.getClusterMode()
                  .equals(MemcachedClientClusterConfig.CLUSTER_MODE_ACTIVE) && result != null)
            {
               Object[] commands = new Object[]{CacheCommand.RECOVER,key,result};
               
               addCommandToQueue(commands);
            }
            
            break;
            
         }
         catch(Exception e)
         {
            Logger.error(new StringBuilder(helper.getCacheName())
                     .append(" cluster get error"),e);
         }

      }
   }

   return result;
}

6.其他

当然,还提供了统计,恢复功能,就不说了。

时间: 2024-08-22 19:08:27

memcache-client-forjava 源码分析之MemcachedCacheManager的相关文章

memcache 源码分析之开场白

装逼以前的一段独白:现在2018年5月5号.距离上次写技术博客还是2016好像是12月份的事情,当时离职在陪老婆考试,我算是半给陪考和半个鼓励师.呵呵..不知不觉时间到了2018年,我也来到了深圳,但由于工作一直很忙,天天加班所以少有时间再技术上继续意淫.但内心一直都想研究下MEMCACHE 的一些源码,给自己再专业上有所提升,同时也记录下自己的一些学习心得.所以才萌生了写一个系列关于MEMCACHE 源码解析的技术博客. 博客分为三个章节第一个章节主要讲解MEMCACHE 使用第二个章节主要讲

Eureka 源码分析之 Eureka Client

文章首发于微信公众号<程序员果果>地址:https://mp.weixin.qq.com/s/47TUd96NMz67_PCDyvyInQ 简介 Eureka是一种基于REST(Representational State Transfer)的服务,主要用于AWS云,用于定位服务,以实现中间层服务器的负载平衡和故障转移.我们将此服务称为Eureka Server.Eureka还附带了一个基于Java的客户端组件Eureka Client,它使与服务的交互变得更加容易.客户端还有一个内置的负载均

Docker源码分析之——Docker Client的启动与命令执行

在上文Docker源码分析之--Docker Daemon的启动 中,介绍了Docker Daemon进程的启动.Docker Daemon可以认为是一个Docker作为Server的运行载体,而真正发送关于docker container操作的请求的载体,在于Docker Client.本文从Docker源码的角度,分析Docker Client启动与执行请求的过程. Docker Client启动的流程与Docker Daemon启动的过程相仿.首先执行reexec.Init():随后解析f

elasticsearch源码分析之search模块(client端)

elasticsearch源码分析之search模块(client端) 注意,我这里所说的都是通过rest api来做的搜索,所以对于接收到请求的节点,我姑且将之称之为client端,其主要的功能我们可以简单地概括为将的数据请求发送到node,然后在对返回的结果做处理并返回给调用方,话虽如此,但是过程并非那么简单. 请求初始化 1.api的注册,上一篇已经提到了,所以的api都是通过Guice框架注册进来的,在注册的时候会在controller上将不同的url绑定到不同的handler中: co

Docker源码分析(二):Docker Client创建与命令执行

1. 前言 如今,Docker作为业界领先的轻量级虚拟化容器管理引擎,给全球开发者提供了一种新颖.便捷的软件集成测试与部署之道.在团队开发软件时,Docker可以提供可复用的运行环境.灵活的资源配置.便捷的集成测试方法以及一键式的部署方式.可以说,Docker的优势在简化持续集成.运维部署方面体现得淋漓尽致,它完全让开发者从持续集成.运维部署方面中解放出来,把精力真正地倾注在开发上. 然而,把Docker的功能发挥到极致,并非一件易事.在深刻理解Docker架构的情况下,熟练掌握Docker C

Linux c 开发 - Memcached源码分析之命令解析(2)

前言 从我们上一章<Linux c 开发 - Memcached源码分析之基于Libevent的网络模型>我们基本了解了Memcached的网络模型.这一章节,我们需要详细解读Memcached的命令解析. 我们回顾上一章发现Memcached会分成主线程和N个工作线程.主线程主要用于监听accpet客户端的Socket连接,而工作线程主要用于接管具体的客户端连接. 主线程和工作线程之间主要通过基于Libevent的pipe的读写事件来监听,当有连接练上来的时候,主线程会将连接交个某一个工作线

YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)

                        YII 框架源码分析             百度联盟事业部--黄银锋   目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 2.2.YiiBase 静态类 5 2.3.组件 6 2.4.模块 9 2.5 .App 应用   10 2.6 .WebApp 应用   11 3.系统组件 13 3.1.日志路由组件  13 3.2.Url 管理组件  15 3.3.异常

Memcached源码分析之线程模型

作者:Calix 一)模型分析 memcached到底是如何处理我们的网络连接的? memcached通过epoll(使用libevent,下面具体再讲)实现异步的服务器,但仍然使用多线程,主要有两种线程,分别是“主线程”和“worker线程”,一个主线程,多个worker线程. 主线程负责监听网络连接,并且accept连接.当监听到连接时,accept后,连接成功,把相应的client fd丢给其中一个worker线程.worker线程接收主线程丢过来的client fd,加入到自己的epol

Hadoop之HDFS原理及文件上传下载源码分析(上)

HDFS原理 首先说明下,hadoop的各种搭建方式不再介绍,相信各位玩hadoop的同学随便都能搭出来. 楼主的环境: 操作系统:Ubuntu 15.10 hadoop版本:2.7.3 HA:否(随便搭了个伪分布式) 文件上传 下图描述了Client向HDFS上传一个200M大小的日志文件的大致过程: 首先,Client发起文件上传请求,即通过RPC与NameNode建立通讯. NameNode与各DataNode使用心跳机制来获取DataNode信息.NameNode收到Client请求后,