优化页面访问速度(三) ——服务端优化

优化页面访问速度(三)

——服务端优化

一、概述

服务端的优化,主要可以通过消息队列、减少数据库请求(缓存)、并发处理、页面静态化等方式处理。

二、消息队列

1、解决问题

消息队列(Message Queue,MQ)有许多不同的实现方式,可以用rabbitmq、activemq、rocketmq,也可以用任务分发系统gearman。

消息队列主要是解决消息的异步发送,即对于某个系统不需要关心的内容,只需要发布一个处理完毕的消息,带上一些参数,有需要的系统自行订阅。例如一些任务执行完成的回调函数,就可以用mq来实现异步回调。

2、处理方式

以rabbitmq为例。Rabbitmq的服务器,可以认为是消息的生产者和消费者的中转平台。生产者发布消息给rabbitmq服务器的交换机(exchange),发布的时候会定义一些路由规则(routing key)。Rabbitmq服务器根据路由规则,将消息从exchange转发到对应的队列(queue)中,再由消费者从queue中取消息,进行处理。如下图所示:

为了加快处理速度,防止队列的堆积,可以同时起多个消费者进程,用于消费队列的内容。

3、确保消费

Rabbitmq有重试机制,在没有发布成功时,会自动重试发送。当然,如果要确保消息被消费,可以设置类似TCP的三次握手方式,要求消费者完成消息的处理后,再发布一条消息,告知生产者。

生产者可以将发送的消息单独记录到数据库的一张表中,并且在接到消费者确认处理的消息后,把对应的数据置状态。

同时,可以编写一个crontab,定时来扫描这个表,将超过一定时间(如10分钟)未被置成功状态的记录,重新发布一次。

用单独的表来记录信息,好处在于,只要表中有数据,表明消息已经发布出去。这样当出现消息为被处理的问题的时候,易于确认是消息未发布还是消息接收处理存在问题。

当然,这要求消息接收方的处理方法是幂等的,即对同一条消息,无论接到多少次,只处理一次。

4、rabbitmq的routing key

Rabbitmq有好几种处理方式,如下:

1)广播

将消息发布到所有队列中,由消费者去接收感兴趣的消息,对于不感兴趣的消息直接丢弃。

2)direct

指定发送到某个队列中。

3)topic

采用正则的方式,将消息发布到某些队列中,例如a.*,发布到所有名为a.开头的队列。

三、缓存

1、解决问题

缓存的目的,主要在于减少对数据库的操作。数据库的请求,需要占用I/O资源,而缓存是存在内存中的,速度会快的多。

因此,对于频繁访问的数据,且实时性要求没那么高的,可以通过缓存来减少对数据库的压力。

另外,对于需要频繁修改数据的(如文章点击量)、短时间内大量访问的(秒杀系统),用缓存也是比较好的解决方案。

缓存常用的就是redis和memcache。

2、redis和memcache的区别

Memcache是纯粹的缓存,只有一种key-value形式的存储。

Redis功能更加强大,支持五种数据结构,包括string、list、hash、set、sorted-set,支持数据的持久化(AOF、快照),支持事务处理,支持哨兵监控,且可以临时突破内存限制(通过持久化的方式)。

3、key的设置方式

通常,用 方法名:id 的方式来作为key,这样比较方便来查找。

4、缓存会出现的问题

缓存会出现缓存穿透、缓存雪崩、缓存击穿。

1)缓存穿透

当大量查询不存在的key,由于正常情况下查询结果不存在的不会存到缓存中,这样会导致大量的查询绕过缓存直接查询数据库。

解决方案:对于数据库不存在的内容,也可以保存一小段时间随机的时间,如3分钟,这样可以避免绕过数据库的行为。

2)缓存雪崩

当所有的key都设置成同一个时间,会出现同一个时间所有key都过期,这样会发生一瞬间大量请求数据库的情况。

解决方案:对不同的key,设置一个随机的时间范围,比如4分58秒~5分3秒的过期时间,这样可以避免同一时间都过期。

3)缓存击穿

对于某个key,在一个很短的时间内并发大量访问,则所有的请求都绕过缓存去数据库取数据。

解决方案:可以设置互斥锁来解决问题。即请求缓存不存在的时候,先去访问互斥锁,redis的setnx、memcache的add 某个key。此时,请求数据库,并将请求结果存入缓存。

这样,下一个请求来的时候,由于存在互斥锁,key存在的时候无法添加,则表示数据被锁了,可以随机等待一个短暂的时间再请求锁,直到请求成功,再去访问一次缓存,通常此时缓存已经有内容了。如果还没有内容,可以再去请求数据库。

5、缓存过期策略——LRU

缓存内容太多,超过机器的内存时,需要一个策略剔除部分缓存内容,最常用的是LRU策略,即最近最少使用。

具体实现方式,是使用一个队列来维护缓存,当某个缓存被访问,则从队列底部去除,再添加到队列的头部,这样需要剔除的数据都是最久没有访问的数据。

存在问题:

当某个时间有大量的不同的key的访问,会把队列弄脏,造成需要的数据被剔除。

解决方案:

1)可以用两个队列,当数据访问一次放到第一个队列,再次访问挪到第二个队列去,然后LRU规则先清理第一个队列。

2)也可以用多个权重队列,把重要的内容、可能常访问的内容,都缓存到高级别的队列中去,把一些不怎么用的内容放到低级的队列中。

四、并发处理

PHP的并发处理,可以用swoole框架来解决,其可以控制并发消费内容。例如一个页面的展示,需要从几个不同的系统取数据,则可以异步取多个地方的数据,在最终汇总后一起处理。

Swoole框架我也不太熟,后面学习了再分享这部分内容。

五、页面静态化

Nginx没有处理PHP的能力,遇到PHP文件都要转发给php-fpm来处理,而遇到html、js、css等,可以直接处理返回给浏览器。

因此,在没有实现前后端完全分离的页面,可以使用静态化的方式,将不常变动的内容,在第一次访问php文件的时候,将其转存为html文件,并且设定一个过期时间。

后面访问的时候,根据Linux文件创建的时间,判断是否过期,当未到过期时间,可以由Nginx直接取对应的html文件进行返回。

原文地址:https://www.cnblogs.com/zmdComeOn/p/11704925.html

时间: 2024-08-16 10:44:34

优化页面访问速度(三) ——服务端优化的相关文章

优化页面访问速度(一)——综述

优化页面访问速度(一) ——综述 一.概述 优化页面访问速度,首先需要了解用户在浏览器输入url后,最终是如何看到所需的页面.在了解整个流程后,可以逐个步骤进行优化. 二.从URL到页面 大致流程如下: 1.DNS服务器解析域名,并转成IP,返回给浏览器,浏览器直接通过IP来访问. 2.根据IP,通过各种网关.路由器.交换机,最终访问到代码所在的Nginx服务器上. 3.Nginx解析URL,对于js.css.图片等静态资源,直接找到对应文件并返回:如果是php文件,由于Nginx本身不会处理p

优化页面访问速度(四) ——前端优化

优化页面访问速度(四) ——前端优化 一.概述 前端的优化,主要可以通过减少HTTP请求.非实时请求改异步.缓存.文件压缩.CDN加速.独立图片服务器等. 二.减少HTTP请求 1.HTTP开销 HTTP请求,需要耗费资源,主要包括域名解析.建立TCP连接.发送请求.等待处理结果.下载资源.解析请求等. 因此,减少HTTP请求,利于优化页面访问速度. 2.图片地图 对于多个图片,如连续的几个按钮,每个按钮都是一个小图片.如果逐个加载图片,则需要发送多个请求,分别获取这些图片文件. 这里,可以将这

优化页面访问速度(二) ——数据库优化

优化页面访问速度(二) ——数据库优化 一.概述 数据库优化,主要包括数据表设计.索引.sql语句.表拆分.数据库服务器架构等方向的优化. 二.数据库设计 在建表的时候,就需要考虑到将来的使用场景,尽量在建表初期就设计好. 1.存储引擎 Mysql常被提到的存储引擎就是InnoDB和MySIAM,其实现在主要都在用InnoDB了.两者的区别: InnoDB支持事务,索引和数据存在一个文件,主键查询速度快(主键就是索引B+树的叶子节点,而数据就绑定在叶子节点),行级锁,支持外键,恢复起来较快. M

高性能服务端优化

达达CTO谈创业公司如何走高性能服务端优化之路 目录[-] 业务场景 最初的技术选型 读写分离 垂直分库 水平分库(sharding) 总结 ##业务场景 达达是全国领先的最后三公里物流配送平台. 达达的业务模式与滴滴以及Uber很相似,以众包的方式利用社会闲散人力资源,解决O2O最后三公里即时性配送难题. 达达业务主要包含两部分:商家发单,配送员接单配送,如下图所示. ![输入图片说明](https://static.oschina.net/uploads/img/201602/2615010

提高 SharePoint 页面访问速度之 IIS 应用池回收

相信大家都有这样的体会,我们企业内部的 SharePoint 在使用了一段时间之后,都会有访问速度降低,页面访问速度缓慢的问题,除了服务器硬件瓶颈所导致的原因, 还有一些其他的原因,这些原因从各个层面对SharePoint 造成很多的干扰,今天我们就来说其中的一个,IIS应用池回收. SharePoint 在长期的运行过程当中,服务器内存中会存储很多缓存信息,以帮助下次用户访问时能够快速响应,但是这样的日积月累,也使得内存池承受了很大的压力, 从而形成臃肿的缓存区,那么为了减小服务的负担,IIS

HTML5移动开发之路(51)——jquerymobile中改善页面访问速度

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(51)--jquerymobile中改善页面访问速度 在使用jQuery Mobile进行开发的时候可以选择单页模版和多页模版,在使用单页模版的时候从一个页面跳转到另一个页面的时候需要从服务器请求,用户会感到略有停顿.使用多页模版,可以改善页面跳转之间的流畅性,但是多个页面要一次性下载,所以下载时间变长,用户体验也会受到影响. 在基于预取技术的开发中,当第一个页面的DOM对象加载完成后,jQuery Mob

提高 SharePoint 页面访问速度之“暖场”脚本

上一篇文章我们讲到了关于如果采用IIS应用池回收技术来提高SharePoint的页面访问速度,今天来给大家讲一个SharePoint圈儿内"著名"的暖场脚本(Warm-up-script). 所谓暖场脚本,顾名思义,就是在一切正式的表演之前,先来给大家暖暖场,不至于使得大家感觉到尴尬和不自在.同理,其实就是帮助SharePoint实现访问提速,不至于访问卡顿和缓慢. 不知道大家有没有这样的感受,每天早上来上班,会发现第一次打开SharePoint的速度很慢,之后会好很多,这是什么原因呢

小强的HTML5移动开发之路(51)——jquerymobile中改善页面访问速度

在使用jQuery Mobile进行开发的时候可以选择单页模版和多页模版,在使用单页模版的时候从一个页面跳转到另一个页面的时候需要从服务器请求,用户会感到略有停顿.使用多页模版,可以改善页面跳转之间的流畅性,但是多个页面要一次性下载,所以下载时间变长,用户体验也会受到影响. 在基于预取技术的开发中,当第一个页面的DOM对象加载完成后,jQuery Mobile会对标记data-prefetch的链接地址进行预取操作.预取的详细过程如下: 注意:使用预取功能时,不建议给所有链接都添加data-pr

WebSocket安卓客户端实现详解(三)–服务端主动通知

WebSocket安卓客户端实现详解(三)–服务端主动通知 本篇依旧是接着上一篇继续扩展,还没看过之前博客的小伙伴,这里附上前几篇地址 WebSocket安卓客户端实现详解(一)–连接建立与重连 WebSocket安卓客户端实现详解(二)–客户端发送请求 终于是最后一篇啦,有点激动\ ( ≧▽≦ ) /啦啦啦, 服务端主动通知 热身完毕,我们先回顾下第一篇中讲到的服务端主动通知的流程 根据notify中事件类型找到对应的处理类,处理对应逻辑. 然后用eventbus通知对应的ui界面更新. 如果