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

本文探讨了四种server性能优化方法,重点介绍了数据缓冲区的概念及其如何提高数据插入和查询性能。通过构建读缓冲区和写缓冲区,可以有效减少数据库操作频率,提升服务器性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

到此为止,一共介绍了四种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被选中的次数是一样的。

转载于:https://www.cnblogs.com/clnchanpin/p/7281200.html

资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 无锡平芯微半导体科技有限公司生产的A1SHB三极管(全称PW2301A)是一款P沟道增强型MOSFET,具备低内阻、高重复雪崩耐受能力以及高效电源切换设计等优势。其技术规格如下:最大漏源电压(VDS)为-20V,最大连续漏极电流(ID)为-3A,可在此条件下稳定工作;栅源电压(VGS)最大值为±12V,能承受正反向电压;脉冲漏极电流(IDM)可达-10A,适合处理短暂高电流脉冲;最大功率耗散(PD)为1W,可防止器件过热。A1SHB采用3引脚SOT23-3封装,小型化设计利于空间受限的应用场景。热特性方面,结到环境的热阻(RθJA)为125℃/W,即每增加1W功率损耗,结温上升125℃,提示设计电路时需考虑散热。 A1SHB的电气性能出色,开关特性优异。开关测试电路及波形图(图1、图2)展示了不同条件下的开关性能,包括开关上升时间(tr)、下降时间(tf)、开启时间(ton)和关闭时间(toff),这些参数对评估MOSFET在高频开关应用中的效率至关重要。图4呈现了漏极电流(ID)与漏源电压(VDS)的关系,图5描绘了输出特性曲线,反映不同栅源电压下漏极电流的变化。图6至图10进一步揭示性能特征:转移特性(图7)显示栅极电压(Vgs)对漏极电流的影响;漏源开态电阻(RDS(ON))随Vgs变化的曲线(图8、图9)展现不同控制电压下的阻抗;图10可能涉及电容特性,对开关操作的响应速度和稳定性有重要影响。 A1SHB三极管(PW2301A)是高性能P沟道MOSFET,适用于低内阻、高效率电源切换及其他多种应用。用户在设计电路时,需充分考虑其电气参数、封装尺寸及热管理,以确保器件的可靠性和长期稳定性。无锡平芯微半导体科技有限公司提供的技术支持和代理商服务,可为用户在产品选型和应用过程中提供有
资源下载链接为: https://pan.quark.cn/s/9648a1f24758 在 JavaScript 中实现点击展开与隐藏效果是一种非常实用的交互设计,它能够有效提升用户界面的动态性和用户体验。本文将详细阐述如何通过 JavaScript 实现这种功能,并提供一个完整的代码示例。为了实现这一功能,我们需要掌握基础的 HTML 和 CSS 知识,以便构建基本的页面结构和样式。 在这个示例中,我们有一个按钮和一个提示框(prompt)。默认情况下,提示框是隐藏的。当用户点击按钮时,提示框会显示出来;再次点击按钮时,提示框则会隐藏。以下是 HTML 部分的代码: 接下来是 CSS 部分。我们通过设置提示框的 display 属性为 none 来实现默认隐藏的效果: 最后,我们使用 JavaScript 来处理点击事件。我们利用事件监听机制,监听按钮的点击事件,并通过动态改变提示框的 display 属性来实现展开和隐藏的效果。以下是 JavaScript 部分的代码: 为了进一步增强用户体验,我们还添加了一个关闭按钮(closePrompt),用户可以通过点击该按钮来关闭提示框。以下是关闭按钮的 JavaScript 实现: 通过以上代码,我们就完成了点击展开隐藏效果的实现。这个简单的交互可以通过添加 CSS 动画效果(如渐显渐隐等)来进一步提升用户体验。此外,这个基本原理还可以扩展到其他类似的交互场景,例如折叠面板、下拉菜单等。 总结来说,JavaScript 实现点击展开隐藏效果主要涉及 HTML 元素的布局、CSS 的样式控制以及 JavaScript 的事件处理。通过监听点击事件并动态改变元素的样式,可以实现丰富的交互功能。在实际开发中,可以结合现代前端框架(如 React 或 Vue 等),将这些交互封装成组件,从而提高代码的复用性和维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值