首页 > 窍门 > 科技数码

Java开发中存在两种类型缓存的优点和缺点!

来源: 更新时间:2022-04-17 13:56:37
The Beginning

  缓存是捕获应用程序和数据存储位置之间交互的高效且简单的方法。为了有效地实现这一点,您需要了解缓存的各种实现及其对应用程序的影响。在本文中,我们将重点讨论数据缓存的各种使用场景,而不讨论技术实现的细节。

  

  Java开发中存在两种类型的缓存:本地缓存和群集缓存。

  

  本地缓存

  

  优点:

  

  数据直接来自Java虚拟机(JVM)、访问速度非常快、使用非常低的门槛、诸如ehcache,oscache和abd番石榴高速缓存等完善的插件在市场上很容易获得。(ehcache和oscache已经提供了群集缓存。)

  

  缺点:

  

  服务器集群中的不同机器之间可能会出现不一致和不一致的问题。当本地缓存过大时,很容易触发服务器的垃圾收集(GC)

  

  集群缓存

  

  优点:

  

  数据一致性得到保证,容量扩展方便,透明,对用户不可感知。它使用了更多成熟的中间件工具,如Tair,Redis和Memcached。

  

  缺点:

  

  您需要选择成熟的,遵从业务的集群缓存中间件和集群框架来建立和维护一组缓存集群服务器使用门槛高,可能会出现缓存热点问题,如Tair热点问题。

  

  缓存使用方法

  

  缓存使用情况因不同的数据大小和方案而异。存在三种使用方法,如下所示:

  

  被动缓存处理:在这种方法中,如果查询到达记录,结果将立即返回。如果查询未找到记录,则查询底层缓存的结果集并将结果返回给用户完整数据高速缓存预热或关键数据高速缓存预热:在此方法中,结果已经可用,并且针对数据源运行查询。结果从缓存中检索,不需要重新计算Sentinel缓存的实现: Sentinel缓存使用多个集成层来检索数据被动缓存处理是最简单的实现,适用于数据量较小的场景。完整的数据缓存加热需要良好的设计,适合中等数据大小的热点访问方案。哨兵缓存集成了各种层次,但全面的应用涉及复杂的技术。

  

  本地缓存瓶颈

  

  使用本地缓存或群集缓存的决定不会限制缓存使用方法。虽然扩展是可用的,但本文不关注集群高速缓存实现,而是关于本地高速缓存使用情况的瓶颈。在大多数情况下,JVM的本地缓存是指堆内存。

  

  阿里云的标准应用服务器的典型配置由8GB内存的独立虚拟4核CPU组成。这个配置在两部分之间分配8GB:JVM和服务器的每日开销。JVM内存由以下部分组成:

  

  年轻一代2GB,老一代2GB,堆内存最大1GB

  

  几百兆字节的持久代PermSize

  

  年轻一代的记忆力按照10:1:1的比例细分为Eden,so1和so2,每个记忆大约有170MB。

  

  你可能会想,这样一个分部有什么意义呢?如果我们向年轻一代分配3GB,会发生什么?如果我们调整年轻一代的分配大小,或者改变细分比例,会发生什么?

  

  Java开发和C开发之间最大的区别之一是Java开发人员避免使用由JVM的垃圾收集机制动态管理的内存应用程序和发行版。当JVM堆内存使用率达到一定比例时,将触发“世界停止”(STW)GC。JVM的GC对于应用程序是不可感知的。当用户请求数据并且查询到达缓存中的记录,但GC在JVM中激活时,整个应用程序将冻结,应用程序保存用户的请求,直到GC完成。GC不能超过请求的最大超时值。

  

  这是JVM堆对本地缓存使用的第一个影响。有人建议我们可以通过增加JVM堆大小来扩展GC周期。但是,我们也必须考虑在本地内存中分配给JVM年轻代的内存大小的比例的影响。


THE END

TAG:标签  简介  软件  Java  

猜你喜欢

相关文章