`
Breese
  • 浏览: 63310 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

localCache与集中式cache

 
阅读更多

使用memcache缓存数据,减少对数据库的直接访问,提高网站性能已经成了各大网站最基本的技术.如何更好的提高memcache缓存的利用率及命中次数会在后面的blog中单独介绍,本文主要探讨为何及如何使用本地缓存(java localcache)提高网站性能.

localcachememcache性能比较

先来个本地缓存与memcache缓存的性能比较,有个直观上的概念

Cache

请求方式

次数

时间

平均

Localcache

hashmapget请求

1亿

1344ms

0.00001344ms

Memcache

简单的get请求,不做序列化

1

4437ms

0.4437ms

Db

单表查询(有索引)

   

1-2ms

以上测试在开发机器.生产环境采集的数据显示memcache的一次请求大约在0.2ms左右,如果存储的是java object,那算上发序列化的时间在0.5ms以上.与测试数据在同一个数量级上.

通过以上数据对比,可以得知localcache的效率比memcache1万倍以上.这个数字让我对使用本地缓存充满了极大的兴趣.

使用localcache会带来哪些问题

localcache有着极大的性能优势,单机情况下,适当使用localcache会使程序的效率得到很大的提升.但在集群环境下localcache就存在很多问题了,主要体现在多个jvm之间cache的同步问题.

有很多框架在这上面做了很多工作,比如ehcache ,主要是通过cache复制(copyinvalidate)来解决,大概的思路是使用消息多播机制,当一个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 、放翁提出的宝贵建议

分享到:
评论

相关推荐

    Oracle Database 11g RAC Administration

    ASM提供了一种集中式、自动化的存储管理解决方案,可以自动创建、扩展和管理磁盘组,以及数据库的数据文件和重做日志文件。ASM简化了存储管理,减少了数据库管理员的工作负担。 **数据访问与并发控制:** 在RAC环境...

    ibatis jar包

    Ibatis支持两种类型的缓存:本地缓存(Local Cache)和二级缓存(Second Level Cache)。本地缓存保证了在一个SqlSession内的多次相同查询只会执行一次,而二级缓存则可以在整个SqlSessionFactory范围内共享数据。 ...

    大型B2C网站高性能可伸缩架构技术探秘

    根据缓存与应用程序的关联程度,缓存可以分为本地缓存(local cache)和远程缓存(remote cache)。本地缓存通常用于快速响应,而远程缓存则适用于更广泛的数据共享和备份需求。 除了读缓存,写缓存也是缓存策略的一个...

    Phantom虚拟桌面管理系统

    Phantom虚拟桌面管理系统通过独特的“Local Cache”技术,将客户端硬盘转化为只用于软件流的缓存设备,极大地降低了数据被非法获取的风险。即使硬盘丢失或被复制,也无法获取到实际的数据。 此外,企业通常需要购买...

    集群Nginx+Tomcat+Memcached

    综上所述,通过使用Nginx作为前端负载均衡器,结合Tomcat作为Java Web应用服务器,再配合Memcached作为集中式缓存,可以构建出一个既稳定又高性能的Web应用集群。这种方式不仅能够有效提升系统的并发处理能力,还...

    Oracle RAC原理浅谈.pptx

    4. **易管理性** - 提供集中式的管理工具,简化了数据库的日常管理和维护。 **RAC的部署和维护** 部署Oracle RAC需要注意网络配置,包括公共网络(Public Network)和私有网络(Private Network),以及可能的 SCAN...

    Linux下SVN服务器自动更新文件到Web目录的方法

    在IT行业中,版本控制系统是开发团队协作的重要工具,而Subversion(SVN)是一个广泛应用的集中式版本控制系统。本文将详细介绍如何在Linux环境下,特别是CentOS操作系统上,配置SVN服务器,使其在提交代码更新后能...

    超级有影响力霸气的Java面试题大全文档

    1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是...

    java 面试题 总结

    抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。...

Global site tag (gtag.js) - Google Analytics