`
答案在风中
  • 浏览: 64857 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

分布式缓存下缓存优化设计方案(一)

阅读更多
相关知识:缓存cache、分布式缓存memcache、C# expressions、IL Emit

推荐几篇不错的文章(和C#关系比较密切,不过个人认为其思想还是值得学习的):

[1]memcache的原理介绍

http://www.blogjava.net/ruoyoux/articles/269403.html

[2]Expression Tree上手指南

http://www.cnblogs.com/Ninputer/archive/2009/08/28/expression_tree1.html

[3]关于动态调用函数的实现

http://www.cnblogs.com/JeffreyZhao/archive/2008/11/24/invoke-method-by-lambda-expression.html

[4]Emit 学习之旅

http://www.cnblogs.com/mythysjh/archive/2010/04/19/1715383.html

         切入正题,先感慨下不得不说大学学好操作系统原理还是很重要的,很多思想其实在抠腚的时候都值得借鉴。首先关于Cache,貌似记操作系统中描述缓存是这么形容的高速的缓冲存储器,存储内存中经常使用的数据以避免平凡的内存数据交换。在应用层面Cache的作用也是非常强大的,客户端的缓存可以避免平凡的从服务器获取数据浪费流量,服务器端的缓存则可以缓解在高访问量情况下对数据库以及服务器本身造成的压力。MemCache是使用较多的一种分布式缓存工具,其实本质上和localcache一样,只是将缓存主机与应用服务器分离,应用服务器作为memcache的客户端,通过网络传输访问memcache主机读写缓存(一般都采用TCP协议)。分布式缓存的好处,我个人总结主要有一下几点:1.减轻应用服务器的存储负荷;2.多应用服务器情况下,只保留一份缓存(存在于缓存主机上),保证了数据的一致性,也给缓存的管理带来了便利(关于memcache的介绍可以参看[1],memcache是个开源工程github上也能到其源码)。

            再切入正题,Hierarchy Cache(分级缓存,擦,这是我自己起的名字,不要误会不是什么高深的玩意)。上面说道Memcache是分布式存储的一种解决方案,那么在缓存读写的过程中必当需要进行网络传输(在高访问量以及海量数据的情况下,通过网络传输以及hash获取cache的效率要明显高于数据库查询批量查询的效率,这也是缓存存在的重要意义),虽然采用TCP传输协议,但是如果缓存的内容较多且访问频繁,那IO的开销增大缓存的效率必然下降,应对这种情况经过思考老大和我分别提出了两种解决方案 ,一种是设置短时间localcache(针对短时间频率访问情况),一种是差异化hierarchy cache(针对缓存数据量较大情况);

           首先介绍第一种解决方案,短时间localcache,为频繁访问的缓存保留本地备份(localcache),在一段时间内的访问可以本地缓存命中而不用频繁的访问缓存主机,理论上:memcache访问次数(采用本地缓存)=memcache访问次数(不采用本地i缓存)/本地缓存时间,而且由于本地缓存时间较短所以依然能够保持缓存的一致性。

          第二种解决方案,即我所说的差异化hierarchy cache,主要针对了了缓存数据量较大情况。这里我借鉴了操作系统中TLB设计的思路,不将全量数据缓存,而是人为的设置两级缓存,分别缓存全量数据中的更常访问的部分。有人可能奇怪了既然缓存本来就是存储经常访问的数据,那何来更常访问一说?这里需要说明一点,我们做分级缓存的数据存的确是存在这种特性的,比如说我们有一个有1w条数据的榜单,客户端使用分页来展示这些榜单,一般用户在查看这些榜单的时候往往只需要查看前几十条、几百条,如果服务器对全量的数据做了cache那每次请求势必要对1w条数据进行io的操作(至于为什么不几十条、几百条作为一个缓存结果缓存,是因为这样会导致缓存的碎片话,给清理缓存造成严重的影响)。再回到我说的差异化分级缓存,首先介绍下差异化,这个差异化是指不同数据定制不同的cache数据量大小。再者是分级,目前我只采用了两个层级,并且是从数据量初始位置开始缓存(这个可以根据自己产品的特性定制)。举个例子吧,当前我有1w条数据,如果不使用缓存,客户端每次分页请求数据都需要全量的查找数据库排序并且遍历找到对应数据;如果使用普通缓存全量1w条数据,则客户端每次请求,需要将1w条数据从memcache主机发往应用服务器再遍历对应数据;如果使用分级缓存(假设分两级,LevelOne代表200条数据,LevelTwo代表500条数据),那么在客户端访问时,大部分请求都可以通过LevelOne、LevelTwo两个层级的缓存命中,而对于超过这两个层级的数据请求再去查询数据库(因为这种访问请求较少所以性能损耗是可以容忍的),这样网络传输和数据库查询性能损耗都大大降低,而且并没有造成缓存的碎片话(是不是和TLB很像...)。

        关于如何实现这种方案,最近参考了反射、Expressions Tree、IL Emit的实现机理,最终选择了使用IL来织入代码进行实现,采用的开发模式则是伟大的面向运气的开发模式(开个玩笑,结构化编程切忌不要一步到位,要慢慢来)。

        本文纯属抛砖引玉,明天又要扣腚,洗洗睡了...大家有好的想法欢迎讨论,过段时间,开始维护博客。

       欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
2
0
分享到:
评论
3 楼 zhongmin2012 2012-11-07  
分析的很好,虽然思想都差不多,希望博主给我们讲下有关如何控制缓存中脏数据的问题,博主很幽默,面向运气,,,哈哈,你谦虚了
2 楼 答案在风中 2012-10-26  
jiangzhouyun 写道
就是不同数据,缓存的量不同,楼主定义成level了,这个一般做成可配制。一般也是这么做的,只缓存部分数据,前一百条,或者前二百条这样。  

另外缓存使用,一般分本地缓存(LocalCache)与远程缓存(memcache,redis这些),项目中一般是两者结合一起用的。

嗯,其实简单来说就是你说的这个意思,其实思想是很简单的,谢谢支持。
1 楼 jiangzhouyun 2012-10-26  
就是不同数据,缓存的量不同,楼主定义成level了,这个一般做成可配制。一般也是这么做的,只缓存部分数据,前一百条,或者前二百条这样。  

另外缓存使用,一般分本地缓存(LocalCache)与远程缓存(memcache,redis这些),项目中一般是两者结合一起用的。

相关推荐

    Ehcache分布式缓存与其在SpringBoot应用

    Ehcache是一个高性能的、基于Java的进程内缓存解决方案,它被广泛应用于各种Java应用程序,包括Java EE和轻量级...然而,使用分布式缓存也需要考虑数据的一致性、容错性和运维复杂性,因此在设计和实施时需谨慎处理。

    分布式缓存 原理 架构及Go语言实现-高清-完整目录

    分布式缓存作为一种在多节点之间共享和分布数据的存储方式,是现代大型分布式系统中不可或缺的一个组件。它能够有效降低数据库的读写压力,加速数据访问速度,提高系统的响应性能。在分布式缓存的实现方式中,基于...

    分布式缓存服务器memcacaed的源代码

    分布式缓存服务器...深入学习`memcached-1.4.25`的源代码,可以帮助理解分布式缓存的工作原理,为自定义缓存系统或优化现有缓存解决方案提供灵感。同时,它也有助于提升对网络编程、内存管理和并发处理的理解。

    云计算环境下分布式缓存技术的现状与挑战.pdf

    分布式缓存技术作为一项重要的中间件技术,在云计算环境下扮演了至关重要的角色。云计算环境下,分布式缓存技术不仅能够满足不同计算机领域的运作需求,还能够实现各种技术之间的有效对接。但是,当前分布式缓存技术...

    MDCAdminTool 微软分布式缓存 管理工具

    微软的Velocity是一个高性能、可扩展的分布式内存缓存解决方案,设计用于.NET框架的应用程序。Velocity的目标是提高Web应用程序的响应速度和可伸缩性,通过在内存中缓存数据来减少对数据库的依赖。该技术允许开发者...

    30_分布式缓存相关面试题的回答技巧总结.zip

    分布式缓存是一种将数据存储在分布式环境中的高速缓存技术,通常用于减轻数据库的负载,提高数据读取速度。常见的分布式缓存系统有Redis、Memcached、Hazelcast等。 2. **为什么要使用分布式缓存?** 主要原因...

    分布式缓存系统中一种优化缓存部署的图算法.pdf

    本文针对分布式缓存系统中的缓存部署优化问题,提出了一种基于图算法的解决方案。该算法将缓存放置问题建模为一个优化问题,并提出了一种图基础算法来求解。具体来说,这种算法应用了一种改进的迪杰斯特拉(Dijkstra...

    动态数据处理平台分布式缓存替换算法仿真.pdf

    以上是对文件标题、描述、标签及部分内容的知识点详细说明,集中阐述了动态数据处理平台下分布式缓存替换算法的仿真研究,以及新提出的算法相较于传统算法在性能上的优势。文章还涉及了对分布式系统、缓存替换策略、...

    一种高效的Redis Cluster的分布式缓存系统.pdf

    本研究工作基于Redis4.0设计并实现了一种RedisCluster分布式缓存系统。该系统在数据分布式存储的基础上,增加了动态扩展能力,通过在不同节点间分布数据,实现系统的线性可扩展性、负载均衡、并发处理、数据吞吐量及...

    分布式缓存实现(附源码)

    分布式缓存是现代大型互联网应用中不可...总之,C#实现的分布式缓存系统是一个复杂且重要的技术领域,涉及到多个层面的设计和优化。通过分析提供的源码,你可以学习到如何在实际项目中有效利用分布式缓存提升应用性能。

    cpp-xcache是喜马拉雅内部使用的一套分布式缓存解决方案

    cpp-xcache是喜马拉雅公司为满足其内部高性能、高可用性需求而构建的一套分布式缓存解决方案。它结合了360公司开源的Pika和豌豆荚的开源项目Codis的优势,经过定制化开发以适应喜马拉雅的业务场景。 ### Pika——...

    分布式缓存

    分布式缓存是现代大型互联网应用中不可或缺的一部分,它在处理海量数据、提高系统性能和响应速度方面发挥着关键作用。本书“深入分布式缓存:从原理到实践”旨在全面解析分布式缓存的核心概念、工作原理及其在实际...

    300分钟吃透分布式缓存pdf和markdown

    通过这300分钟的学习,你将全面掌握分布式缓存的基础知识,了解如何在实际项目中选择合适的缓存方案,以及如何优化和管理缓存,提升系统性能。无论是PDF还是Markdown文档,都将为你提供详尽的理论解释和实践指导。

    分布式缓存测试框架 RadarGun.zip

    分布式缓存测试框架RadarGun是一个专为数据网格和分布式缓存系统设计的性能基准测试工具,主要用于评估和比较这些系统的性能和可扩展性。在Java开发领域,它扮演着重要角色,帮助开发者和运维人员确保所选的分布式...

    分布式缓存与JavaEE

    分布式缓存是现代大型互联网应用中不可或缺的一部分,尤其是在JavaEE环境下。它主要用来解决数据库的高并发读写压力,提高系统的响应速度和可扩展性。本文将深入探讨分布式缓存的概念、工作原理以及如何在JavaEE应用...

    利用分布式缓存提升CRM系统登录效率

    应用系统支撑总绕不开性能的问题,有时通过业务清理来降低压力,有时...本文通过对项目的回顾,分享利用分布式缓存来实现提升系统登陆效率的方案,总结分布式缓存应用的原则和约束,指导应用如何更好地设计来满足性能的要求.

    面向舆情采集的分布式缓存系统设计.pdf

    针对这一性能瓶颈,本文提出了分布式缓存系统的设计方案。 分布式缓存系统的设计旨在优化分布式搜索引擎的性能。其设计思想是在现有的分布式搜索引擎基础上,在总查询处理服务器和各集群子查询处理服务器之间增加一...

    金融级分布式缓存平台的一致性设计

    总之,金融级分布式缓存平台的一致性设计是一个复杂而关键的任务,需要综合运用多种技术和策略,确保在高并发、分布式环境下的数据准确性和系统稳定性。通过理解并解决事务缓存一致性、并发乱序一致性、主从切换一致...

Global site tag (gtag.js) - Google Analytics