`
androidssh
  • 浏览: 112847 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

对于大型网站您有什么好的缓存解决方案

    博客分类:
  • jsp
阅读更多
我们的缓存策略将重点放在更新策略而不是只读策略上。只读缓存以及共性缓存策略性质实现的难度并不大,我们要解决的是非共性缓存,并发更新缓存,可扩充性缓存,分布式缓存更新运算的问题,而对于共性的东西的话我们可以很轻松的实现,而不必做太多的运算。

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

简单的总结了一下关于缓存策略讨论的重点
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分钟或者更长时间的延迟。
集成原则
将搜索字段和表整合出来,用独立的只读查询服务器来分担负荷。
分享到:
评论

相关推荐

    最新亿级流量电商详情页系统的大型高并发与高可用缓存架构实战第一版附全套资料

    熟练掌握亿级流量电商网站的商品详情页架构如何设计与实现,能够应对各种复杂场景与挑战问题的缓存架构如何设计与实现,高阶的缓存架构以及解决方案如何应对各种棘手的高并发场景下的难题,复杂的缓存架构所处的...

    springboot大型java电商分布式解决方案实战视频

    dubbox springboot 消息中间件 solr CAS 缓存策略 跨域解决方案

    分布式缓存系统Memcached

    基于memcached作者对分布式cache的理解和解决方案。memcached完全可以用到其他地方 比如分布式数据库,分布式计算等领域。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。  2.Memcached工作机制 ...

    亿级流量电商详情页系统的大型高并发与高可用缓存架构实战2

    解决方案:基于随机过期时间的缓存失效解决方案课程大纲:第01节课程介绍以及高并发高可用复杂系统中的缓存架构有哪些东西?第02节基于大型电商网站中的商品详情页系统

    大型分布式网站架构

    大型分布式网站架构:基础设施-缓存+NoSQL,Web高并发及解决方案等等

    浪潮Loushang平台电子政务行业解决方案

    浪潮loushang框架经过多年的大型项目的锤炼和考验,已经形成了各个行业成熟的解决方案。它是基于J2EE的三层结构框架。采用B/S架构,客户端只要采用IE即可访问系统,所以对客户端机器配置要求很低。Loushang框架包括...

    大型网站架构系列文档

    对于大型网站,每天的数据量可能就上百万,如果一个设计不好的多对多关系,在前期是没有任何问题的,但是随着用户的增长,数据量会是几何级的增长的。在这个时候我们对于一个表的select和update的时候(还不说多表...

    非常全面的高性能高并发服务器架构解决方案

    高性能高并发服务器架构解决方案 高性能高并发服务器架构是指一种能够处理大量用户请求和高并发访问的服务器架构解决方案。在当前的互联网时代,高性能高并发服务器架构已经成为网站运营商和开发者的必备技术之一。...

    基于均衡数据放置策略的分布式网络存储编码缓存方案

    为了保证网络存储的负载平衡并避免在节点或磁盘故障的情况下造成不可恢复的损失,提出一种基于均衡数据放置策略的分布式网络存储编码缓存方案,针对大型高速缓存和小型缓存分别给出了不同的解决办法。首先,将Maddah...

    论文研究-动态Web应用中的数据库缓存系统 .pdf

    动态Web应用中的数据库缓存系统,林帆,,本文描述了一款专门针对大型动态Web应用的通用的数据库缓存系统。首先,介绍了该数据库缓存系统的系统模型,它采用了二级缓存的机

    大型网站高并发解决方案分析之图片服务器分离架构

    1.介绍 现在很多的网站上都会用到大量的图片,而图片是网页传输中占主要的数据量,也是影响网站性能的...2, 能够专门对图片服务器进行优化-为图片服务设置有针对性的缓存方案,减少带宽成本,提高访问速度。 3, 提高

    Memcached在大型网站中应用.doc

    memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash...基于memcached作者对分布式cache的理解和解决方案。memcached完全可以用到其他地方 比如分布式数据库, 分布式计算等领域。

    java高并发解决方案

    在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。但是除了这几个方面,还没法根本解决大型网站面临的高负载...

    大型高并发 web 应用系统架构

    文章首先讨论外网中在全国范围使用的镜像网站,CDN 内容分 发网络等加速技术,其次着重对本地服务器内网中集群分布,分层处理进行详细分析,包括 硬件解决方案和软件解决方案的交换负载均衡技术,基于磁盘缓存模式和...

    磁带库海量存储解决方案

    ADIC公司的AMASS近线存储管理软件,使用基于UNIX的...其块级数据访问、可配置的缓存和磁盘索引提供了快速的性能,甚至是对大型数据集。可应用在石油、气象、视频、安保、政府部门、科研机构等行业提供海量的存储需求。

    网站架构技术

    解决方案: 不同的数据库都有自己的数据库的主从复制功能 使用反向代理与CDN加速网站响应 反向代理产品 ngix 使用分布式文件系统和分布式数据库系统 使用no-sql和搜索引擎 站内搜索 lucene ...

    探秘Spring框架解决循环依赖的高效策略

    通过这三级缓存,Spring能在不牺牲性能的同时,提供强大的循环依赖解决方案。此外,Spring的设计理念也鼓励开发者遵循良好的设计模式,从而避免循环依赖的产生。这种解决方案不仅体现了Spring框架的高度灵活性,也为...

    高并发高流量网站架构

    然后在局域网层次对第四层交换技术,包括硬件解决方案F5和软件解决方案LVS,进行了简单的讨论。接下来在单服务器层次,本文着重讨论了单台服务器的Socket优化,硬盘级缓存技术,内存级缓存技术,CPU与IO平衡技术(即...

Global site tag (gtag.js) - Google Analytics