#yyds干货盘点#关于动静态缓存的一些Tips

吾生也有涯,而知也无涯。这篇文章主要讲述#yyds干货盘点#关于动静态缓存的一些Tips相关的知识,希望能为你提供帮助。
浏览器缓存,也称为客户端缓存,是静态缓存中最常见、最直接的表现形式。在nginx中设置expires,并不是指把静态内容缓存在Nginx中,而是设置客户端浏览器缓存的时间。
服务器端的静态缓存技术主要分为磁盘缓存类和内存缓存类两大类。磁盘缓存,是指将静态资源文件通过磁盘进行缓存的技术。内存缓存,就是把静态文件缓存在服务器端的内存中。在这种缓存方式下,如若命中缓存的话,取内存中的缓存数据返回比取磁盘中的缓存数据返回性能要高很多。
小型应用中,Nginx作为前端反向代理服务器,主业务域名解析绑定在前端代理服务器上,且静态资源也存放至代理服务器上。在Nginx七层通过Rewrite对请求做判断,如果是静态资源请求,直接请求本机的静态资源,也可进一步设置对应的静态缓存。如果是动态请求,则转发给后端服务器处理。这是常规动静分离最为成熟的解决方案。
中型应用中,静态资源一般会和应用代码一起部署。要实现静态加速,前端只需要加个CDN,CDN会针对客户端请求,进行回源并主动缓存静态资源。
大型应用中,主业务的域名会直接绑定在业务服务器的负载均衡IP上。静态资源会采用单独的Web服务器部署,并且会跟静态资源绑定独立的二级域名来做请求分流。用户在请求对应的页面(包含静态请求和动态请求)时,静态请求会被隐式重定向(不显示跳转后的URL)引流到静态服务器上,所以对客户端而言是不可感知的。这里需要进行一定的代码改造。
动态缓存,用于缓存业务中的动态数据,如业务处理的临时数据、频繁对数据库访问查询的热点数据、用户Session数据、动态页面数据等,甚至频繁访问的静态页面数据也是通过动态缓存技术(Redis、Memcache)进行缓存的。
关于数据库缓存1、提高性能,数据库缓存的数据基本上都是存储在内存中的,相比I/O读写的速度,数据访问能更快速返回。2、对于数据库的增、删、查、改,数据库缓存技术应用场景绝大部分针对的是“查”的场景。3、在绝大多数的应用中,缓存中的数据和数据库中的数据是不一致的。4、缓存为数据库分担了很多压力,同时也为应用提供了较高的访问速度。
在分布式架构中,负载均衡的引入会导致文件存储需要集中管理,并且会出现Session会话的问题。在Session会话保持的技术中,通过动态缓存相应技术(Redis/Memcache)来集中存储及管理Session是比较成熟的架构。
Session是程序中用于和客户端请求进行会话保持的一种技术。php会默认将Session数据存在本机磁盘文件上,而Tomcat会默认将Session数据存放至JVM分配的内存中。
基于源IP的会话保持,是指负载均衡识别客户端请求的源IP地址,将同一IP地址的请求转发到同一台后端服务器进行处理。若将客户端的请求绑定在后端某一台服务器上,不让请求轮询到其他服务器上,那么就不会出现Session会话的问题。
为了解决基于源IP会话保持所带来的后端流量不均衡的问题,出现了基于浏览器Cookie的会话保持,它很好地解决了该问题。哪怕再多人共用一个IP也不用担心,因为客户端是根据客户端请求的Cookie进行转发的。七层SLB的会话保持,就是基于Cookie的会话保持的。
七层SLB Cookie处理主要分为以下两种。
1)植入Cookie:指客户端第一次访问时,负载均衡会在返回请求中植入Cookie,下次客户端携带此Cookie访问,负载均衡会将请求定向转发给之前记录到的后端服务器上。
2)重写Cookie:根据需要指定HTTP/HTTPS响应中插入Cookie,在后端服务器上维护该Cookie的过期时间和生存时间。
Session除了可以存放在本地内存中以外,当然也可以存放在本地磁盘文件上。存放在本地内存中的数据,服务器宕机、内存数据丢失,都会导致Session丢失,但可以通过Redis/Memcache等动态缓存技术将Session进行集中管理并共享。
Nginx的动态页面缓存,主要通过HTTP反向代理(负载均衡)内置Proxy模块的proxy_cache实现。基本上可以实现所有动态页面的缓存,当然,静态页面也能缓存。Nginx内置Proxy模板proxy_cache实现动静态缓存,缓存文件是存放在磁盘文件中的。在高并发访问的场景中,磁盘I/O可能是性能的瓶颈点。
Nginx内置的Memcached模块ngx_http_memcached_module,虽然实现了对Memcached的访问。但是数据的put存储,还要需要通过代码来操作。可以通过第三方模块memc-nginx和srcache-nginx构建高效透明的缓存机制。
【#yyds干货盘点#关于动静态缓存的一些Tips】PHP的动态页面缓存是通过FastCGI自带的缓存实现的,而不需要通过Nginx反向代理来设置对应的缓存配置。FastCGI也是将缓存文件存放在磁盘文件中的。在高并发访问的场景中,磁盘I/O也可能是性能的瓶颈点。

    推荐阅读