相关知识:缓存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来织入代码进行实现,采用的开发模式则是伟大的面向运气的开发模式(开个玩笑,结构化编程切忌不要一步到位,要慢慢来)。
本文纯属抛砖引玉,明天又要扣腚,洗洗睡了...大家有好的想法欢迎讨论,过段时间,开始维护博客。
欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
分享到:
相关推荐
应用系统支撑总绕不开性能的问题,有时通过业务清理来降低压力,有时...本文通过对项目的回顾,分享利用分布式缓存来实现提升系统登陆效率的方案,总结分布式缓存应用的原则和约束,指导应用如何更好地设计来满足性能的要求.
Elasticsearch是一个强大的开源搜索引擎,它为数据的存储、搜索和分析提供了高效、可扩展的解决方案。然而,尽管Elasticsearch本身具有许多优势,但在实际使用过程中,用户可能会遇到各种问题和挑战。为了帮助用户...
Java筑基(基础):Tomcat+Mysql+设计模式+并发编程+JVM+Netty开源框架(SSM框架):Spring+SpringMVC+Mybatis微服务架构:Dubbo、SpringBoot、SprinGCloud、Docker分布式:分布式限流+分布式缓存+分布式通讯(限流...
6、多级缓存(堆内存缓存,分布式缓存,openresty + lua 缓存,浏览器缓存) 7、秒杀下单(压力测试)-- 锁 (程序锁,aop 锁,数据库锁,blockingqueue 队列) 8、rocketmq 队列异步处理(读缓存,写异步) 9、数据...
分布式缓存集群的伸缩性设计 memcached分布式缓存集群的访问模型 memcached分布式缓存集群的伸缩性挑战 分布式缓存的一致性hash算法 数据存储服务器集群的伸缩性设计 关系数据库集群的伸缩性设计 nosql...
通过参加“高级Java工程师体系课2.0:深入剖析高可用、高性能分布式系统设计与实现”课程,我不仅掌握了分布式系统设计与实现的核心概念和技术,而且深入了解了分布式系统中的挑战和解决方案。我对于构建高可用、高...
每个公司都要求程序员写出性能良好、维护性强的代码,各种高端...特斯拉CEO马斯克收购推特后,亲自与推特员工在深夜讨论分布式缓存方案,以减少网络调用,也同员工讨论如何减少渲染首页带来的后台近千次的微服务调用。
基于分布式架构下分布式锁的解决方案实战 分布式架构实现分布式定时调度 分布式架构-中间件 分布式消息通信 消息中间件在分布式架构中的应用 ActiveMQ ActiveMQ高可用集群企业及部署方案 ActiveMQ P2P及PUB/...
目录 1 背景及目标 2 Mysql 执行优化 2 ...分布式方案 18 分库&拆表方案 18 反范式设计(冗余结构设计) 20 主从架构 21 故障转移处理 22 缓存方案 22 缓存结合数据库的读取 22 缓存结合数据库的写入
为了解决这个问题,我们建立了一个分布式网络内缓存模型,用于在CCN中制定内容放置和请求路由,旨在最大程度地减少带宽成本以及严格的存储和带宽限制。 基于提出的模型,我们设计了可扩展的,自适应的和低复杂度的...
分布式缓存memcache的使用及分布式策略,包括Hash算法的选择。 常见的分布式系统存储解决方案,包括MySQL的分布式扩展、HBase的API及使用场景、Redis的使用等。 如何使用分布式消息系统ActiveMQ来降低系统之间...
第一部分 ORACLE系统优化基本知识 23 第1章 ORACLE结构回顾 23 §1.1 Oracle数据库结构 23 §1.1.1 Oracle数据字典 23 §1.1.2 表空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1...
19_先平易近人的随口问你一句分布式缓存的第一个问题 20_来聊聊redis的线程模型吧?为啥单线程还能有很高的效率? 21_redis都有哪些数据类型?分别在哪些场景下使用比较合适呢? 22_redis的过期策略能介绍一下?要不...
企业级分布式缓存技术之(redis详解) 企业高并发基石(Tomcat服务器性能优化) spring事务处理 课程文档 高并发之基础数据MySql调优 mongodb 三级联动课程资料 应用架构之灵魂设计模式 应用架构之魂设计模式实战演练...
设计一种更加高效、符合当前新趋势的通信加速机制便显得尤为重要,为解决上述新形势下的挑战,本文提出了两种新型通信广播机制:(1)一种基于MPI_Bcast的管道链PC (Pipelined Chain)通信机制:为GPU缓存提供高效...
XIV系统在所有磁盘之间优化分配所有工作负载的能力以及强大的分布式缓存结构允许您通过添加存储机箱来线性扩展高性能。由于这个高性能是一致的,无需手动调试。因此,用户可在因为业务量和快照使用模式发生变化而...
现在呢,我新开辟了一个新项目,仓库地址为:这个项目我跟着大牛老师做一做,并且我会根据自己的理解进行代码的重构(我觉得有很多值得优化的点,还有就是支付,我还是想用原生的接入方式而不是课程中说的接入它的...
11.4.2 分布式缓存+应用本地热点 224 11.5 更新缓存与原子性 225 11.6 缓存崩溃与快速修复 226 11.6.1 取模 226 11.6.2 一致性哈希 226 11.6.3 快速恢复 226 12 连接池线程池详解 227 12.1 数据库连接池 227 12.1.1 ...
│ 02 研发工程师如何用架构师视角回答架构设计方案?.mp4 │ 05 海量并发场景下,如何回答分布式事务一致性问题?.mp4 │ 08 MQ:如何回答消息队列的丢失、重复与积压问题.mp4 │ 09 如何回答 MySQL 的索引原理...