`
足至迹留
  • 浏览: 495745 次
  • 性别: Icon_minigender_1
  • 来自: OnePiece
社区版块
存档分类
最新评论

<官网翻译V2.9.0-1>About_Ehcache

阅读更多
【本文翻译官网文档http://www.ehcache.org/documentation/2.9/pdf/index,错误及不准确之处多谢指出~】

1. Ehcache Overview
1.1 What is Ehcache?
Ehcache是一个开放源代码的,基于标准的高速缓存。它能提高加载性能,减轻数据库压力,并简化可扩展性。作为一个强大的,成熟的,功能齐全的解决方案,它是当今最广泛使用的基于Java的缓存。您可以使用Ehcache作为通用缓存或Hibernate的二级缓存。你还可以将它与第三方产品,如ColdFusion,Google App Engine, Spring集成。

Ehcache提供进程内(in-process)的缓存,它可以跨多个节点进行复制。它还是BigMemoryGo和BigMemory Max,Terracotta的商业缓存的核心和存储器内的数据存储产品。

1.2 Basic Terms(基本术语)
(1)Cache
维基词典定义缓存为 “许多未来可能会用到的东西,并且可以迅速取到”。高速缓存是临时数据的集合,要么是位于别处的数据的复制版本或者是一个计算结果。已在高速缓存的数据可以最小的时间和资源成本反复访问。

(2)Cache hit
当向缓存里请求一个数据Element, 并且缓存里存在这个指定key的element, 此时就算是一次Cache hit。

(3)Cache miss
当向缓存里请求一个数据Element, 但是缓存里不存在这个指定key的element, 此时就算是一次Cache miss。

(4) System-of-Record (SOR)
数据的权威来源。高速缓存就是作为这个来源数据的本地副本。该SOR往往是传统数据库,尽管它可能是一个专门的文件系统或一些其他可靠的长期存储系统。对于使用了Ehcache的数据源,SOR被假定为一个数据库。

2. Why Caching Works
2.1 Locality Of Reference (引用局部性)
Ehcache关注的是Java对象,缓存用于整个计算,从CPU缓存到互联网域名系统(DNS)系统。为什么呢?因为许多计算机系统证明了“引用的局部性”。使用过的数据周边邻近的数据或最近用过的数据更可能被再次使用。

The Long Tail (长尾理论)
连线杂志的克里斯•安德森,创造了“长尾理论”,是指在电子商务系统中一小部分项目可以弥补大量销售(或少数博客能够获得最大的点击率)不好的,随之后面是不太受欢迎的一条长长的“尾巴”项目。


长尾是一个幂次概率分布的实例,如帕累托分布或80:20的规则。如果20%的对象用了80%的时间,这时有一种方式可以减少这20%部分的成本,系统的性能将得到改善。

2.2 Will an Application Benefit from Cacheing?
通常情况下,答案是肯定的,尤其是如果应用程序是I / O限制。如果是CPU限制,那么获取数据的限制主要取决于CPU和主存储器的速度。缓存可以提高性能,并减少在Web服务器上的负载。

CPU约束型应用程序提速
1. 提高算法性能
2. 并行计算或集群服务器
3. 提升cpu速度

缓存可以临时存储计算结果以供重用,包括但不限于:
1. 耗时的大型web页面
2. 需要加密传输的鉴权状态。

IO约束型应用程序提速
很多应用程序是IO约束型,或者是磁盘,或者是网络,而数据库同时受磁盘和网络约束。
网络操作受很多因素的约束:
1.建立和关闭连接
2.延迟,或最小的往返时间
3.吞吐量限制
4.编码和解码的限制

缓存数据通常对IO限制型应用有很大帮助。比如,可以在以下场景使用Ehcache:
1. 为Hibernate缓存数据对象
2. 缓存从数据库生成的web页面。

2.3 How Much Will an Application Speed up with Caching?
IO约束型的应用大多是业务系统,大多数响应时间是在等待从数据库获取数据。缓存对于大多数数据在系统中都是使用一次的应用没有帮助,而对于大多数数据都会被重用的系统速度提升很明显。

Applying Amdahl’s Law
Amdahl定律揭示了一个系统的一部分的加速对整个系统的加速的规律。
1 / ((1 - Proportion Sped Up) + Proportion Sped Up / Speed up)

下面的例子说明通常情况下如何应用Amdahl定律。为了简化,我们假设:
1. 单台服务器
2. 系统内对象一旦被缓存,就永久存在,并且100% Cache hit.

Persistent Object Relational Caching(PO相关联的缓存)
对单个对象来说Hibernate的Session.load()方法从缓存获取对象比从数据库获取快1000倍。
典型的Hibernate查询会从数据库返回一个ID的列表,然后会逐个加载。如果使用Session.iterate(),Hibernate会返回到数据库逐个加载对象。

假设一种场景,我们从数据库执行一个查询,返回100个ID,然后返回逐个加载。查询操作花费20%的时间,返回去加载对象花费80%时间。这样数据库查询本身占了整个操作的75%时间。因此,使用缓存的速度提升就是60%(75% * 80%)。
对整个系统的提升就是:
1/((1-0.6) + 0.6/1000)=2.5 times system speedup.

此外还有web页面片段的缓存,对性能都有提升。

Cache Efficiency(影响性能提升的因素)
缓存实体不会永远存在,但有些例子接近永远存在:
1. 静态web页面或片段,比如页面的页脚。
2. 数据库字典数据,比如世界上的货币。

影响缓存性能的因素有:
1.Liveliness –数据的活跃性。数据越少的变动,就越多的能被缓存。
2.Proportion of data cached. 被缓存数据的比例。比如系统的内存越大,越多的数据能被缓存。
3.Shape of the usage distribution. 被使用到的数据的分布情况。如果缓存3000个数据中的300个,但是数据被使用符合80/20分布,那么这300个缓存的数据足够提升性能。
4.Read/Write ratio. 数据被修改的频率,也可以说是缓存的存活周期。数据频繁被修改,则不适合缓存,更新缓存也占性能。

3. Caching Topologies
3.1 缓存的拓扑结构类型
1. 单机
数据就存在于应用的节点上。任何其他应用节点之间都没有交互。这时,如果多个应用节点运行同一个程序,那每台节点上都会对同一个数据进行重复缓存。

2. 分布式
数据保存在远程服务器上,比如每一个远程主机上都保存一部分最近被使用的数据。这种拓扑结构提供了一套昂贵的一致性选项。The distributed topology is available only with BigMemory Max.

3. Replicated(复制)
缓存存在于每个单独的应用节点,节点之间进行数据的无锁拷贝或直接使缓存无效。复制可以同步或异步进行,当节点间复制缓存时,写缓存的操作线程会阻塞。

为了性能和可扩展性等,现在很多应用都是集群部署。然而,如果没有一个分布式或复制缓存,应用集群就会发生一些不希望的后果:
1. 缓存漂移(Cache Drift),每个应用节点维护自己的缓存,一个节点缓存的更新不会反映都其他节点。
2. 数据库瓶颈(Database Bottlenecks)。单实例应用中,缓存能有效减轻数据库压力。但是分布式应用中,每个节点都必须保证自己缓存的有效性,节点越多,就越会造成服务器压力上升。

3.2 Storage Options(存储选项)

存储层(Storage Tiers)
1.MemoryStore(堆内存储)
在内存堆内存储cache elements. 这部分内存受GC影响。
(1) 接收所有数据,包括可序列化的或不可序列化的。
(2) 这是最快的存储选项
(3) 并发安全

堆内存储受内存大小的影响,必须在配置中设置内存中最大的数据个数。当向cache中添加element时如果超过了最大限制
(1)overflow设置为不允许,就按照策略删掉一个数据
(2)overflow设置为允许,就会按策略把一个数据移到另一层(下面的OffHeapStore或DiskStore之一)。

2.OffHeapStore(堆外存储)
不受GC影响,Available only with Terracotta BigMemory products.
被称为 BigMemory,只在企业版本的Ehcache中提供,原理是利用nio的DirectByteBuffers实现,比存储到磁盘上快,而且完全不受 GC的影响,可以保证响应时间的稳定性;但是direct buffer的在分配上的开销要比heap buffer大,而且要求必须以字节数组方式存储,因此对象必须在存储过程中进行序列化,读取则进行反序列化操作,它的速度大约比堆内存储慢一个数量级。
(注:direct buffer不受GC影响,但是direct buffer归属的的JAVA对象是在堆上且能够被GC回收的,一旦它被回收,JVM将释放direct buffer的堆外空间。)

3.DiskStore(磁盘存储)
磁盘缓存只对单机实例有效。如果使用了分布式缓存(只有BigMemory Max可用), a Terracotta Server Array就会用来替换磁盘缓存。只有可序列化的数据可以放在磁盘缓存。
  • 大小: 9.5 KB
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics