高性能缓存方案 —— Caffeine

devtools/2024/10/18 16:31:48/

一、简介

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会进行垃圾回收,会将弱引用的数据进行回收,性能差,不建议使用。


http://www.ppmy.cn/devtools/125379.html

相关文章

IEC104规约的秘密之九----链路层和应用层

104规约从TCP往上&#xff0c;分成链路层和应用层。 如图&#xff0c;APCI就是链路层&#xff0c;ASDU的就是应用层 我们看到报文都是68打头的&#xff0c;因为应用层报文也要交给链路层发送&#xff0c;链路层增加了开头的6个字节再进行发送。 完全用于链路层的报文每帧都只有…

tiktok x-bougs signature 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我删…

Linux与RTOS的区别

一、Linux与RTOS的区别 1.设计目标&#xff1a;Linux关注性能和多任务处理&#xff0c;RTOS追求实时响应和确定性。 2.调度方式&#xff1a;Linux对普通任务使用公平调度&#xff1b;对实时任务使用优先级调度或时间片轮转调度。而RTOS只采用优先级调度。 3.内存管理&#xff1…

Ofcms-(java代码审计学习)

1、背景 根据《java代码审计实战》学习进行记录&#xff0c;java代码审计CMS实战。 2、Ofcms下载 可搜索Ofcms1.1.2版本进行下载。下载连接&#xff1a;ofcms: java 版CMS系统、基于java技术研发的内容管理系统、功能&#xff1a;栏目模板自定义、内容模型自定义、多个站点管…

构建企业级私有仓库

目录 下载软件包地址 为仓库提供加密传输 为仓库建立登陆认证 部署Harbor 对压缩包进行压缩 编辑harbor.yml文件 执行脚本 登录测试 下载软件包地址 https://github.com/goharbor/harbor/releases Harbor 是由vmware公司开源的企业级 Docker Registry 项目。 它提供了…

【LeetCode】每日一题 2024_10_12 求出出现两次数字的 XOR 值(哈希、模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;求出出现两次数字的 XOR 值 昨天没有更新&#xff0c;因为昨天的题目和前天的每日一题是一模一样的&#xff0c;只是同一道题目&#xff0c;加强了数据范围&#xff0c;恰好的是&#xff…

Spark常用RDD算子:transformation转换算子以及action触发算子

文章目录 1. 算子&#xff08;方法&#xff09;介绍2. 常用transformation算子2.1 map 2.2 flatMap2.3 filter2.4 distinct2.6 groupBy2.7 sortBy()2.8 k-v数据[(k,v),(k1,v1)] 3. 常用action算子 1. 算子&#xff08;方法&#xff09;介绍 rdd中封装了各种算子方便进行计算&a…

Spring Boot敏感数据动态配置:深入实践与安全性提升

在构建Spring Boot应用的过程中&#xff0c;敏感数据的处理与保护是至关重要的。传统上&#xff0c;这些敏感数据&#xff08;如数据库密码、API密钥、加密密钥等&#xff09;可能被硬编码在配置文件中&#xff0c;这不仅增加了泄露的风险&#xff0c;也限制了配置的灵活性和可…