memcache-client-forjava源码分析之memcachedcachemanager

author author     2022-08-01     155

关键词:

接上文《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.其他


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


本文出自 “简单” 博客,请务必保留此出处http://dba10g.blog.51cto.com/764602/1843007

rxjava源码解析-线程切换源码(代码片段)

Rxjava源码解析系列:Rxjava源码解析(一)-subscribe源码Rxjava源码解析(二)-线程切换源码Rxjava源码解析(三)-Schedulers默认线程池概述前文已经讲了rxjava简单subscribe的源码,有兴趣的读者可以看下。Rxjava源码解析(一)-subscribe源码本... 查看详情

源码分析rocketmq系列索引

1、RocketMQ源码分析之NameServer2、RocketMQ源码分析之Broker概述与同步消息发送原理与高可用设计及思考3、源码分析RocketMQ之CommitLog消息存储机制4、源码分析RocketMQ之消息消费5、源码分析RocketMQ消息消费机制----消费者拉取消息机制6、... 查看详情

源码案例

学习vue实现双向绑定【附源码下载地址】自己动手写100行Python代码抢火车票!【附源码下载地址】100+套小程序源码案例,你要收藏好了!【源码案例】一颗基于HTML5Canvas的动画特效树【源码实例】jQuery万年历插件带农历老皇历功... 查看详情

如何分析springboot源码模块及结构?--springboot源码

注:该源码分析对应SpringBoot版本为2.1.0.RELEASE1前言本篇接如何搭建自己的SpringBoot源码调试环境?--SpringBoot源码(一)。前面搭建好了自己本地的SpringBoot源码调试环境后,此时我们不要急着下手进入到具体的源码调试细节中,刚... 查看详情

js基础源码学习backbone源码阅读

最近看完了backbone.js的源码,这里对于源码的细节就不再赘述了,大家可以star我的源码阅读项目(https://github.com/JiayiLi/source-code-study)进行参考交流,有详细的源码注释,以及知识总结,同时google一下backbone源码,也有很多优秀... 查看详情

vector源码1(参考stl源码--侯捷)

vector源码1(参考STL源码--侯捷)vector源码2(参考STL源码--侯捷)vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效vector概述Vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间纳入新元素,vector的使用效率,关键... 查看详情

list源码4(参考stl源码--侯捷):transfersplicemergereversesort(代码片段)

list源码1(参考STL源码--侯捷):list节点、迭代器、数据结构list源码2(参考STL源码--侯捷):constructor、push_back、insertlist源码3(参考STL源码--侯捷):push_front、push_back、erase、pop_front、pop_back、clear、remove、uniquelist源码4(参考STL源码--侯捷):... 查看详情

js基础源码学习backbone源码阅读

最近看完了backbone.js的源码,这里对于源码的细节就不再赘述了,大家可以star我的源码阅读项目(https://github.com/JiayiLi/source-code-study)进行参考交流,有详细的源码注释,以及知识总结,同时google一下backbone源码,也有很多优秀... 查看详情

js基础源码学习backbone源码阅读

最近看完了backbone.js的源码,这里对于源码的细节就不再赘述了,大家可以star我的源码阅读项目(https://github.com/JiayiLi/source-code-study)进行参考交流,有详细的源码注释,以及知识总结,同时google一下backbone源码,也有很多优秀... 查看详情

flutterdio源码分析--深度剖析

文章系列FlutterDio源码分析(一)--Dio介绍FlutterDio源码分析(二)--HttpClient、Http、Dio对比FlutterDio源码分析(三)--深度剖析FlutterDio源码分析(四)--封装视频系列FlutterDio源码分析(一)--Dio介绍视频教程FlutterDio源码分析(二)--HttpClient、Http、Dio... 查看详情

jquery源码分析:源码结构与核心函数

jQuery源码分析-03构造jQuery对象-源码结构和核心函数jQuery.fn和jQuery.prototype区别  查看详情

androidkillsamli2_class未找到apk源码

参考技术Abbsmaxandroidkiller未找到对应的apk源码解决AndroidKillerAPK反编译失败,无法继续下一步源码反编译!查看安卓APK源码破解如何查看华为EMUI系统APK源码?MybatisMapper接口是如何找到实现类的-源码分析Android动态方式破解apk前奏篇(... 查看详情

eco源码|gec源码|挖矿源码|eco系统|gec程序

ECO源码|GEC源码|挖矿源码|eco系统|gec程序在最近一年的时间里,各种国产的资金盘疯狂的出现,其实看见有很多做的比较成功的,比如eco|gec都做得比较好!在今年1月的时候,当时我也有冲动想尝试着做一个虚拟币的平台。与自己... 查看详情

mesos源码分析

Mesos源码分析(1):Mesos的启动过程总论Mesos源码分析(2):MesosMaster的启动之一Mesos源码分析(3):MesosMaster的启动之二Mesos源码分析(4)MesosMaster的启动之三Mesos源码分析(5):MesosMaster的启动之四Mesos源码分析(6):MesosMaster的初始化Mesos源码分析(7):M... 查看详情

hadoop源码篇--client源码

一。前述今天起剖析源码,先从Client看起,因为Client在MapReduce的过程中承担了很多重要的角色。二。MapReduce框架主类代码如下:publicstaticvoidmain(String[]args)throwsException{Configurationconf=newConfiguration(true);//job作业Jobjob=Job.getInstance(con 查看详情

源码解读|sparkenv源码解读

【源码解读】|SparkEnv源码解读导读SparkEnv创建入口SparkEnv架构组件前置创建SecurityManager安全管理器创建RPCEnv环境创建SerializerManager序列化管理器创建BroadcastManager广播管理器创建mapOutputTracker创建Shuffle管理器创建动态内存管理器创建... 查看详情

rxjava源码解析-subscribe源码(代码片段)

Rxjava源码解析系列:Rxjava源码解析(一)-subscribe源码Rxjava源码解析(二)-线程切换源码Rxjava源码解析(三)-Schedulers默认线程池概述rxjava的应用还是较为广泛的,在实际项目中经常与MVP一起使用,可以使代码的可读性更高。... 查看详情

vector源码2(参考stl源码--侯捷)(代码片段)

 vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector的构造和内存管理  vector所采用的数据结构非常简单:线性连续空间,它是由两个迭代... 查看详情