架构高性能站点秘笈(六)——构建数据缓冲区

到此为止,一共介绍了四种server性能优化的方法。各自是:动态内容缓存、浏览器缓存、反向代理缓存、Web组件分离。

我们发如今这四种方法中,“缓存”占了大头!

确实如此,“缓存”是server性能优化的核心思想。我们提出的各种优化方法本质上仅仅是把“缓存”用在了不同的地方。并依据使用位置的不同,个性化定制缓存的用法。接下来又要介绍一种缓存的新用法——数据缓冲区。

之前介绍的动态内容缓存、浏览器缓存都是将整个静态页面进行缓存。这样的方式有个弊端:因为缓存了总体页面,因此缓存的数据较为笨重。缺乏灵活性。为了解决问题。我们能够仅仅缓存数据库中的数据。当用户请求某一页面时。再依据用户的需求从数据缓存中抽出须要的数据。组装成页面返回给用户,从而提升了数据使用的灵活性

什么是数据缓冲区?数据缓冲区有啥优点?

我们能够在数据库之前开辟一块内存缓冲区,我们把这块区域称为数据缓冲区。

全部从数据库出来和进入的数据都要经过该缓冲区。

那么,数据想要进入数据库,首先须要进入缓冲区,当缓冲区存满时,一次性地写入数据库。从而减少了数据库操作的频率;同理,从数据库出来的数据也会进入该缓冲区,那么下次须要同样数据的时候直接从缓冲区中取就可以。

要知道,从内存中取数据要比从数据库中取数据快多了,因此缓冲区能大大提升数据插入和查询的性能。

怎样构建数据缓冲区?

依据刚才对缓冲区的介绍,我们能够将数据缓冲区分为:读缓冲和写缓冲。

  • 读缓冲:用于存放即将被存入数据库的数据
  • 写缓存:用于存放近期一段时间訪问频率较高的数据

使用Memcache实现数据缓冲区

这里我们使用memcache来实现数据缓冲区。

详细的Memcache的介绍请自行百度吧。这里简介下Memcache的几个优点:

  1. 查询效率高

    Memcache採用健值对的形式存储数据,而且採用优化了的基于Key的Hash算法,因此无论Memcache中存储了多少数据。依据key查询value的时间复杂度永远是O(1)!

  2. 网络并发能力强

    Memcache採用了libevent函数库来实现TCP通信,因此在较高并发数的情况下仍然能高效工作。

    大家不用操心它的效率。

关于Memcache的使用请移步至:在Linux上安装Memcached服务

1. 构建写缓冲区

场景如果:实现点击量的记录

最Low的做法是每有一个用户点击,就把数据库中的相关值加1.但这样的每次更新数据库的做法显然不够高效。当訪问量非常大时,须要不断更新数据库。大大减少server的总体性能。

因此,訪问量的登记全然能够存入写缓存中,当訪问量存到1000时,一次性写入数据库,从而数据库更新频率从1000次减少到1次。大大节省了开销。

当然。使用缓存随之会带来数据实时性减少的问题。但对于像訪问量这样的无关紧要的数据来说,用减少实时性来换取server性能开销,还是相当划算的。

注意:小心线程安全问题!

要实现缓存中的指定页面的訪问量加一,一共须要三步:

  1. 将指定页面的当前訪问量取出来
  2. 訪问量加一
  3. 更新缓存中该页面的訪问量

因此。若多线程同一时候訪问,会出现线程安全问题。

因此我们须要使用memcache的原子加一操作(increment)来避免线程安全问题。

2. 构建读缓冲区

场景如果:检查用户是否登录



补充知识:怎样推断用户是否登录?

用户点击“记住password”后就不须要再输入password。那么当用户再次訪问站点时,server该怎样推断该用户是否已经登录呢?

在非常久曾经,用户登录之后server会在用户的Cookie中存放该用户的id。若用户再次訪问站点时,如果请求中包括用户id就觉得他已经登录,否则就须要又一次登录。

但这样的方法会引起安全隐患,因为id具有规律性,黑客往往会篡改他本地的Cookie来冒充其它用户登录。

为了避免这样的情况的发生。在用户注冊的时候,server会为每一个用户生成一个无规律的随机字符串ticket,用于标示该用户,并将其存入用户的Cookie。

因为字符串随机生成,没有了规律性,因此黑客没办法猜到其它用户的ticket。当用户每次訪问站点时。如果请求中携带了ticket,我们就查询数据库中是否存在该ticket,若存在则表示该用户已经登录。否则须要又一次登录。



那么问题来了,如果每次推断ticket是否存在都须要查询数据库的话。那么当用户量非常大的时候会影响server总体性能。因此我们能够将全部的ticket存入读缓存,并每隔一段时间更新。确保ticket的实时性。从而当用户訪问站点时,仅仅须要从读缓存中查询ticket是否存在就可以。无需查询数据库,从而节约了数据库开销。

怎样构建分布式数据缓冲区?

当一个memcache存不下全部缓存的时候,我们须要使用多个memcache来实现分布式数据缓冲区。

“分布式数据缓冲区”看似高大上。事实上非常easy。

如果如今有三台server上执行Memcache,IP各自是:

- 10.20.100.101

- 10.20.100.102

- 10.20.100.103

在存储之前,我们须要确定到底把数据存储在哪台缓存server上。我们希望数据能够平均地存储在三台server上,从而实现负载均衡。能够採用随机分配的方法:

  1. 将每一个请求的URL进行MD5运算,得到32字节的16进制数;
  2. 取前5位,模以3
  3. 得到的结果就是缓存server的ID

注:通过概率论能够证明。当訪问量非常大的时候。採用随机分配的方式能够保证每台缓存server被选中的次数是一样的。

时间: 2024-11-10 01:21:48

架构高性能站点秘笈(六)——构建数据缓冲区的相关文章

架构高性能网站秘笈(六)——负载均衡

什么是负载均衡? 当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能.那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台后端服务器去处理. 那么在这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡问题. 下面详细介绍负载均衡的四种实现方式. HTTP重定向实现负载均衡 过程描述 当用户向服务器发起请求时,请求首先被集群

架构高性能网站秘笈(一)——了解衡量网站性能的指标

服务器如何发送数据? 服务器程序将需要发送的数据写入该程序的内存空间中: 服务器程序通过操作系统的接口向内核发出系统调用: 系统内核将用户态内存空间中的数据复制到内核缓冲区中去,然后通知网卡过来取:此后CPU转而做其他处理: 网卡到CPU指定的内核缓冲区中将数据复制到网卡缓冲区中: 网卡将字节转换成二进制位,再以电信号的形式输出至网络. 注意:数据在计算机内部的复制是按照总线的宽度来复制的.比如在32位的操作系统中,数据每次都复制32位. 总线就像是一条32/64车道的马路,数据在计算机中是以0

Spark GraphX宝刀出鞘,图文并茂研习图计算秘笈与熟练的掌握Scala语言【大数据Spark

Spark GraphX宝刀出鞘,图文并茂研习图计算秘笈 大数据的概念与应用,正随着智能手机.平板电脑的快速流行而日渐普及,大数据中图的并行化处理一直是一个非常热门的话题.图计算正在被广泛地应用于社交网络.电子商务,地图等领域.对于图计算的两个核心问题:图存储模式和图计算模型,Spark GraphX给出了近乎完美的答案, 而Spark GraphX作为图计算领域的屠龙宝刀,对Pregel  API的支持更是让Spark GraphX如虎添翼.Spark GraphX可以轻而易举的完成基于度分布

“云中论道”之——华山论剑 ,唯快不破:秘笈分享

"云中论道"技术课堂第二课开讲时间到~ 这次我们邀请到的是来自微软开源技术中心的高级产品经理,人称"蓦然汐来".她将为我们介绍,近一年来微软开源技术中心在Linux上的进一步努力下,运行于Hyper-V之上的Linux的性能有了哪些新的重大提升:在云的论剑中,如何保持快速度.高性能.全新秘笈,马上为大家揭晓! 本文作者介绍: 花名"蓦然汐来",现任微软中国云计算与企业产品工程部开源技术中心高级产品经理,负责微软虚拟化平台 Hyper-v 和公有云

《微信百万粉丝大号成长秘笈》:基本是公开资料,公开的公众号图文占了不少篇幅。1星

作者分析了12个大号的运营情况.其中前6个是超级大号,后6个是有特色的小大号.绝大部分资料是公开资料,个别大号作者做了后台数据的截屏.作者跟这些大号的运营者有过一些沟通(也可能是从公开的资料中copy来的). 总体来说没看见有深度的分析,秘笈就更谈不上了.每个公众号的文章都放了好几页,字大行疏,总体来说信息量比较少.总体评价1星.

Clojure数据分析秘笈 笔记

Clojure数据分析秘笈 目录 1 导入分析数据 2 清洗和校验数据 3 使用并发编程管理复杂度 4 使用并行编程提高性能 5 Cascalog 6 使用Incanter数据集 7 使用Incanter准备并执行数据分析 8 使用Mathematica和R 9 聚类.分类和使用Weka 10 使用Incanter绘图 11 创建网页图表 导入分析数据 $ lein new getting-data 从CSV 从JSON 使用Incanter 从JDBC 从XML 利用zipper浏览XML结构

我的高效编程秘笈

准确来说是2012年11月的时候开始学编程的,那个时候我上大二,到现在学习编程快三年了,期间大部分时间处于自学状态,今天就跟大家聊聊我的高效编程秘笈. 一.活学活用office 首先请大家看清楚标题,我说的是office,不是wps,这两个差异还是非常大的,特别是excel中的差异非常明显.如果你能够熟练掌握Word和Excel的使用,这对你的编程效率会有质的提高. 说说我自己身上的一个事吧. 前些天公司产品要升级2.0,手机上有个数据表要根据服务端返回的字段重新设计,我把服务端返回的数据打印出

JAVA架构师之SpringBoot,SpringCloud构建微服务项目架构

springcloud微服务项目架构搭建第一天(一).项目简介1.准备工作:idea创建springboot模板 2.后台应该涉及的技术(后期可能会有删改) Spring Framework 容器SpringMVC MVC框架Apache Shiro 安全框架Spring session 分布式Session管理MyBatis ORM框架MyBatis Generator 代码生成PageHelper MyBatis物理分页插件Druid 数据库连接池FluentValidator 校验框架Th

点石成金 访客至上的Web和移动可用性设计秘笈pdf

下载地址:网盘下载 编辑推荐 原书第三版全新上市! 第11届Jolt生产效率大奖获奖图书,被Web设计人员奉为圭臬的经典之作 第2版全球销量超过35万册,网站的网页设计类图书的销量排行佼佼者 访客至上的Web和可用性设计秘笈 内容简介 <点石成金:访客至上的Web和移动可用性设计秘笈(原书第3版)>是一本关于Web设计原则而不是Web设计技术的书.<点石成金:访客至上的Web和移动可用性设计秘笈(原书第3版)>作者是Web设计专家,具有丰富的实践经验.他用幽默的语言为你揭示Web设