现成的分布式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. css3--之backface-visibility

    使用CSS3 backface-visibility属性制作翻转动画效果:    http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/201504151 ...

  2. 第一次使用theos自己遇到的坑

    这里自己遇到的一些问题,总结一下: 第一个问题建立好theos工程后make出现 xcrun: error: SDK "iphoneos" cannot be located xc ...

  3. php 提取多维数组指定列

    前言:有时候在开发中会遇到这样的问题,我们需要把有规律的多维数组按照纵向(列)取出,有下面的方法可用: 我们将拿下面的数组来处理: 1 $arr = array( 2 '0' => array( ...

  4. 纯css瀑布流布局

    由于公司的项目需要才用到瀑布流布局 因为后台返回的json直接循环出来的,所以不能做左右浮动的那种,所以才用到了瀑布流布局 16年之前的瀑布流布局基本都时基于js或者直接用jq插件的,但是随着技术的进 ...

  5. Ecust DIV3 k进制 【暴力不断优化】

    K进制 Description 给定一个正整数n,请你判断在哪些进制下n的表示恰好有2位是1,其余位都是0. Input 输入第一行为整数TT,表示有TT组数据(1 \le T \le 50)(1≤T ...

  6. 强化学习--Policy Gradient

    Policy Gradient综述: Policy Gradient,通过学习当前环境,直接给出要输出的动作的概率值.   Policy Gradient  不是单步更新,只能等玩完一个epoch,再 ...

  7. JavaScript中直接量和变量

    标题 1.直接量 顾名思义,可以直接拿来使用的量.那哪些是直接量呢?数据类型又有很多种,因为不同类型的数据处理方式是不同的,所以数据要分类型 基本类型 1.1 String字符串 用单引号或双引号引起 ...

  8. 如何修改Xampp服务器上的mysql密码(图解)

    https://www.jb51.net/article/111289.htm https://www.cnblogs.com/Leequik/p/5323795.html 1.点击MySQL的adm ...

  9. MVC中修改Table值

    记录下: 遇到这样一个问题,表中有一个Char栏位,为1/0 ,只是在视图界面 让其显示为 开始/结束, 目前想到的两种解决办法: ①后台写查询的SQL时,直接写 SELECT a.Status, ( ...

  10. 【Redis学习之七】Redis持久化

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 redis-2.8.18 什么是持久化? 将数据从掉电易失的 ...