关键词:
接上文《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高可用,重点注意以下方面
node节点与key的对应关系
node节点之间的数据复制
node节点心跳探测
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所采用的数据结构非常简单:线性连续空间,它是由两个迭代... 查看详情