复习:什么是缓存,有什么作用?广泛应用在CPU、浏览器、数据库……
缓存是个好东西,但是,没有免费的晚餐!要明白缓存的代价是“空间”,不能让缓存的内存空间挤压了正常的程序运行。
所以我们要不缓存,少缓存,或者只是短期缓存:
的数据,而是尽可能缓存和上述三项特征相反的数据。
而且要最大限度的利用缓存空间,还需要
一般来说,就是配置/设定:如何清理缓存?
最常见的策略就是:设置过期(Expire)时间:
还可以指定空间不足时移除哪些缓存项,比如:
还可以指定缓存依赖(dependency),当缓存所依赖的数据发生改变时,自动清理。
以及缓存数据的存储位置:在服务器,还是客户端?具体在服务器的哪个位置……
缓存策略的效果,可以用“命中率” (100次请求,70次是从缓存中获得,命中率:70%)来衡量,越高越好。
Web框架一般会为我们提供两种
仅仅通过在方法/页面添加一些声明(Spring的@Cache/C#的[OutputCache])就直接缓存方法的返回值,或者整个页面。
有时候又被称之为API,就是开发人员要自己写if...else...,调用一些类和方法,完成缓存数据的存取。
一般来说,其流程是固定的:
缓存的数据结构一般都是键值对。
常见面试题:Cache vs Session
缓存可以说是性能优化的通用/常用手段;但多线程和异步的使用,仅在特定情形下有用。因为:
服务器本身就是多线程的,本身就是能响应“并发”请求的。
以IIS为例,在IIS中可以设立若干个“应用程序池(application pool)”,每个池中都维护着若干线程。
IIS为每一个Request分配一个线程,Request结束线程不销毁而是“放回”线程池,以便于以后使用。
所以说理论上,开发人员是不用操心我的业务逻辑代码如何应对“并发”请求的。
比如:“我这个Action如果两个请求同时访问,会不会……”,不会的,假设不成立,一个请求就只会在一个线程中处理!
新开一个线程执行某个任务,以获得更快响应,只对“CPU密集”型任务有用。
就是说这个任务的实现需要CPU参与的大量运算,一个线程要10秒钟才能算完,开两个线程可能就只需要6秒。
但是Web应用一般来说,是“I/O密集”型的,更通俗的说,就是要操作数据库,不需要什么CPU的大量运算。数据库操作(微服务还要加上网络传输)通常就是性能瓶颈,多线程不仅解决不了问题,反而有可能加剧数据库/网络的拥堵。
无法减少单个请求的响应时间。
服务器上的“异步方法”和Ajax不一样!服务器是不能把响应“分批分次”的传递给客户端的。
不管在服务器上怎么异步,最终只有一次机会,把所有结果一次性的发送给客户端。
比如,发送Email,写log,这是服务器自己要做的事情,和生成响应无关。
可以先给用户一个响应(比如:评论发布成功),然后再发送Email给被评论文章作者:所以email发送的工作,可以新开一个线程处理。
log也是一样的,但要注意很多log组件已经进行了优化,要考虑是否有必要新开线程。
为了便于说明,先假设服务器是单线程的(多个线程也可能被全部占用),所有的请求就需要排队。
其中某一些请求,是:
这时候,将等待工作进行异步。服务器就可以“腾出手来”处理下一个请求。
所以在单位时间内,服务器就能够响应更多的请求,这就叫做“提高吞吐量”。
想象:银行柜台,工作人员闲着等别人来盖章/系统核实……后面的人就会很不舒服,能不能先把我的办了?
本质上就是让服务器“不要闲着”。但是,如果所有的业务都要在服务器上运行,消耗服务器的资源。同学们@想一想@,如果服务器:
使用异步/多线程的副作用(side effect):
简单理解:
总是最后考虑异步/多线程:(个人建议)
因为某些特定的业务,比如“秒杀”,会带来短时间极速攀升的访问量,让系统直接宕机。
这时候,使用队列,进行“削峰”,是一种普遍采用的手段。
其原理是:
队列可以是进程内的(类库),也可以是外部的(第三方组件/服务,比如RabbitMQ):一般都是现成的、开箱即用的。
.js/.css/图片/html内容本身,都可以
之后再发往前端。这样可以减少下载上述文件的:
因为更小/少的文件下载得更快。^_^
一般来说,压缩和合并都是由工具自动化实现。
这是“面试造火箭,工作拧螺丝”的典型:卷。
尤其是Java,初级程序员(2年工作经验)的,都要问这个问题。
上次老码农QQ群里聊天,一位老大哥说了句实话:
重庆能玩懂这个的,一只手数得过来!
为什么?不是它有多难,而是没有这种场景。
nginx/redis/cluster/队列/分库分表……这些不过都是工具,小白编程培训班的老师都可以讲;但是,你不能说你会这些工具你就有“高并发大流量”的经验了呀!
并发量怎么才算高,流量怎么才算大?没有统一标准的。大部分的应用,其实高不起来:
多快好省!前端后端,线上线下,名师精讲
更多了解 加: