我们的缓存策略将重点放在更新策略而不是只读策略上。只读缓存以及共性缓存策略性质实现的难度并不大,我们要解决的是非共性缓存,并发更新缓存,可扩充性缓存,分布式缓存更新运算的问题,而对于共性的东西的话我们可以很轻松的实现,而不必做太多的运算。
试想一个问题,对于一个多用户的并发的系统,如果对每个用户都维护一份缓存策略还要保证更新的及时性以及处理的必要性来说的话,我们很难想到一个有效的处理机制来维护每份(每用户)缓存的副本的,缓存的存储性质也决定了做分布式缓存策略处理的难度和分布式通讯更新的的难度,我们也很难尝试对于一些访问量很小且少有共性的页面实现有效的缓存命中率,比如某某用户的博客。
简单的总结了一下关于缓存策略讨论的重点
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分钟或者更长时间的延迟。
集成原则
将搜索字段和表整合出来,用独立的只读查询服务器来分担负荷。
分享到:
相关推荐
MySQL 缓存解决方案是提高数据库性能的一种重要手段,合理使用缓存技术可以提高数据库的性能,减少数据库的压力。同时,解决高并发问题也是非常重要的,使用合适的解决方法可以确保系统的稳定性。
### 大型网站应用之海量数据和高并发解决方案 #### 一、网站应用背景 随着互联网的迅猛发展,用户数量激增,对于网站而言,如何高效处理海量数据及应对高并发访问成为了关键技术挑战之一。在初期阶段,一个简单的...
在构建大型高并发的网站时,...以上知识点都是大型高并发网站解决方案中不可或缺的部分。在实际项目中,需要根据业务需求、现有基础设施和技术团队能力,综合考虑并灵活应用这些策略,以构建稳定、高效的网站系统。
这时,我们可以采用基于Redis的Shiro缓存解决方案来提升系统的可扩展性和性能。 标题“基于Redis的shiro集中式缓存解决方案实现”所指的知识点主要包括以下几个部分: 1. **Redis**:Redis是一个开源的、基于键值...
Swift-Cacher是一个专门为iOS、macOS、tvOS和watchOS平台设计的轻量级缓存解决方案,它简化了数据存储和检索的过程,提高了应用程序的性能和用户体验。在移动设备上,由于内存和处理能力的限制,高效的数据缓存至关...
【数据库大型应用解决方案总结】 随着互联网应用的飞速发展,数据库面临着前所未有的挑战。每天处理百万级乃至上亿的页面浏览量(PV)使得数据库承受着巨大的负载,这对系统的稳定性和扩展性提出了严峻考验。为了...
例如,Java的Spring框架中的Hibernate二級缓存和Redis等内存数据库就是常见的应用缓存解决方案。 接下来是分布式缓存,它是在多台服务器之间共享数据的一种机制,常用于处理海量数据和高并发场景。分布式缓存系统如...
架构师在大型网站的建设和发展中扮演着至关重要的角色,他们的工作涉及到了网站技术架构的设计、优化与问题解决方案的制定。大型网站技术架构不仅仅关注于代码的编写和功能的实现,它更是一个系统的工程,需要考虑到...
Ehcache是一款广泛使用的JAVA缓存解决方案,它支持本地缓存和分布式缓存。Ehcache的核心特性包括内存和磁盘存储、缓存分区、缓存预热以及缓存过期策略。开发者可以根据实际需求配置缓存大小、生命周期和过期策略,以...
**Ruby-IdentityCacheActiveRecord: 一个Blob级缓存解决方案** 在Ruby开发中,数据库查询是性能的关键瓶颈之一,特别是当处理大量数据或者频繁访问相同数据时。为了解决这个问题,开发者通常会采用缓存技术来提升...
关于Vue页面级缓存解决方案feb-alive的讨论,我们需要先理解一些关键的概念和背景知识。 Vue.js 是一个流行的JavaScript框架,用于构建交互式的前端界面。在Vue中,`<keep-alive>`是一个内置的组件,可以缓存不活动...
【大型网站应对高负载和并发的解决方案】 大型网站在应对大量用户访问和高并发请求时,需要采取一系列的策略和技术来保证系统的稳定性和性能。首先,基础的解决方案包括使用高性能的服务器、高效的数据库、高效率的...
Ehcache是一款流行的Java缓存解决方案,提供从进程内缓存到分布式缓存的扩展能力。其特性包括自动过期策略和多种缓存策略,支持TB级缓存。 **Guava Cache** Guava Cache是Google的开源Java库Guava的一部分,提供了...
### 大型Web系统解决方案知识点解析 #### 一、项目理解与需求分析 - **需求背景**:项目针对的是一个大型互联网应用,预期用户数量达到3亿,这要求系统不仅要有出色的性能,还需要具备良好的可扩展性和高可用性。...
在本文中,我们将深入探讨Redis作为高效数据存储与缓存解决方案的关键特性、应用场景以及如何在实际开发中运用。 1. **Redis的数据结构** Redis支持多种数据结构,包括字符串(Strings)、哈希(Hashes)、列表(Lists)...
### 详解PHP缓存技术在网站开发中的应用 在当今高度依赖互联网的时代,网站的响应速度...然而,合理的缓存策略和管理机制是关键,开发者需要根据网站的具体需求和数据特性,灵活选择和调整缓存方案,以达到最佳效果。
组态王大型水利泵站SCADA系统解决方案 本解决方案旨在为大型水利泵站提供一个高效、可靠、经济的SCADA系统解决方案,旨在解决泵站自动化水平低、设备运 行 安全问题突出的问题,并确保泵站的安全、可靠、经济地运 ...
KYREE麒逸信息的BSCC缓存加速解决方案旨在应对互联网流量快速增长带来的挑战,通过智能缓存技术和流量管理,改善用户上网体验,降低网络运营成本。该系统不仅适用于大型网络环境,也能为个人用户提供更快的下载和...
缓存设计详解低成本的高性能Web应用解决方案样本 缓存设计是提高Web应用性能的关键一步骤。通过合理的缓存设计,开发人员可以在控制成本的情况下提高性能。缓存可以将数据复制到不同的计算机或不同的位置,从而减少...