上篇对疯狂代码缓存配置进行了概要的设计,可能说的有点模糊了,有几个朋友发了几个问题探讨了下,这里有必要先澄清一个问题,和常见的缓存策略不同,我们 的缓存策略将重点放在更新策略而不是只读策略上。只读缓存以及共性缓存策略性质实现的难度并不大,我们要解决的是非共性缓存,并发更新缓存,可扩充性缓 存,分布式缓存更新运算的问题,而对于共性的东西的话我们可以很轻松的实现,而不必做太多的运算。
试想一个问题,对于一个多用户的并发的系统,如果对每个用户都维护一份缓存策略还要保证更新的及时性以及处理的必要性来说的话,我们很难想到一个有效的处 理机制来维护每份(每用户)缓存的副本的,缓存的存储性质也决定了做分布式缓存策略处理的难度和分布式通讯更新的的难度,我们也很难尝试对于一些访问量很 小且少有共性的页面实现有效的缓存命中率,比如某某用户的博客。
简单的总结了一下关于缓存策略讨论的重点
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分钟或者更长时间的延迟。
集成原则
将搜索字段和表整合出来,用独立的只读查询服务器来分担负荷
分享到:
相关推荐
最后,"疯狂代码,大型网站架构系列之五,缓存策略设计概要.doc"则可能总结了各种缓存策略,包括LRU(Least Recently Used)、LFU(Least Frequently Used)等,以及如何根据业务需求选择合适的缓存策略。这部分还...
综上所述,设计高负载系统架构时,需兼顾负载均衡、中间层处理、分布式缓存、文件服务器、数据库优化以及监控和容错等多个方面,通过这些技术手段,构建出能够处理大规模用户访问的稳定、高效系统。
性能优化则可能包含缓存策略、负载均衡、数据库优化等措施。 总之,《Petshop 概要设计说明书》作为一份详尽的开发指导文档,不仅描绘了系统的整体架构,还细化到每个功能模块和接口,确保开发工作有条不紊地进行。...
11. **性能优化**:考虑到大型交流平台可能面临高并发访问,设计时应考虑负载均衡、缓存策略、数据库优化等措施,以提升系统的响应速度和稳定性。 12. **测试计划**:设计文档中还应包括测试策略,包括单元测试、...
内容概要:该系统设计指南涵盖多个关键领域来提高大型系统的性能与可扩展性,其中包括客户端缓存、CDN 缓存、Web 服务器缓存、数据库缓存等多个层次缓存机制以及高性能和分布式系统的CAP定理介绍。它详细介绍了不同...
《LB浏览器服务器侧概要设计V2》是一个关于构建高效、稳定且可扩展的服务器端架构的文档。根据提供的信息,我们可以推测这篇文章可能涵盖了以下几个关键知识点: 1. **负载均衡(Load Balancing)**: - 负载均衡...
综上所述,网上票务系统概要设计涉及到多个方面的技术和知识,包括系统架构、模块划分、数据库设计、前端与后端开发、API设计、测试与部署、安全性和高可用性等方面,每个环节都需要精细规划和设计,以构建出稳定、...
本资料包"MySQL性能调优与架构设计(带目录)"聚焦于提升MySQL数据库的性能以及如何进行有效的架构设计,确保系统的稳定性和可扩展性。以下是根据压缩包内文件内容概要分析的关键知识点: 1. **基础篇(1~5章)**: ...
【概要设计1】主要涉及两个关键领域:搜索引擎和网络爬虫。这两个概念在IT行业中是构建大规模互联网信息检索系统的基础。 **1. 搜索引擎** 搜索引擎是互联网上技术含量极高的产品,它通过复杂的架构和算法处理海量...
开发者可以根据具体场景选择合适的缓存策略,有效缓解数据库的压力,提升用户体验。 ##### 6. 国际化与本地化支持 Django内置了对多语言的支持,可以轻松地为网站添加多语言版本,满足不同国家和地区用户的需求。...
对于大规模的问答系统,性能优化至关重要,可能包括数据库查询优化、缓存策略、负载均衡等。 9. **安全性考虑** 为了保护用户数据和防止恶意攻击,系统应实施相应的安全措施,如SQL注入防护、XSS攻击防御以及使用...
- 对系统进行性能监控和优化,如数据库查询优化、缓存策略、负载均衡等。 - 定期更新和维护,修复可能存在的漏洞,保障系统的稳定运行。 总的来说,基于MVC模式的网上超市系统利用Java技术栈实现,不仅能满足用户...
性能优化主要包括调整线程池大小、内存分配、缓存策略等,以提高 WebSphere 的处理能力和资源利用效率。这可能涉及到修改服务器的启动脚本(如 server.bat 或 server.sh),或在管理控制台中进行配置。 总的来说,...
- **C/S(Client/Server)**:客户端/服务器结构,客户端需要安装专门的应用程序,服务器通常采用高性能硬件和大型数据库,适合于复杂且安全性要求高的系统。 3. **B/S与C/S比较**: - **开发与维护成本**:B/S...
数据库工程师是IT行业中一个至关重要的角色,他们负责设计、开发和维护管理大型数据库,确保企业的数据安全、高效和可靠。以下是对"数据库工程师职位说明书"的详细解释: **职位概要:** 数据库工程师的主要任务是...
- **SEO优化**:在网站设计和开发过程中融入SEO策略,以提高搜索引擎排名。 5. **框架与环境配置**:选用适合项目需求的PHP框架,如Yii、Symfony或CakePHP,并进行环境配置。理解模型-视图-控制器(MVC)架构,...
系统概要设计 - **系统结构**:通常采用三层架构设计,即表示层、业务逻辑层和数据访问层。这样的分层设计有助于提高代码的可读性和可维护性。 - **数据库设计**:根据系统需求,设计数据库表结构,包括字段类型、...
内容概要 本教程详细介绍了JVM(Java虚拟机)的结构、类型和编译器模式、参数分类、即时编译器(JIT)诊断工具、垃圾回收机制、内存调优方法,以及并行和CMS垃圾回收器的优化策略。重点内容包括: JVM类型和编译器...