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

【转】疯狂代码,大型网站架构系列之五,缓存策略设计概要

阅读更多
http://www.crazycoder.cn/Yuanchuang/Article62853.html

上篇对疯狂代码缓存配置进行了概要的设计,可能说的有点模糊了,有几个朋友发了几个问题探讨了下,这里有必要先澄清一个问题,和常见的缓存策略不同,我们的缓存策略将重点放在更新策略而不是只读策略上。只读缓存以及共性缓存策略性质实现的难度并不大,我们要解决的是非共性缓存,并发更新缓存,可扩充性缓存,分布式缓存更新运算的问题,而对于共性的东西的话我们可以很轻松的实现,而不必做太多的运算。

试想一个问题,对于一个多用户的并发的系统,如果对每个用户都维护一份缓存策略还要保证更新的及时性以及处理的必要性来说的话,我们很难想到一个有效的处理机制来维护每份(每用户)缓存的副本的,缓存的存储性质也决定了做分布式缓存策略处理的难度和分布式通讯更新的的难度,我们也很难尝试对于一些访问量很小且少有共性的页面实现有效的缓存命中率,比如某某用户的博客。

简单的总结了一下关于缓存策略讨论的重点
A.     基于海量非共性数据的缓存策略
B.      基于数据缓存级别并发更新的缓存策略
C.     基于数据并发存储的缓存策略
D.     基于分布式的缓存策略
E.基于搜索的缓存策略

我们这里不再赘谈关于页面静态化以及类似的问题,静态化的情况非常适合在系统初期,用户的基数并不算很大的情况下实现,而在涉及集群的情况下,静态化的实现成本,IO成本,维护成本,扩充成本以及更新成本会远远的超出缓存策略的成本,当然我们也会有一套建立在缓存基础上的静态化处理方案,这些放在以后再谈。我们的目的是要建立一个可伸缩,便于维护扩展的缓存策略,下面就具体问题进行分析。

对于问题A:
常见的博客系统就是一个最好的例子,每个用户的首页都是相对个性的数据,共性的地方不多,以常见的处理方案来说的话,我们可能需要维护每个用户访问的缓存副本,而对于一些访问量极小的博客站点来说的话这种方式无疑会造成巨大的浪费。

对于大量非共性的数据缓存来说,几个处理方案:
1)      量化缓存目标并分配相应的缓存权值。(权值分级)
目的很简单,只缓存有效的数据。首先抽取活跃用户,以及高访问量用户,将数据进行分组分权制缓存(对于交友型的SNS系统来说,我们称之为美女效应)
2)      非连接持久性的缓存保持(临时的持久性)
珍惜并有效利用数据查询,将未被缓存命中时的查询或者无权值的数据持久化保存(序列化存贮静态存贮等),当缓存未被命中时优先取得持久化数据而非数据查询。可以理解为临时数据存贮,或者临时存贮于子服务器的某个位置。
3)  基于数据更新的缓存清除(一次性使用)
当持久性缓存保持失效(依赖数据发生修改),直接删除临时数据(缓存只在访问时被激活并储存,一旦修改或者失效,我们立刻抛弃)。
4)缓存更新代理规则
由另外的线程进行维护,并维护线程的有效性,最大限度的分离主程序对无效缓存以及临时持久性缓存数据的清理


对于问题B:
在小型缓存策略中,缓存处理对于整个应用程序对于每个请求来说都是唯一的,可操作的和非物理存储的。而在并发更新的过程中,一个小小的并发更新就会很现实的清空所有的缓存池,造成缓存命中率奇低而初始化率奇高而起不到缓存策略应有的作用。

在这种情况下,处理方案也和A.4中提到的方案是一样的,由独立的缓存更新进程来处理,对于应用程序中所有涉及缓存更新的请求由专门的更新代理来执行。这个处理方案相对简单,不再赘述。

对于问题C:
上篇已经提到关于并发数据更新会带来的问题也就是数据库的I/O响应,超时,死锁,以及线程的阻塞问题。我们用一个写入缓存来处理这个方案,其实这个并非传统意义上的读缓存,姑且命名为写缓存吧,我们可以形象的理解为类似硬盘缓冲区的问题。这里处理的操作稍微有点多了,还要涉及只读缓存的更新的问题了。

根据系统的不同,我们需要分析处理的角度也不同,我们以常见的webgame为例来简单介绍一下处理机制,这里有两种常见的情况
1) 对于 webgame的最终用户玩家来说,每个在线用户的数据是非共性的(问题A),而在一个战斗场景下,每组数据时刻都在变化之中,如果我们对数据的变化采用数据库日志记录的形式保存的情况显然对Database的压力很大,而我们需要记录的仅仅是战斗的结果,战斗的过程我们完全没有必要进行保存,这个时候我们就用写入缓存来执行相应的数据操作。这个处理很简单,用服务器变量的形式就能解决他。
2) 对于 webgame的服务器角色来说,如果战斗场景的用户量非常多,而数据更新非常大的情况下,我们采用方法1中的处理也可能力不从心,这个时候我们可以将缓存来进一步的抽象,在某个时间段内(比如3分钟),维护一个唯一的缓存对象,所有的数据操作都在这个时间段来被缓存进程来记录,来更新。而由另外的一个进程来进行异步的定时的数据保存操作。

对于问题D
       这个是比较常见的分布式缓存服务器组了,而对缓存服务器来说其实要解决的问题就是服务器间之间互相通讯的问题,并保证数据一致性的问题。那么我们的有四个处理规则:
1) 数据缓存应该被有效的分组并索引
目标是实现数据耦合的成都降到最低,甚至没有耦合。比如以用户ID为分割的数据缓存分布,或者以文章分类为分割的缓存分布
2) 数据缓存应该被有效的更新
如果数据被有效的分组完成后,这个就是问题C.2的方案了,和C.2不同的是,因为缓存组可能未必在一组服务器中,可能涉及缓存和DATABASE数据通讯延迟的问题。这个时候要保证缓存服务器被即时的传递到databse,那么需要另外的一个缓存检测进程来完成这项工作(数据完整性检查,并备份两个缓存段的数据)
3) 缓存服务器间的数据完整性
对于无法分组的数据,比如时间段内的用户认证数据和资料数据,我们需要保证两组数据同步,最好的处理方法就是清除相应的缓存段,让它在下次使用的时候初始化
4) 缓存服务器间的连通性
这个取决于物理线路,如果缓存服务器在天南地北的话,我们还需要一个队列进程来进行同步和数据矫正,我们称之为缓存路由。

对于问题E
在分布式缓存的情况下,多条件搜索往往涉及多个缓存服务器,处理起来笔者尚未有一套完善的出来方案。笔者用的是敷衍原则和集成原则了
敷衍原则:
对于搜索型的数据来说,很多情况下并不是非常重要,我们的搜索结果完全可以晚一会提供给用户,允许搜索的数据有10分钟或者更长时间的延迟。
集成原则
将搜索字段和表整合出来,用独立的只读查询服务器来分担负荷


如果您有比较好的方案,不妨mail:heroqst # gmail.com ,和疯狂代码探讨下,请替换#为@。
分享到:
评论

相关推荐

    疯狂代码,大型网站架构系列

    最后,"疯狂代码,大型网站架构系列之五,缓存策略设计概要.doc"则可能总结了各种缓存策略,包括LRU(Least Recently Used)、LFU(Least Frequently Used)等,以及如何根据业务需求选择合适的缓存策略。这部分还...

    高性能网站架构设计之缓存篇

    【高性能网站架构设计之缓存篇】探讨了如何在网站架构中有效利用缓存提升性能。缓存是解决高并发、大数据量访问问题的关键技术,它通过存储热门数据,减少对数据库的直接访问,从而提高响应速度。在这个主题中,我们...

    系统设计规范和模板word+pdf版(架构设计、概要设计、详细设计和数据库设计)

    在IT行业中,系统设计是软件开发过程中的关键环节,它涉及到架构设计、概要设计、详细设计和数据库设计等多个步骤。这些步骤都是确保项目成功、高效且可维护的关键。以下是对这些知识点的详细阐述: 1. **架构设计*...

    大型分布式网站架构设计与实践.pdf

    对架构一个高性能,高可用,可伸缩,可扩展的分布式网站进行了概要性描述,并给出一个架构参考。一部分为读书笔记,一部分是个人经验总结。对大型分布式网站架构有很好的参考价值。(如果感觉对大家有帮助,请帮忙点...

    硬件设计概要设计模板

    硬件设计概要设计是系统开发过程中的重要环节,它为硬件工程师提供了一个清晰的蓝图,指导着从概念到实现的整个过程。这份“硬件设计概要设计模板”旨在帮助设计师们构建一个结构化的、全面的硬件设计方案,确保设计...

    架构设计和概要设计

    先谈下架构设计:架构设计包括了功能性架构和技术架构设计两个部分的内容  初步再来探讨下架构设计和概要设计的区别和边界问题。先谈下架构设计:  架构设计包括了功能性架构和技术架构设计两个部分的内容,功能性...

    概要设计和详细设计文档模板.zip

    本压缩包“概要设计和详细设计文档模板.zip”包含了一系列模板,旨在帮助开发者按照规范有效地进行这两个阶段的工作。 **概要设计** 概要设计,也称为系统设计或高层设计,是对软件系统的整体架构和主要功能的规划...

    软件系统概要设计说明书.docx

    系统设计应具备良好的可扩展性,允许添加新功能或升级现有功能,同时考虑代码和架构的可维护性,便于未来的问题定位和修复。 2.2.3 系统安全性 为了保障数据安全,系统设计需遵循安全标准,如数据加密、权限控制、...

    微服务概要设计说明书模板

    文档:概要设计文档,可以帮我们处理程序性能瓶颈,程序移植性短板,也方便后期维护拓展,文档输出也方便后期交付和交接。 项目目录: 1 文档简介 1.1 编写目的 1.2 文档范围 1.3 缩略语 2 项目概述 2.1 建设...

    概要设计说明书(项目描述+功能结构图+业务流程图)

    项目描述是概要设计说明书的核心内容之一,它提供了项目的概括性介绍,包括项目的背景、目标、功能和技术要求等内容。项目描述是项目团队和项目投资者之间的重要沟通工具,它能够帮助项目团队和项目投资者达成一致,...

    接口概要设计说.doc

    9. **性能优化**:接口设计时需考虑性能问题,如减少请求响应时间、批量处理、缓存策略等。 10. **测试与文档**:接口设计完成后,必须编写详尽的接口文档,并进行单元测试、集成测试和压力测试,确保其正确性和...

    高负载系统架构设计概要

    综上所述,设计高负载系统架构时,需兼顾负载均衡、中间层处理、分布式缓存、文件服务器、数据库优化以及监控和容错等多个方面,通过这些技术手段,构建出能够处理大规模用户访问的稳定、高效系统。

    概要设计说明实例 概要设计说明实例

    《概要设计说明实例》是软件开发过程中一个重要的文档集合,它主要涵盖了软件系统在架构层面的规划和设计。这份压缩包文件包含了多个实例,旨在为开发者提供详细的概要设计思路和方法。以下是对概要设计及其说明实例...

    组策略高手完全手册高级篇之五:组策略设计方案概要

    本篇“组策略高手完全手册高级篇之五:组策略设计方案概要”深入探讨了如何设计和实施有效的组策略方案,以优化企业的IT管理效率和用户体验。 首先,我们需要理解组策略的基本结构。在Windows中,组策略对象(GPO)...

    概要设计模板1概要设计模板

    概要设计模板概要设计模板概要设计模板概要设计模板概要设计模板概要设计模板概要设计模板概要设计模板 本资源文件是一个软件概要设计模板,旨在指导软件开发的概要设计阶段。该模板涵盖了软件开发的多个方面,包括...

    项目概要设计书

    设计策略是概要设计书的重要部分,主要介绍项目中的设计策略。设计策略是指项目中的设计方法和技术,包括面向对象设计、结构化设计、敏捷设计等。面向对象设计是指项目中的面向对象设计方法,包括类的设计、对象的...

    概要设计说明书(模板).docx

    概要设计说明书(模板) 概要设计说明书是软件设计阶段的重要文档,为软件开发提供了详细的设计蓝图。下面是概要设计说明书中所涉及到的知识点: 1. 软件设计阶段:在软件开发过程中,软件设计阶段是非常重要的...

    软件概要设计方案模板.doc

    1. **设计思路**:这部分反映了设计人员在理解上游文档需求后,如何进行创新性思考并形成设计策略的过程,是设计人员智慧的结晶。 2. **构架说明**:简洁明了地阐述系统整体架构,使读者能快速理解系统的基本组成和...

    2-软件概要设计文档模板.docx

    软件概要设计文档模板是项目管理文档之一,旨在为软件开发提供指导和规范。该文档模板涵盖了软件概要设计的各个方面,包括设计概述、系统逻辑设计、系统组织设计、系统结构设计、系统接口设计等。 设计概述部分介绍...

Global site tag (gtag.js) - Google Analytics