`
guazi
  • 浏览: 53412 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

基于memcached client for java的cache封装

    博客分类:
  • java
阅读更多

 

最近为公司开发一个缓存组件,就研究了一下memcached服务器,使用的java客户端是:memcached client for javahttps://github.com/gwhalin/Memcached-Java-Client2.5.3。在client的基础上进行了再次封装,实现了两个缓存:通用分布式缓存(CommonCache)和集群分布式缓存(ClusterCache)。(注意:memcached服务器需要自己安装部署,我用的最新版1.4.5 http://memcached.org/

对于memcached的客户端初始化在CacheFactory中通过读取配置文件cacheConfig.xml完成。通用分布式缓存,只是一个简单的封装,利用memcached client for java提供的分布式支持来实现,这里主要说一下clusterCache的实现思想:对存入的缓存对象的key值进行一次hash,找到对应的服务器存入,然后根据一定的规则再次进行hash,找到另外一个不同的服务器存入,取缓存时,先对要取的key值进行一次hash,找到主服务器,如果获取失败或者获取到的值为null,就对key进行再次hash,找到其从服务器,从这台服务器取缓存结果(如果取到结果就异步的更新到主服务器),这样就形成了主从式集群缓存。特点是:没有绝对的主节点和从节点,正常情况下所有服务器共同承担缓存服务器,在一台服务器出现异常时其他服务器共同承担增加的访问压力。

拓扑结构如下:

拓扑结构

这里对ClusterCache.java 中的set方法做简要分析:

//把数据放入缓存,如果与key对应的缓存值已存在,则替换
public boolean set(String key, T value) {
		if (key == null) {
			return false;
		}
		key = base + key;//这里对key值做了一个简单的处理,请忽略之...
		boolean result = false;
		if (pool.getServers().length < 2) {//如果只设置了一个服务器,则直接存入
			result = memCachedClient.set(key, value);
		} else {
			int hashCode = HashCodeUtil.getHash(key);//一次hash算法

			result = memCachedClient.set(key, value, hashCode);//存入主服务器
			
			hashCode = getRehashCode(key, hashCode);//二次hash算法
			memCachedClient.set(key, value, hashCode);//存入从服务器

			
		}
		return result;
	}

//rehash方法
private int getRehashCode(String key, int oldHashcode) {
		String host = pool.getHost(key, oldHashcode);//获取主服务
		int rehashTries = 0;
		
		int hashCode = HashCodeUtil.getHash(rehashTries + key);
		while (host.equals(pool.getHost(key, hashCode))) {//查找从服务器,直到查找到不同的一台服务器为止
			rehashTries++;
			hashCode = HashCodeUtil.getHash(rehashTries + key);
		}
		return hashCode;
	}
 

 

具体的实现代码在附件中。

  • 大小: 18.7 KB
  • 大小: 13.3 KB
4
3
分享到:
评论
10 楼 Action-人生 2017-04-01  
学习了,顶!d=====( ̄▽ ̄*)b
9 楼 guazi 2013-08-06  
Wuaner 写道
如果三个 server 那?准备改代码是吗?

不用呀,这里做二次hash是为了热备一份数据,当一台服务器宕机时,不会丢失任何数据。如果超过一台,那就丢失了他们存储数据的交集。
8 楼 Wuaner 2013-08-05  
如果三个 server 那?准备改代码是吗?
7 楼 zhang_harvey 2013-05-15  
你好,我想问下memcached-client for java的cas怎么做,如果两台服务器同时访问缓存,如何做到同步。
6 楼 guazi 2012-12-24  
jxftl520 写道
不错,我想问下,在做set时,2台服务器上的缓存内容是一样的么?


是不一样的,这个只是保证要缓存的东西在两台服务器上,具体那两个服务器,是根据算法来的,不能保证其中两台服务器一样。如果要一样,可以使用memcached的插件:repcached,这个可以为memcached做一个热备。
5 楼 jxftl520 2012-12-22  
不错,我想问下,在做set时,2台服务器上的缓存内容是一样的么?
4 楼 nimk 2011-11-22  
缺点就是额外内存开销?
3 楼 guazi 2011-06-08  
andylo25 写道
总体来说,封装得不错,但是文章介绍短了点,不够清晰,看起来比较吃力.

恩,上边只是简要说了一下算法思想,没有涉及具体算法,如果把算法部分再剖析一下可能会更好。
2 楼 andylo25 2011-06-08  
总体来说,封装得不错,但是文章介绍短了点,不够清晰,看起来比较吃力.
1 楼 guazi 2011-06-08  
怎么没人来说两句,踩顶都没关系,发个意见

相关推荐

    MemCached Cache Java Client封装优化历程.docx

    MemCached Cache Java Client封装优化历程

    MemCached Cache Java Client封装优化历程

    这里需要有点说明,很多开发者觉得Memcached是一种分布式Cache,但是其实Memcached服务端本身是单实例的,只是在客户端实现过程中可以根据存储的主键作分区存储,而这个区就是Memcached服务端的一个或者多个实例,...

    java开源包1

    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...

    JAVA上百实例源码以及开源项目源代码

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java开源包4

    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...

    java开源包101

    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...

    java开源包11

    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...

    java开源包6

    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...

    java开源包9

    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...

    JAVA上百实例源码以及开源项目

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java开源包8

    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...

    java开源包5

    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...

    java开源包10

    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...

    java开源包3

    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...

    java开源包2

    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...

    java开源包7

    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...

    Java资源包01

    google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...

    ZendFramework中文文档

    4.4.3. Zend_Cache_Backend_Memcached 4.4.4. Zend_Cache_Backend_Apc 4.4.5. Zend_Cache_Backend_ZendPlatform 5. Zend_Config 5.1. 简介 5.2. 操作理论 5.3. Zend_Config_Ini 5.4. Zend_Config_Xml 6. ...

Global site tag (gtag.js) - Google Analytics