高性能缓存方案 —— Caffeine

news/2024/10/10 21:16:55/

一、简介

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/news/1537124.html

相关文章

内网离线安装k8s 1.27.0(保证安装成功)

这里写目录标题 背景步骤一、集群规划及架构(node节点可以有很多个)二、系统初始化准备(所有节点都需要进行操作)三、安装并配置cri-dockerd插件(三台服务器同时操作)四、安装kubeadm(所有节点同步操作)五、初始化集群六、将Node节点添加到集群七、安装网络组件Calico八、…

基于xgboost的分类预测

一、xgboost的介绍 xgboost以及后续的lightGBM等在我的认知中算是目前数据挖掘中最常用的预测算法&#xff0c;在各种数据挖掘比赛中获得了Top的名次。如果想从事数据挖掘相关的岗位&#xff0c;该算法是一定要好好掌握的。 xgboost其实可以认为是GBDT算法的工程实现&#xf…

AI时代互联网信息的几点隐忧

笔者最近一年关注的AI技术比关注的安全技术还多&#xff0c;AI从事实上的对内容生产工作者带来工作效率的提高&#xff0c;年初的时候比较关注的是如何在安全行业使用AI进行赋能&#xff0c;领导也给了类似的命题&#xff0c;让我思考如何让AI在安全行业发力。 目前已经看到的是…

为什么在摄像头领域播放声音需要拉功放?

目录 一、声音的基础知识二、功放的基本原理三、摄像头领域为什么需要拉功放&#xff1f;四、实际应用场景分析五、结论 摄像头在现代安防、监控、智能家居等场景中发挥着重要作用。随着技术的进步&#xff0c;摄像头不仅具备了图像采集功能&#xff0c;还集成了语音传输和播放…

PHP中的HTTP请求:简化你的网络通信

在当今的网络应用开发中&#xff0c;PHP作为一种流行的服务器端脚本语言&#xff0c;经常需要与外部服务进行通信。这通常涉及到发送HTTP请求来获取或提交数据。幸运的是&#xff0c;PHP提供了多种方式来简化HTTP请求的过程&#xff0c;使得网络通信变得轻而易举。 PHP中的HTTP…

甲虫身体图像分割系统源码&数据集分享

甲虫身体图像分割系统源码&#xff06;数据集分享 [yolov8-seg-EfficientRepBiPAN&#xff06;yolov8-seg-C2f-FocusedLinearAttention等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challen…

毕业设计 大数据电影数据分析与可视化系统

文章目录 0 简介1 课题背景2 效果实现3 爬虫及实现4 Flask框架5 Ajax技术6 Echarts7 最后 0 简介 今天学长向大家介绍一个机器视觉的毕设项目 &#x1f6a9;基于大数据的电影数据分析与可视化系统 项目运行效果(视频)&#xff1a; 毕业设计 大数据电影评论情感分析 &#x1…

令牌主动失效机制范例(利用redis)注释分析

介绍该机制 令牌生成 在需要限流的场景中&#xff0c;系统会根据一定的速率生成令牌&#xff0c;存储在 Redis 中。可以设定每秒生成的令牌数量。 令牌获取 当用户请求时&#xff0c;系统会从 Redis 中获取令牌。可以使用原子性操作&#xff08;如 DECR&#xff09;来确保令牌…