缓存是系统快速响应的关键技术。它是一组为将来使用而保存的东西。它介于应用程序开发和系统开发之间。它经常被产品经理考虑。如果不是,则可以将其视为技术架构中的非功能约束。也就是说,缓存是系统调优常用且有效的方法。缓存策略在操作系统和应用程序系统中无处不在。很多技术都打着缓存的旗号,所以谈论缓存往往是似是而非的,与上下文有着密切的关系。也就是说,我们来看看缓存在不同场景下的分类。客户端缓存浏览器的缓存可以将之前渲染过的页面保存为一个文件,可以用来避免用户再次访问时的网络连接,从而减少负载。现在HTML5支持本地存储,大部分BS应用都可以轻松搞定。如何让客户端缓存对业务组件透明,及时更新客户端缓存数据,是客户端缓存应用成功的关键。客户端可以在内存、文件或本地数据库(如Sqlite)中缓存内容。例如iOS的图片缓存框架SDWeb架构如下:web代理web代理的作用类似于浏览器内置的缓存,但是它位于浏览器和互联网之间,通过网络中转网络请求代理。对于企业来说,可以节约成本,提高绩效。对于网络代理,Squid曾经很流行,它支持构建复杂缓存层次结构的能力、详细的日志记录、高性能缓存和用户身份验证支持。Squid还支持各种插件。例如,SquidGuard是一个提供URL过滤的插件,这对于阻止某些站点和内容非常有用。如果想分析Squid的各种指标,webalizer应该是个不错的选择。Squid的内部机制如下:边缘缓存边缘缓存位于应用服务器的前端,可以处理来自不同用户的请求。主要用于为用户提供静态内容,减少应用服务器的干预。边缘缓存的商业服务是CDN,比如AWS的CloudFront,我国的ChinaCache等。知名的边缘缓存开源工具是Varnish,它默认进行保守缓存。也就是说,Varnish只缓存它认为安全的内容。Varnish的一个特点是使用虚拟内存。精妙之处在于它利用了操作系统的管理机制。Varnish可以高度自定义如何处理请求以及缓存哪些内容。Varnish的内部机制如下:详见www.varnish-cache.org。平台缓存平台缓存是一个编写应用程序的框架,或者说是一个专门用于缓存的库(比如PHP中的Smarty模板库)。在Java语言中,缓存框架比较多,如EHcache、Cacheonix、Voldemort、JBossCache等。看看EHcache的体系结构:Ehcache是??一个用Java实现的开源分布式缓存框架,可以让数据在存储在不同服务器的内存中,需要数据时可以快速访问。通过声明配置、在xml中配置、在程序中配置或者调用构造方法时传入不同的参数。Voldemort是基于Java开发的分布式key-value缓存系统。与JBossCache一样,Voldemort也支持多台服务器之间的缓存同步,以增强系统可靠性和读取性能。简单来说,就平台级缓存而言,只需要在框架端配置属性即可,无需调用具体的方法或函数。应用缓存应用级缓存需要通过代码来实现缓存。这就是NoSQL获胜的地方。Redis和MongoDB都可以用作应用程序缓存的工具。典型的方式是每分钟或一段时间后统一生成某种类型的页面并保存在缓存中,或者在热点数据变化时更新缓存。Redis在应用程序级缓存中扮演着重要的角色。新浪微博几乎拥有全球最大的redis集群。Redis支持主从同步。数据可以从主服务器同步到任意数量的从服务器,从服务器可以是关联其他从服务器的主服务器。这使Redis可以执行单级树复制。存储可以有意或无意地写入数据。由于完全实现了发布/订阅机制,当树从数据库同步到任何地方时,它可以订阅一个频道并接收到主服务器的完整消息发布记录。同步有助于读取操作的可伸缩性和数据冗余。Redis有多种客户端编程语言,可以满足大多数应用。数据库缓存数据库缓存是一种特殊的缓存。大多数数据库无需配置即可快速运行,但并未针对特定需求进行优化。在调优数据库时,缓存优化是一项非常重要的工作。以MySQL为例,MySQL采用查询缓冲机制,将SELECT语句和查询结果存储在缓冲区中。以后对于同一条SELECT语句,直接从buffer中读取结果,节省查询时间,提高SQL性能。查询效率。query_cache_size设置是否合理,可以通过调整以下参数来了解:QcacheinsertsQcachehitsQcachelowmemprunesQcachefreeblocksQcachetotalblocks当然,深入数据库还有很多值得学习的地方。缓存协议支持对于web应用,http1.0提供了一些非常基础的缓存特性,比如在服务器端设置Expireshttp头来告诉客户端在重新请求文件之前缓存多长时间是安全的,可以通过if-修改后的条件请求使用缓存。其中,发送的时间是文件最初下载的时间,而不是即将过期的时间。如果文件没有改变,服务器可以响应304-NotModified。当客户端收到304代码时,它可以使用文件的缓存版本。客户端可以设置Pragma:no-cache从服务器获取内容。Http1.1有了很大的增强,缓存系统也正式化,引入了实体标签e-tags,它是文件或对象的唯一标识符。这意味着可以请求资源,提供它保存的文件,然后询问服务器文件是否已更改。如果某个文件的e-tag有效,服务器会产生一个304-NotModified响应并提供正确文件的e-tag,否则,发送一个200-OK响应。以浏览器为例的示意图如下:关于HTTP2.0中的缓存技术,还有待研究。总而言之,缓存——缓存是一项非常复杂的技术。除了应用场景,还需要了解命中、CacheMiss、存储成本、索引成本、失效、替换策略等诸多概念,进而了解缓存算法。、分布式缓存及其同步、多级缓存设计……真正掌握缓存技术。【本文来自专栏作家老曹的原创文章,作者微信公众号:哦家ArchiSelf,id:wrieless-com】
