基于memcached client for java的cache封装
最近为公司开发一个缓存组件,就研究了一下memcached服务器,使用的java客户端是:memcached client for java(https://github.com/gwhalin/Memcached-Java-Client)2.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; }
具体的实现代码在附件中。
上一篇: Oauth2.0与Oauth1.0的区别
下一篇: 我的2010年
推荐阅读
-
基于memcached client for java的cache封装
-
基于memcached client for java的cache封装
-
基于SpringBoot Redis Cache,封装一个能够批量操作(查询&保存)的缓存
-
基于SpringBoot Redis Cache,封装一个能够批量操作(查询&保存)的缓存
-
Java开发桌面程序学习(三)——基于Jfoenix库的JFXDialog封装仿Android对话框的工具DialogBuilder
-
基于java nio的memcached客户端——xmemcached
-
memcached java client性能测试的几点疑问和说明 memcachedJava软件测试UP
-
memcached java client性能测试的几点疑问和说明 memcachedJava软件测试UP
-
基于java nio的memcached客户端——xmemcached