【本文翻译官网文档
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
分享到:
相关推荐
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
资源来自pypi官网。 资源全名:gmic-2.9.0-cp38-cp38-manylinux2014_x86_64.whl
tensorflow2.9.0版本,WIN64,python3.8,是截至2022年3月版本。官网下载经常失败,下载好了分享给大家。安装方法简单(如指令:pip install +存放此文件路径),安装之后也可采用更新指令此处不赘述。实在不会的也...
Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、...
tensorflow-2.9.0适合python3.10 macOS x86_64系统
5. 初始化HDFS:在命令行中,使用`winutils.exe fs -mkdir /user/<username>`命令创建HDFS的用户目录,这里的<username>是你当前登录的Windows用户名。 6. 启动Hadoop服务:执行`start-dfs.cmd`和`start-yarn.cmd`...
1. 解压nexus-2.9.0-04-bundle.zip。 2. 修改`sonatype-work/nexus/conf/nexus.properties`配置文件,根据需要配置Nexus的端口、数据库连接等参数。 3. 启动Nexus,一般通过运行`nexus-2.9.0-04/bin/nexus start`...
tensorflow-2.9.0适合python3.8环境linx x86_64
由于从官方下载Helm的速度可能会较慢,提供的这个“helm-v2.9.0-linux”压缩包是为了方便用户快速获取和安装。文件名"linux-amd64"表明这是针对64位Linux系统的二进制文件。下载后,用户可以直接解压并在终端中运行...
tensorflow-2.9.0适合python3.8环境windows x64
flink-1.14.4-scala_2.12 + CDH6.2.1 版 parcel 包, 包含 FLINK-1.14.4-BIN-SCALA_2.12-el7.parcel FLINK-1.14.4-BIN-SCALA_2.12-el7.parcel.sha ...flink-shaded-hadoop-3-uber-3.1.1.7.2.9.0-173-9.0.jar
tensorflow-2.9.0适合python3.10环境的windows x64
System Requirements Microsoft Windows 7, 8/8.1, 10 (32/64 bit) 64 bit CPU, with VT-x or AMD-V capability, enabled in BIOS settings Recent and dedicated GPU 400 MB disk space 2GB RAM
eggplant_release_2022_02_25_09-02_v2.9.0_220210.ss-1651214995992.apk
tensorflow-2.9.0适合python3.9 linux x86_64系统
cmfa-2.9.0-meta-universal-release.apk.1
<version>2.9.0</version> </dependency> <!-- JavaMail --> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <!-- JSTL --> ...