现成的分布式K/V缓存已经有很多的实现,最主要的比如redis,memcached,couchbase。那为什么我们还要自己去实现呢,在我们解决了分布式系统下大量rpc调用导致的高延时后,我们发现很多服务需要大量的访问分布式缓存,由于分布式缓存通常部署在单独的服务器中,在lan中,通常单次网络也需要1ms,一个请求少的可能需要一两次缓存访问,复杂的服务比如委托、出入金、融资等会访问一二十次,即使程序已经优化,但仅访问分布式缓存花费的网络延时占据了整个响应时间的很大一部分比例,而这些需要广泛被访问的数据通常数据量本身并不大,因此我们将其优化为本地缓存,而使用本地缓存需要解决各应用服务器之间的同步问题,以及分布式系统下节点自动加入的问题。

ehcache是一种最广泛被使用的本地缓存之一,虽然其支持集群,但在分布式环境下不足以灵活,使用ehcache作为分布式系统下缓存的相关不足之处可参考http://blog.sina.com.cn/s/blog_6151984a0101816j.html,另外新的节点加入后如何同步过去也是个问题,很有可能类似于Galera的SST机制。

基于上述考虑,我们不得已自行实现一种解决上述问题的分布式系统下JVM缓存同步实现。

使用手册
0、总体的设计以及需求可以参见《基于rabbitmq的分布式jvm同步方案.pptx》中的详细说明,见http://pan.baidu.com/s/1bpmfHoF。
系统依赖
1、安装rabbitmq 3.5.x。
2、基于jdk 1.7。
3、基于spring 3.2.x。

使用方法:

1、引入jar包https://gitee.com/zhjh256/dlcache
2、确保通过spring PropertyPlaceholderConfigurer注入以下三个属性
localcache.isDist,true/false,默认true,可选
localcache.publishExchanges,本节点将发布的消息所属的目标exchange列表,逗号分隔
localcache.subscribeExchanges,本节点将订阅的消息所属的目标exchange列表,逗号分隔
localcache.host,rabbitmq主机地址
localcache.port,rabbitmq主机端口
localcache.username,rabbitmq用户名
localcache.password,rabbitmq密码

Spring需要定义一个com.rabbitmq.client.ConnectionFactory实现,如下所示:
<bean id="rabbitConnectionFactory" class="com.rabbitmq.client.ConnectionFactory">
<property name="host" value="${rabbitmq.host}"></property>
<property name="port" value="${rabbitmq.port}"></property>
<property name="username" value="${rabbitmq.username}"></property>
<property name="password" value="${rabbitmq.password}"></property>
</bean>

3、缓存名为要缓存的POJO的fully qualified name比如com.hundsun.hitop.base.meta.pojo.Param,POJO必须实现CacheEntry接口

4、对于受众范围不同的缓存,划分到不同的rabbitmq exchange,具体见5。

5、缓存API说明
5.1 缓存读写接口为LocalCacheService
• CacheEntry getCacheEntry(String cacheName, String key):获取缓存条目
• boolean saveCacheEntry(String cacheName, CacheEntry cacheEntry):新增或修改缓存条目
• boolean removeCacheEntry(String cacheName, String key):删除缓存条目
• Map<String, CacheEntry> getCache(String cacheName):获取整个缓存
• boolean replaceCache(String cacheName,ConcurrentHashMap<String, CacheEntry> cache):替换整个缓存
• boolean replaceCache(String cacheName,List<CacheEntry> caches):替换整个缓存

5.2 缓存初始化接口AbstractLocalCacheInitializer,需实现List<CacheEntry> loadData()接口,因为设计时考虑的是展现层和服务层是分布式部署的,同时展现层不不能访问DB,所以在实现时为了保证RPC连接已经建立,实现了ApplicationListener接口。所以对于loadData()接口的实现,需要分两种情况:
• 如果是展现层,则通过某种RPC协议调用服务层的接口来加载数据,对于恒生T2而言,则是调用服务层的T2服务加载数据即可。
• 如果是服务层,直接实现DAO即可。

5.3 展现层->服务层分布式体系下应用启动顺序
先启动服务层,次启动展现层,否则会导致失败。

更新:j2ee分布式缓存同步实现方案dlcache v1.0.1

j2ee分布式缓存同步实现方案dlcache的更多相关文章

  1. j2ee分布式缓存同步实现方案dlcache v1.0.1

    j2ee分布式缓存同步实现方案dlcache v1.0.1 发布 修复问题: 1.支持两个层次的缓存,典型的用于产品大类.产品小类,数据字典以及子项: 更新后见: pan http://pan.bai ...

  2. j2ee分布式缓存同步实现方案dlcache v1.0.0

    现成的分布式K/V缓存已经有很多的实现,最主要的比如redis,memcached,couchbase.那为什么我们还要自己去实现呢,在我们解决了分布式系统下大量rpc调用导致的高延时后,我们发现很多 ...

  3. 分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型

    分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型   分布式缓存特性: 1) 高性能:当传统数据库面临大规模 ...

  4. NCache实现Oracle数据与分布式缓存数据同步的3个步骤

    多层次结构的应用程序是目前发展的趋势,这种程序都需要庞大的数据库支持.而数据传输的能力直接影响程序性能,成为程序可扩展性的瓶颈.因此很多开发者开始在程序中使用内存分布式缓存来提高程序性能. 同时,内存 ...

  5. 经典面试题:分布式缓存热点KEY问题如何解决--有赞方案

    有赞透明多级缓存解决方案(TMC) 一.引子 1-1. TMC 是什么 TMC ,即"透明多级缓存( Transparent Multilevel Cache )",是有赞 Paa ...

  6. Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析

    mongodb和memcached不是一个范畴内的东西.mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据.mongodb和memcached不存在谁替换谁的问题. 和 ...

  7. EhCache RMI 分布式缓存/缓存集群

    EhCache 系统简介 EhCache 是一个纯 Java 的进程内缓存框架,具有快速.精干等特点. EhCache 的主要特性有: 快速.精干 简单: 多种缓存策略: 缓存数据有两级:内存和磁盘, ...

  8. 5个强大的Java分布式缓存框架推荐

    在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓存策略考虑进去,或者并没有选择更优的 缓存策略,那么到时候重构起来将会是一个噩梦.本文主要是分享了 ...

  9. 基于redis分布式缓存实现

    Redis的复制功能是完全建立在之前我们讨论过的基 于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了Redis的复制功能,就一定会有内存快照发生,那么首先要注意你 的 ...

随机推荐

  1. GoWeb-Gin 文件上载

    前些日子,我们Node.JS了一把. 如今,我们还是回到我们伟大的GO来吧 今天,带领大家继续Golang的啦,而且是个上传文件的例子 先给大家看结果 1. 如果是windows端,你需要安装post ...

  2. cocos2d-x JS 富文本(为一段文本中的个别字体上颜色)

    setWinText : function (levelStr1,levelStr2,levelStr3,color1,color2) { var imgRankingBG = this.contai ...

  3. iOS - (多图上传已封装)

      /***  上传带图片的内容,允许多张图片上传(URL)POST**  @param url                 网络请求地址*  @param images              ...

  4. HTTP请求解析过程 (简单概括)

    1.域名解析 用户输入网址,由域名系统DNS解析输入的网址: 2.TCP的3次握手 通过域名解析出的IP地址来向web服务器发起TCP连接请求,如果3次握手通过,则与web服务端建立了可靠的连接: 3 ...

  5. python爬虫-基础入门-python爬虫突破封锁

    python爬虫-基础入门-python爬虫突破封锁 >> 相关概念 >> request概念:是从客户端向服务器发出请求,包括用户提交的信息及客户端的一些信息.客户端可通过H ...

  6. 不用ajax实现异步请求:XmlHttpRequest 小记

    视图页面代码 控制器代码

  7. CSS border-radius边框圆角

    在CSS3中提供了对边框进行圆角设定的支持,可对边框1~4个角进行圆角样式设置. 目录 1. 介绍 2. value值的格式和类型 3. border-radius 1~4个参数说明 4. 在线示例 ...

  8. python 爬取qidian某一页全部小说

      本文纯粹用于技术练习,请勿用作非法途径 import re import urllib.request from bs4 import BeautifulSoup import time url= ...

  9. 关于CTeX的几个大坑

    https://blog.csdn.net/zjutczj/article/details/53463478 最近一直忙着写小论文,毕业设计中期答辩,没有更新博客,忙过这一阵我会把这段时间学习机器学习 ...

  10. HasThisTypePatternTriedToSneakInSomeGenericOrParameterizedTypePatternMatchingStuffAnywhereVisitor

    看到的最长的类名: HasThisTypePatternTriedToSneakInSomeGenericOrParameterizedTypePatternMatchingStuffAnywhere ...