这是我看到的博客,我认为它写得很好,很有启发性
本文主要与您讨论缓存的应用方案是什么?缓存给我们带来了什么便利?它同时给我们带来了什么问题?另外,简要介绍一些常用的缓存工具。去做就对了!走!
缓存CPU缓存的应用场景
是位于CPU和内存之间的临时存储。它的容量比内存小得多,但是交换速度比内存快得多。 (选择存储介质以提高访问速度:cache>内存;减少重复)
浏览器可以缓存一些静态资源,例如图片,js,css等。这些内容不会经常更改,因此不需要每次都请求它们。 (减少网络IO消耗并提高访问速度)

CDN缓存
客户端将首先检查浏览器的缓存。如果缓存过期,它将发送CDN之类的请求(请求)。 CDN将检查缓存的数据是否尚未过期,然后直接返回响应(Response),这分两个步骤完成。但是,如果CDN缓存过期,则有必要向应用程序服务器(Web服务器)发起请求以获取新的数据响应。这部分新数据将根据某种缓存策略缓存在CDN中。从下图可以看出,此时数据需要完成1–> 3–> 4–> 2,然后最终返回到浏览器端。这里的CDN(减少网络IO消耗,提高访问速度)

缓存
让我们看一下下面的图片,在WebServer和DB之间添加一层缓存。此缓存层的介质通常是内存,因为我们都知道存储在中的数据具有持久性的特征,因此读写将具有对于磁盘IO操作而言,内存的读写速度要比内存的读写速度快得多。磁盘的。 (选择存储介质以提高访问速度:内存>>磁盘;减少磁盘IO操作,减少重复查询并提高吞吐量)

业务层缓存
除了上面描述的缓存方案外,我们可能还需要更细粒度的缓存。我们可以在上图的某些方面进行更详细的处理。在下一篇文章中,我们将从实际的角度讨论业务缓存。
存储媒体访问速度的比较来自Google工程师Jeff Dean的分享,仅供参考:

存储介质速度
L1缓存参考读取CPU的一级缓存
0. 5 ns
分支预测错误(转移,分支预测)
5 ns
L2缓存参考读取CPU的二级缓存
7 ns
互斥锁/解锁互斥锁\解锁
100 ns
主存储器参考读取存储器数据
100 ns
使用Zippy 1k字节压缩压缩1K字节
10,000 ns
通过1 Gbps网络发送2K字节通过1 Gbps网络发送2K字节
20,000 ns
从内存中顺序读取1 MB从内存中顺序读取1 MB
250,000 ns
同一数据中心内的往返相同数据中心内的往返一次,一次ping通
500,000 ns
磁盘寻道
10,000,000 ns
从网络顺序读取1 MB数据,从网络顺序读取1 MB数据
10,000,000 ns
从磁盘顺序读取1 MB,从磁盘顺序读取1MB
30,000,000 ns
发送数据包CA->荷兰-> CA对数据包进行一次远程访问
150,000,000 ns
缓存的工作方式
一句话概述:更快的读写存储介质+减少的IO +减少的CPU计算=性能优化。
通过上述应用场景(用红色标记),我们知道缓存的基本原理已通过这些方面进行了优化。
在实际应用中,我们需要对数据进行分类以更好地使用缓存和一些辅助策略。例如,什么是热数据和冷数据?哪个数据量如此之大,以至于读取会严重影响IO?哪些数据检查更多而更改更少(日志数据,搜寻器数据)?哪些数据是非常复杂的计算的结果(这些宝贵的数据需要保存和使用)? ...
缓存的好处
显然,缓存带给我们的最直接的体验是“快速”,让我们总结一下:
通过减少IO(包括磁盘和网络)并减少释放CPU的计算量(CPU计算)来提高吞吐量,所有这些都提高了系统的响应速度。
通过方面处理方法,可以在所有级别上插入和拔出它,这是用于所有性能优化的最简单,最有效的解决方案。 (对于不熟悉业务代码或算法的优化器,显而易见的是,添加缓存层具有较低的复杂性和风险,而看似简单的缓存层可能会大大超出它为系统带来的性能优化)
由缓存引起的麻烦
我们不能否认缓存为我们带来了很多便利,同时我们也不能忽略缓存确实给我们带来了很多麻烦:
数据一致性和实时性能会受到影响。 (有必要评估数据的一致性和及时性,然后确定是否要缓存或设置缓存的过期时间,例如个性化数据是否值得缓存?)
由高速缓存的媒体引起的不可靠性。 (如果通常将内存用作高速缓存,则在计算机发生故障时如何确保高速缓存的高可用性?请考虑分配高速缓存以使高速缓存具有高可用性。与此同时,您需要接受这样的问题:不安全会带来数据。在异常情况下,有规律的持久性等情况下进行补偿。
缓存的数据使故障排除更加困难。由于访问时缓存命中数随时发生变化,因此缓存的行为难以重现,从而难以对错误进行故障排除。
进程内缓存可能会增加GC压力:在具有垃圾回收功能的语言(例如Java)中,大量长寿命的缓存对象将增加垃圾回收的时间和频率。
正如我之前提到的,在使用缓存之前,我们需要对数据进行分类,估计访问行为,考虑需要缓存哪些数据以及应该使用哪种策略进行缓存?这样,我们就不会被缓存所困扰,从而避免了这些问题。
常用的缓存工具
对于业务缓存,常用的开源缓存工具为:ehcache,memcache和Redis。
Ehcache是一个纯Java进程内缓存框架,hibernate将其用作第二级缓存。同时,ehcache可以通过多播实现群集。我主要将其用于的本地缓存和高层缓存。
memcache是一个分布式高速缓存系统,它提供简单的数据存储(例如键值),可以充分利用多核CPU,并且没有持久性功能。当我在Web集群上工作时使用它,主要用于会话共享和页面对象缓存。
Redis的高性能键值系统提供了丰富的数据类型。单核CPU具有抵御并发的能力,并具有持久性和主从复制功能。我主要使用redis的redis前哨,根据业务的不同将其分为多个组。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-373466-1.html
得治
让人匪夷所思