欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 高性能缓存方案 —— Caffeine

高性能缓存方案 —— Caffeine

2025/7/2 14:11:51 来源:https://blog.csdn.net/qq_35843514/article/details/142790895  浏览:    关键词:高性能缓存方案 —— Caffeine

一、简介

Caffeine是一个高性能的Java缓存库,它提供了本地缓存的功能。
Caffeine和Redis都是内存级别的缓存,为什么要使用在这两缓存作为二级缓存,它们两有什么区别呢?

虽然它们都是内存级别的缓存,但是Redis是需要单独部署的,其需要一个单独的进程,在tomcat访问Redis时需要网络通信的开销,而Caffeine跟我们项目代码是写在一起的,它是JVM级别的缓存,用的就是Java中的堆内存,无需网络的通信的开销,在Caffeine找不到数据后才会去redis中查找。
在这里插入图片描述

以下是一个使用Caffeine作为本地缓存的简单示例:

// JVM Processes Cache, Import Caffeine dependency.
<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId>
</dependency>
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.stats.CacheStats;import java.util.concurrent.TimeUnit;public class CaffeineDemo {public static void main(String[] args) {// Create a local cache with a maximum size of 100Cache<String, String> cache = Caffeine.newBuilder().maximumSize(100).expireAfterWrite(5, TimeUnit.MINUTES).build();// Put the data in the cachecache.put("key", "val");// Get data from the cache by the key, if no data, return null.String value = cache.getIfPresent("key");System.out.println(value);String value2 = cache.getIfPresent("key2");System.out.println(value2);// Get caching statisticsCacheStats stats = cache.stats();System.out.println("Cache hits: " + stats.hitCount());System.out.println("Cache misses: " + stats.missCount());// Delete element from the cachecache.invalidate(("key"));System.out.println(cache.getIfPresent(("key")));}
}

运行结果:
在这里插入图片描述

二、驱逐策略

使用Caffeine为了防止内存溢出,提供了以下几种驱逐策略。

为了防止一直往内存里装数值导致占用内存,所以Caffeine给我们提供了驱逐策略。

1、基于容量(设置缓存的上限)

   @Testpublic void test() {Cache<Object, Object> cache = Caffeine.newBuilder().initialCapacity(100) //设置缓存的初始化容量.maximumSize(1000) //设置最大的容量.build();}

通过设置最大的容量来控制内存,当内存达到最大时,会将最早存入的数据删除,当缓存超出这个容量的时候,会使用Window TinyLfu策略来删除缓存。

2、基于时间(设置有效期)

@Test
public void test1() {Cache<Object, Object> cache = Caffeine.newBuilder().initialCapacity(100).expireAfterWrite(Duration.ofSeconds(10)) //设置缓存的有效期,此时就是设置为10s.build();
}

3、基于引用

设置数据的强引用和弱引用,在内存不足的时候jvm会进行垃圾回收,会将弱引用的数据进行回收,性能差,不建议使用。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词