持久连接也称长连接,它本身是TCP通信的一种普遍方式,即在一次TCP通信中持续发送多份数据而不断开连接,与它相反的方式称为短连接,即建立连接后发送一份数据便断开。建立TCP连接本身是一项不小的开销,所以连接次数越少,越有利于性能的提升。长久以来大家习惯了一次性的http通信,即一次TCP连接处理一个http请求,回归到TCP传输层,长连接带来的好处显而易见,现在大部分浏览器和服务器开始支持长连接。浏览器支持长连接可以在浏览器发出的请求的数据头中看到:Connection:Keep—Alive,服务器的响应数据的数据头中也可看到。
服务器的并发策略:
本质上讲,所有到达服务器的请求都封装在IP包中,位于网卡的接受缓冲区中,这时web服务器软件要做的事就是不断读取这些请求并进行处理,然后将结果写到发送缓冲区。
缓存与缓冲:
缓存的目的就是把需要花费昂贵开销的计算结果保存起来,在需要的时候直接取出从而避免重复计算。一切缓存的本质都是如此。
缓冲的概念与此恰好相反。比如磁盘缓冲区,在将内存的数据存入磁盘时,很显然内存的速度比磁盘快得多,有了磁盘缓冲区后内存的数据可以源源不断流入磁盘缓冲区,最后再进入磁盘。
服务器端缓存(输出内容html页面化)
页面缓存(包括局部无缓存和直接访问缓存):
对于动态网页来说,缓存的实际内容就是动态网页输出的HTML,即页面缓存。其它动态内容比如动态图片或动态XML数据,也可以将它们的输出结果整体进行缓存,实现机制和动态网页一样。
通常我们将动态内容的缓存存储在服务器磁盘上。请求一个动态网页时服务器根据url参数的不同会展现出多种不同的结果,而每种结果都必须生成对应的缓存文件。
缓存存放在内存中效率比放在磁盘中高很多,因为磁盘I/O慢,也可以建立专门的服务器来存放缓存(当然是内存区域,磁盘的话没必要找专门的服务器),最快的还是直接存在web服务器本地的内存中。
局部无缓存:
有些特殊的动态网页,需要页面中某块内容及时更新,比如新闻类网页,阅读量统计,评论区域。流行的模板框架中都提供了局部无缓存的支持,不需要缓存的地方进行实时计算,然后和其余部分的缓存合并成最终的网页。
直接访问缓存:
可以将cache中的缓存直接放在项目中作为静态页面让用户直接访问,这样速度也有明显提升。但对服务器的出口带宽也有较高要求。
浏览器端缓存
浏览器端缓存用来存放对用户来说不变比如音乐,或随用户主动改变而变的东西如账号密码。对于高命中率的浏览器缓存可以存放在内存中,firefox的策略便是高命中率缓存在内存,低的在磁盘。
浏览器缓存存放在浏览器端本地,而缓存内容由服务器返回,任何一方都不能独立完成,因此需要一个协商:浏览器向web服务器请求一些内容时,服务器需要告诉浏览器哪些内容可以被缓存,然后将可以被缓存的内容保存在本地。下次浏览器请求这些内容时,向服务器发起询问是否可以使用本地的缓存,浏览器要么允许要么将最新内容送回浏览器。
分布式缓存:(数据库缓存)
前面讲的缓存的作用是避免重复计算,有的计算无法避免比如有的动态内容展示行为是根据用户的登录状态来展示对应的内容比如一个用户在不同的城市需要看到不同的天气预报。并且页面缓存只能改进读数据的速度,并无法改进写数据的速度。
我们可以像在读写磁盘前经过页高速缓存一样,在数据库和动态内容间建立一块缓存区。它可以部署在独立的服务器上,用来加速数据库的读写操作。缓存区实际由动态内容控制。
cookie
cookie是web服务器保存在浏览器上的小文件。它可以保存以用户信息为主键的数据。实现了浏览器端缓存。
cookie是一小块可以嵌入http请求和响应的数据。它在服务器端产生,作为响应头域的一部分返回给客户。
cookie的常用方式:将cookie写入访问者的计算机
从访问者的计算机中取回cookie
Cookie user=new Cookie("user","布斯");
user.setMaxAge(60*60);//以秒为单位
response.addCookie(user);
Cookie只支持保存ASCII编码,
中文要先进行转码:(getBytes也扯淡了。)
URLEncoder.encode(str,
"UTF-8"
));
URLDecoder.decode(str,
"UTF-8"
)