localcache与memcache性能比较
先来个本地缓存与memcache缓存的性能比较,有个直观上的概念
Cache
|
请求方式
|
次数
|
时间
|
平均
|
Localcache
|
hashmap中get请求
|
1亿
|
1344ms
|
0.00001344ms
|
Memcache
|
简单的get请求,不做序列化
|
1万
|
4437ms
|
0.4437ms
|
Db
|
单表查询(有索引)
|
|
|
1-2ms
|
以上测试在开发机器.生产环境采集的数据显示memcache的一次请求大约在0.2ms左右,如果存储的是java object,那算上发序列化的时间在0.5ms以上.与测试数据在同一个数量级上.
通过以上数据对比,可以得知localcache的效率比memcache高1万倍以上.这个数字让我对使用本地缓存充满了极大的兴趣.
使用localcache会带来哪些问题
localcache有着极大的性能优势,单机情况下,适当使用localcache会使程序的效率得到很大的提升.但在集群环境下localcache就存在很多问题了,主要体现在多个jvm之间cache的同步问题.
有很多框架在这上面做了很多工作,比如ehcache ,主要是通过cache复制(copy或invalidate)来解决,大概的思路是使用消息多播机制,当一个jvm中的数据做了更新操作后,首先更新本jvm内的localcache,然后广播消息,其他jvm接收到消息后更新自己的localcache. 但这种机制可能带来并发操作时出现脏数据的问题,具体见Potential Issues with Replicated Caching.
其他cache产品也遇到类似的问题,不再一一介绍.
那有没有很好的方法来解决localcache的同步问题,从而可以放心的品尝localcache这块"甜饼"呢?
这个问题我也很纠结,通过多种方案的组合及补偿机制似乎可以实现一个完美的方案.但也注定成为了一个复杂的方案.类似的方案可以有如下几种:
1.localcache作为一级缓存,通过广播的方式同步缓存,同时设置缓存过期时间,以达到数据同步和出现脏数据后自动修复的功能.
2.localcache作为一级缓存,数据更新后发送异步消息(MQ等),其余localcache订阅异步消息,并根据消息来同步缓存.
3.localcache作为一级缓存,memcache中存放缓存变更的信息,定时任务定时获取memcache的信息,并决定是否更新localcache.
4.localcache作为一级缓存,每次从memcache中获取数据更改的标记位,如果标记发生变化,更新localcache
以上的这些实现方案,都在一定程度上加大了架构的复杂性,当localcache中数据出现脏数据时,排查问题及清理数据都会变得复杂.
他人经验之谈
1.sohu早期使用广播的方式(jgroup)同步localcache,结果经常会出现脏数据的问题,在后来的架构设计上干脆摒弃了localcache(即使使用,也不再作数据同步),全部使用memcache.
2.taobao在生产环境也很少使用localcache同步,对于非敏感性数据,只是通过简单的过期策略,来保证数据的一致性.
总结
集群环境下对于敏感性要求不高的数据可以使用localcache,只配置简单的失效机制来保证数据的一致性.
对敏感性高的数据直接使用集中式缓存,减低复杂度.
复杂方案看似完美的解决了问题,实际上性能和稳定性却很可能大打折扣.
感谢William 、放翁提出的宝贵建议
相关推荐
ASM提供了一种集中式、自动化的存储管理解决方案,可以自动创建、扩展和管理磁盘组,以及数据库的数据文件和重做日志文件。ASM简化了存储管理,减少了数据库管理员的工作负担。 **数据访问与并发控制:** 在RAC环境...
Ibatis支持两种类型的缓存:本地缓存(Local Cache)和二级缓存(Second Level Cache)。本地缓存保证了在一个SqlSession内的多次相同查询只会执行一次,而二级缓存则可以在整个SqlSessionFactory范围内共享数据。 ...
根据缓存与应用程序的关联程度,缓存可以分为本地缓存(local cache)和远程缓存(remote cache)。本地缓存通常用于快速响应,而远程缓存则适用于更广泛的数据共享和备份需求。 除了读缓存,写缓存也是缓存策略的一个...
Phantom虚拟桌面管理系统通过独特的“Local Cache”技术,将客户端硬盘转化为只用于软件流的缓存设备,极大地降低了数据被非法获取的风险。即使硬盘丢失或被复制,也无法获取到实际的数据。 此外,企业通常需要购买...
综上所述,通过使用Nginx作为前端负载均衡器,结合Tomcat作为Java Web应用服务器,再配合Memcached作为集中式缓存,可以构建出一个既稳定又高性能的Web应用集群。这种方式不仅能够有效提升系统的并发处理能力,还...
4. **易管理性** - 提供集中式的管理工具,简化了数据库的日常管理和维护。 **RAC的部署和维护** 部署Oracle RAC需要注意网络配置,包括公共网络(Public Network)和私有网络(Private Network),以及可能的 SCAN...
在IT行业中,版本控制系统是开发团队协作的重要工具,而Subversion(SVN)是一个广泛应用的集中式版本控制系统。本文将详细介绍如何在Linux环境下,特别是CentOS操作系统上,配置SVN服务器,使其在提交代码更新后能...
1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是...
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。...