首页 > 其他分享 >【Ehcache技术专题】「入门到精通」带你一起从零基础进行分析和开发Ehcache框架的实战指南(设置缓存)

【Ehcache技术专题】「入门到精通」带你一起从零基础进行分析和开发Ehcache框架的实战指南(设置缓存)

时间:2023-08-28 10:02:59浏览次数:37  
标签:Ehcache 缓存 限制 入门 Cache 指定 内存 CacheManager 级别

【Ehcache技术专题】「入门到精通」带你一起从零基础进行分析和开发Ehcache框架的实战指南(设置缓存)_堆内存

缓存大小的设置

缓存大小的限制可以设置在CacheManager上,也可以设置在单个的Cache上。我们可以设置缓存使用内存的大小,也可以设置缓存使用磁盘的大小,但是使用堆内存的大小是必须设置的,其它可设可不设,默认不设就是无限制。在设置缓存大小的时候,我们可以设置缓存使用某一个存储器的最大字节数,也可以设置缓存在某一个存储器上最多存放元素的数量。

CacheManager级别

CacheManager级别有三个属性可以分别用来限制三种存储器缓存信息的大小,其控制的都是字节数,分别是maxBytesLocalHeapmaxBytesLocalOffHeapmaxBytesLocalDisk。CacheManager级别限制的大小是其内所有的Cache共享的。

maxBytesLocalHeap

maxBytesLocalHeap是用来限制缓存所能使用的堆内存的最大字节数的,其单位可以是K、M或G,不区分大小写。默认是0,表示不限制。但是当我们没有指定CacheManager级别的maxBytesLocalHeap时,我们必须在每一个Cache上指定maxBytesLocalHeap或maxEntriesLocalHeap。

maxBytesLocalOffHeap

maxBytesLocalOffHeap是用来限制缓存所能使用的非堆内存的最大字节数,其单位也可以是K、M或G。默认是0,表示不限制。但是当我们在CacheManager级别指定了maxBytesLocalOffHeap时就会隐式的使所有Cache级别的overflowToOffHeap为true,在Cache级别使用该属性时只会使当前Cache的overflowToOffHeap为true。如果此时不需要overflowToOffHeap的话,那么我们需要在Cache级别显示的指定overflowToOffHeap为false。只有企业版的Ehcache才能使用非堆内存存储缓存信息。

maxBytesLocalDisk

maxBytesLocalDisk是用来限制缓存所能使用的磁盘的最大字节数的,其单位可以是K、M或G。默认是0,表示不限制。只有在单机环境下才可以使用本地磁盘,分布式环境下是不可以使用的。 另外,这个设置只适用于临时将缓存内的信息写入到磁盘的情况,对于持久化缓存信息到磁盘的情况是不适用的。Cache级别的maxBytesLocalDisk同样如此。当我们在CacheManager级别指定了maxBytesLocalDisk时会隐式的指定所有Cache的overflowToDisk为true,而Cache级别只会使当前Cache的overflowToDisk为true。

配置案例

下面是一个在CacheManager级别指定缓存大小限制的示例,在该示例中我们指定了该CacheManager所能使用的最大堆内存是500M,最大非堆内存是2G,使用本地磁盘的最大字节数是50G。

Xml代码
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"  
   maxBytesLocalHeap="500M" maxBytesLocalOffHeap="2G" maxBytesLocalDisk="50G">     
</ehcache>

Cache级别

CacheManager上能够指定的限制大小的参数在Cache级别都能使用。当我们在Cache级别指定了某种类型的限制大小后,该Cache将不再共享CacheManager内的该种限制了。如我们在CacheManager级别限制了堆内存的最大使用数maxBytesLocalHeap为1G,意味着CacheManager内的所有的Cache将共享这1G的堆内存,如果这个时候我们指定CacheManager内的cache1的最大使用堆内存数maxBytesLocalHeap为200M,那就意味着cache1的堆内存最大使用数只能是其自身设置的200M了,而其它Cache只能共享剩余的824M了。

Cache支持百分比控制

与CacheManager不同的是我们在Cache级别上指定maxBytesLocalHeap、maxBytesLocalOffHeap和maxBytesLocalDisk时还可以使用百分比的形式,前提是对应的限制在CacheManager上有指定。

我们的CacheManager有如下配置,我们指定了其最多使用的堆内存是500M。

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"  
   maxBytesLocalHeap="500M">    
</ehcache>

那么这个时候我们在其中定义了一个Cache,在指定其maxBytesLocalHeap时我们可以指定其值为百分比形式,如50%,表示我们的Cache最多使用CacheManager级别的maxBytesLocalHeap的50%,即250M。

百分比需要注意要点

而如果我们试图在该Cache上使用百分比的时候指定maxBytesLocalDisk时则会出错,因为我们没有在CacheManager级别上指定maxBytesLocalDisk,Ehcache也就无法知道你这个百分比到底是多少了。

大小限制注意要点

需要注意的是我们所有Cache上指定的字节数大小之和不能超过CacheManager上对应的限制大小;所有Cache上对应限制以百分比形式指定的和不能超过100%。

Cache指定元素数量

此外,在Cache级别我们还可以利用两个属性来限制在堆内存或者是磁盘上缓存元素的最大数,这两个属性是maxEntriesLocalHeap和maxEntriesLocalDisk,而对于非堆内存OffHeap的话是不能指定元素的最大数量的。

maxEntriesLocalHeap

maxEntriesLocalHeap是用来限制当前缓存在堆内存上所能保存的最大元素数量的。

maxEntriesLocalHeap和maxBytesLocalHeap

Ehcache规定如果在CacheManager上没有指定maxBytesLocalHeap时必须在各个Cache上指定maxBytesLocalHeap或者maxEntriesLocalHeap,但maxEntriesLocalHeapmaxBytesLocalHeap不能同时出现。

注意要点

我们也不能在Cache上指定maxEntriesLocalHeap的同时在CacheManager上指定maxBytesLocalHeap。但同时在CacheManager和Cache上指定maxBytesLocalHeap则是允许的。

maxEntriesLocalDisk

maxEntriesLocalDisk是用来限制在磁盘上所能保存的元素的最大数量的。

计算Cache缓存大小

放在Cache里面的元素将会使用net.sf.ehcache.pool.sizeof.SizeOf来衡量其大小,当然这种衡量只是针对于存在堆内存里面的元素而言的,因为非堆内存和磁盘上我们是直接存的字节,可以直接来计算字节。

元素的大小包括元素的key和value,以及其它属性信息,而且在计算大小时这些信息都是递归计算的,即如果value关联了另外一个对象B,那么B的大小也会被计算在内。

IgnoreSizeOf

如果我们不想计算元素内部某部分内容的大小的话,我们可以通过使用net.sf.ehcache.pool.sizeof.annotations.IgnoreSizeOf注解来标记忽略该内容的大小。

IgnoreSizeOf是不会考虑继承性的,也就是说如果你将IgnoreSizeOf标注在类型A上,那么将只会忽略A的大小,而不会忽略A的子类B的大小,如果也需要忽略B的大小的话,则需要在类B上也使用IgnoreSizeOf进行标注

IgnoreSizeOf可以标记在三个地方

忽略属性

表示忽略某对象的对应属性。如下表示我们将忽略User对象的role属性。

Java代码
public class User {     
   @IgnoreSizeOf  
   private Role role;  
}
忽略类

表示将忽略该中类型。如下表示我们将忽略User类型。

Java代码
@IgnoreSizeOf  
public class User {     
   private String name;      
}
忽略包

标记在包上的时候是标记在包对应的package-info.java上,表示将忽略该包下面所有的类型,如我们要忽略com.xxx.xxx包下的所有内容时可以在该包对应的package-info.java文件中的package上使用IgnoreSizeOf注解进行标注。

Java代码
@net.sf.ehcache.pool.sizeof.annotations.IgnoreSizeOf  
package com.xxx.xxx;

此外,我们也可以通过全限定名的方式指定在计算Cache中元素的大小时哪些属性、类和包需要忽略,然后把这些信息写在一个属性文件里面,再将系统属性net.sf.ehcache.sizeof.filter指向该文件。系统属性可以通过java –Dnet.sf.ehcache.sizeof.filter来指定。

文件内容
# 指定将忽略User的role属性
com.xxx.User.role
# 将忽略User类型
com.xxx.User
# 将忽略包下的所有内容
com.xxx

如上所述,我们的SizeOf在进行大小衡量的时候是进行递归衡量的,即会计算对象所持有的引用、引用的引用等。 针对于此,我们可以来指定SizeOf在进行大小衡量时的一个策略,sizeOfPolicy。

sizeOfPolicy

sizeOfPolicy有CacheManager级别的和Cache级别的,分别对应于ehcache子元素和cache子元素或defaultCache子元素。当Cache级别和CacheManager级别同时指定有sizeOfPolicy时,Cache级别的配置将覆盖CacheManager级别的配置。

sizeOfPolicy的属性

sizeOfPolicy元素有两个属性,maxDepth和maxDepthExceededBehavior。

  • maxDepth表示链接的最大深度。
  • maxDepthExceededBehavior表示当访问的深度超过指定的maxDepth后的行为,对应有continue和abort两种。continue将给出一个警告,然后继续计算大小,这是默认值;abort将给出警告,然后中止此次计算,并标记没有跟踪到内存的使用。

配置案例

配置案例1

只在CacheManager级别指定大小限制,没有在Cache级别指定,这种情况下cache1、cache2、cache3将平分CacheManager级别的大小限制,即各自拥有CacheManager级别的heap、offHeap和disk三分之一的容量。

Xml代码

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"  
   maxBytesLocalHeap="500M" maxBytesLocalOffHeap="5G" maxBytesLocalDisk="50G">      
   <cache name="cache1"/>  
   <cache name="cache2"/>  
   <cache name="cache3"/>     
</ehcache>

配置案例2

CacheManager级别指定了大小限制,同时某些Cache也指定了大小限制。如下,我们指定了cache1的maxBytesLocalHeap为200M,这个时候cache1将可以使用到200M的堆内存,而cache2和cache3将平分CacheManager级别除去cache1所拥有的200M之外的堆内存,即各150M。而CacheManager级别的offHeap和disk容量将由cache1、cache2和cache3平分,各得三分之一。

Xml代码

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"  
   maxBytesLocalHeap="500M" maxBytesLocalOffHeap="5G" maxBytesLocalDisk="50G">      
   <cache name="cache1" maxBytesLocalHeap="200M"/>  
   <cache name="cache2"/>  
   <cache name="cache3"/>     
</ehcache>

配置案例3

CacheManager不指定大小限制,Cache级别指定大小限制。这个时候将各用各的,即各个Cache只能使用其自身指定好的大小。

Xml代码

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">      
   <cache name="cache1" maxBytesLocalHeap="200M"/>  
   <cache name="cache2" maxBytesLocalHeap="300M"/>  
   <cache name="cache3" maxBytesLocalHeap="200M"/>     
</ehcache>

配置案例4

当我们在CacheManager级别指定了大小限制之后,我们可以在Cache级别通过百分比的形式来指定其可使用的对应大小限制。在下面示例中,我们的CacheManager拥有500M的heap内存,5G的offHeap内存,50G的disk容量。cache1拥有CacheManager 20%的heap内存,即100M,剩余的400M cache2和cache3平分,即各200M;cache2拥有CacheManager 20%的offHeap内存,即1G,剩余的4G将由cache1和cache3平分,即各2G;cache3拥有CacheManager 20%的disk容量,即10G,剩余的40G将由cache1和cache2平分,即各20G。所以最终cache1将拥有heap 100M、offHeap 2G、disk 20G;cache2将拥有heap 200M、offHeap 1G、disk 20G;cache3将拥有heap 200M、offHeap 2G、disk 10G。

Xml代码

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"  
   maxBytesLocalHeap="500M" maxBytesLocalOffHeap="5G" maxBytesLocalDisk="50G">  
   <cache name="cache1" maxBytesLocalHeap="20%"/>  
   <cache name="cache2" maxBytesLocalOffHeap="20%"/>  
   <cache name="cache3" maxBytesLocalDisk="20%"/>     
</ehcache>

配置案例5

当我们没有在CacheManager上指定某种资源的可用量时我们还可以在Cache级别进行指定。CacheManager只有600M的heap内存,cache1、cache2、cache3都没有显式的指定使用多少heap内存,所以将各得200M heap内存。而cache1还指定了可以使用2G的offHeap内存;cache2还指定了可以使用20G的磁盘;而cache3仅仅只能使用CacheManager分配下来的200M heap内存。

Xml代码

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
   xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"  
   maxBytesLocalHeap="600M">      
   <cache name="cache1" maxBytesLocalOffHeap="2G"/>  
   <cache name="cache2" maxBytesLocalDisk="20G"/>  
   <cache name="cache3"/>  
</ehcache>

结论

  1. Cache自身设置了某种容量的限制时,在对应类型的容量限制上将使用自身的限制,如某Cache自身设置了maxBytesLocalHeap为100M,那么它能够使用的堆内存的最大量就是100M。
  2. Cache自身没有指定某种类型的容量限制时,如果在CacheManager级别有指定的话,那么该Cache将和其它同样没有指定该类型容量限制的Cache一起平分CacheManager级别该种类型的容量被指定了该类型容量限制的Cache瓜分后剩余的容量,否则其将没有该种类型的容量可用。
  3. CacheA没有指定maxBytesLocalDisk限制,而在CacheManager级别指定了maxBytesLocalDisk限制为10G,如果在该CacheManager内还有另外一个CacheB指定了maxBytesLocalDisk限制为5G,那么CacheA将能够使用的disk容量为5G,如果此时还有另外N个Cache也没有指定maxBytesLocalDisk限制的话,那么它们将和CacheA一起瓜分CacheManager的disk容量10G除去CacheB的disk容量5G后剩余的5G,即各5/(N+1)G。
  4. CacheManager级别也没有指定maxBytesLocalDisk的话,那么CacheA和其它同样没有指定maxBytesLocalDisk的Cache将不能使用disk进行Cache信息的存储(这里是假设这些Cache同样都没有指定maxEntriesLocalDisk)。

标签:Ehcache,缓存,限制,入门,Cache,指定,内存,CacheManager,级别
From: https://blog.51cto.com/alex4dream/7260250

相关文章

  • Linux基础入门常见命令
    ls查看ls-lcdmv移动mkdir创建df查看磁盘pwd查看当前目录rm-rf删除强制删除sudouseradd-m用户名创建新用户创建的新用户权限是很低的sudopasswd用户名创建新用户密码sudouserdel用户名删除用户sudormf-/home/用户名强制删除用户的所有......
  • 入门
    开始NodeGui使您能够使用JavaScript创建桌面应用程序。你可以看到它作为Node.js运行时的轻微修改变体,专注于桌面应用程序而不是网络服务器。NodeGui也是跨平台图形用户界面的高效JavaScript绑定。(图形用户界面)库.Qt是用于构建桌面应用程序的最成熟,最有效的库之......
  • EMQX简单入门
    最近项目上使用了mqtt协议来传输数据,之前没了解过,故简单学习下,本文作为学习记录以便之后复习使用。1.什么是MQTTMQTT 是一种基于发布/订阅模式的轻量级消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用而设计,可以用极少的代码为联网设备提供实时可靠的消息服务。MQTT......
  • nginx从入门到实战
    概述异步非阻塞的高性能HTTP和反向代理服务器  nginx的运行架构 1、Master进程 启动检查nginx.conf是否正确 根据配置文件创建、监控worker进程的数量和状态 监听socket,接受client发起的请求,然后worker竞争抢夺连接,获胜的worker可以相应请求 接收管理员发送......
  • OpenGL入门——第一个三角形
    一、渲染管线在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,所以由OpenGL的图形渲染管线将3D坐标转为2D坐标。图形渲染管线主要分为2个部分:第一部分将3D坐标转为2D坐标,第二部分把2D坐标转为实际的颜色像素。注意:2D坐标和像素也是不同的,2D坐标精确表示一个点在2D空......
  • 【Ehcache技术专题】「入门到精通」带你一起从零基础进行分析和开发Ehcache框架的实战
    Ehcache的存储方式Ehcache中对于缓存的存储主要有三种方式:分别是堆内存、非堆内存和磁盘。其中非堆内存是针对于企业版Ehcache才有的功能,它可以不受JavaGC的影响,能够创建很大的缓存。堆内存(MemoryStore)我们通常所有的MemoryStore实际上就是堆内存存储。MemoryStore总是可用的,所有......
  • kubernetes client-go快速入门及源码阅读
    client-go是kubernetes官方维护的一个go语言客户端,用于与k8s集群交互,使用client-go可以很方便的完成k8s的二次开发(似乎也必不可少),无论是稳定性还是健壮性都有充分的保障。client-go代码版本:v0.20.2个人水平有些,一定会出现不严谨或者错误的地方,如有错误麻烦评论指正,谢谢版......
  • 在 Linux/Unix/Mac 下清除 DNS 查询缓存
    在MS-Windows下,你可以使用ipconfig命令来清除dns缓存。然而,Linux和Unix提供了不同的方法来清除缓存。Linux可以运行nscd或者BIND或者dnsmasq作为名称服务缓存守护进程。大型或者工作组服务器可能使用BIND或者dnsmasq作为专用缓存服务器来加速查询。如何:清除nscd......
  • 优化Redis缓存淘汰机制解决性能测试中报错率逐渐攀升问题
    在某个查询场景的性能测试过程中,遇到了一个问题:测试过程中报错率逐渐攀升。进一步检查后发现,在查询业务所在应用的后台日志和平台应用的后台日志中,都出现了用户登录相关的报错信息。经过排查分析,发现了问题的根源,并做出了解决方案。问题描述在测试过程中,发现报错率逐渐增加,并且......
  • Android入门教程 | Fragment 基础概念
    什么是Fragment?Fragment,直译为“碎片”,“片段”。Fragment表示FragmentActivity中的行为或界面的一部分。可以在一个Activity中组合多个片段,从而构建多窗格界面,并在多个Activity中重复使用某个片段。可以将片段视为Activity的模块化组成部分,它具有自己的生命周期,能接收自......