本地缓存Caffeine框架的学习笔记

Caffeine是一个高性能的Java本地缓存框架,它采用了W-TinyLFU算法,结合了LRU和LFU算法的优点,实现了缓存高命中率和内存低消耗。Caffeine的设计理念是尽可能地高效,它通过一些巧妙的算法,确保最常访问的数据始终可用,咱们先来看一下Caffeine的特点。

Caffeine的主要特点包括:

  1. 高性能读写:Caffeine在读写操作上进行了优化,提供了快速的读写性能,特别是在高并发场景下表现出色。
  2. 智能缓存策略:Caffeine采用自适应的缓存驱逐策略,根据实际访问模式动态调整缓存行为,优先保留“热门”数据。
  3. 灵活的配置选项:Caffeine提供了丰富的配置选项,如设置缓存大小、过期时间、引用类型等,以适应不同场景的需求。
  4. 异步处理:Caffeine利用异步操作处理缓存事件,通过RingBuffer队列提高性能。
  5. 数据淘汰策略:Caffeine内部使用Eden、Probation和Protected三个队列来管理缓存数据的生命周期,通过Count-Min Sketch算法记录访问频率,实现数据淘汰。

Caffeine的使用相对简单,API与Guava Cache一致,可以快速集成到项目中。例如,创建一个简单的Caffeine缓存实例,可以按照以下方式进行配置和使用:

Cache<String, String> cache = Caffeine.newBuilder().maximumSize(10000) // 设置最大缓存大小.expireAfterWrite(5, TimeUnit.MINUTES) // 设置写入后5分钟过期.build();
cache.put("key", "value"); // 存入缓存
String value = cache.getIfPresent("key"); // 从缓存中获取数据

在实际应用中,Caffeine可以帮助提升应用程序的性能和响应速度,降低系统的负载和延迟。通过合理配置和使用Caffeine,可以充分发挥其高性能特性。

关于Caffeine的W-TinyLFU算法

在进行缓存逐出策略选择时,Caffeine的W-TinyLFU算法相比其他算法有哪些优势和劣势?

总结一下W-TinyLFU算法的优势如下:

优势

  1. 高命中率:W-TinyLFU算法结合了LRU和LFU算法的优点,通过将缓存分为Window Cache、Probation Cache和Protected Cache三个区域,实现了对缓存项基于时间和频率的优化管理,从而提供了近乎最佳的命中率 。
  2. 动态调整:Caffeine能够根据访问顺序和频率动态调整缓存容量和淘汰策略,适应不同的访问模式,提高缓存的命中率,减少不必要的内存消耗 。
  3. 处理稀疏流量和短时超热点流量:引入计数器饱和和衰减机制,节省存储资源,同时处理传统LRU和LFU难以处理的稀疏流量和短时超热点流量场景 。
  4. 灵活的缓存区域划分:算法中不同区域的默认比例可以动态调整,以适应不同的使用场景和数据访问模式 。

有优就有劣,需要注意以下几点:

劣势

  1. 算法复杂性:W-TinyLFU算法相比简单的LRU算法更为复杂,涉及到多个缓存区域和计数器的维护,这可能导致实现和理解上的困难 。
  2. 内存使用:虽然W-TinyLFU算法通过Count-Min Sketch算法节省了空间,但相比最基本的LRU算法,它仍然需要更多的内存来维护访问频率信息 。
  3. 性能开销:由于涉及到频率计数和多个区域之间的数据迁移,W-TinyLFU可能会引入额外的性能开销,尤其是在高并发场景下 。
  4. 参数调整:算法的有效性可能依赖于正确的参数调整,如缓存区域大小和阈值等,不当的参数设置可能会影响缓存性能 。

总而言之,言而总之,W-TinyLFU算法在提高缓存命中率和适应不同访问模式方面表现出色,但同时也带来了算法复杂性、内存使用和可能的性能开销等劣势。开发者在选择缓存逐出策略时需要根据具体的应用场景和性能要求来权衡这些优势和劣势。

W-TinyLFU算法参数调整以达到最佳性能

在实际应用中,对Caffeine的W-TinyLFU算法进行参数调整以达到最佳性能,通常需要根据具体的业务场景和需求来进行。以下是一个简单的业务场景案例,以及如何使用Caffeine构建缓存并进行参数调整的示例代码。

来看一个业务场景

假设我们正在开发一个新闻推荐系统,需要缓存用户的新闻浏览记录。这个系统有以下特点:

  • 用户数量庞大,每个用户可能浏览多条新闻。
  • 新闻记录需要快速读取,以便实时向用户推荐相关内容。
  • 系统需要定期清理旧的浏览记录以节省内存。

要如何调整代码与参数调整呢

  1. 设置最大缓存大小:根据系统内存和预期的用户数量,设置合理的缓存大小。
  2. 设置写入后过期时间:由于新闻记录有时效性,我们可以设置一个合理的过期时间,比如10分钟。
  3. 使用弱引用:由于Java的垃圾回收机制,使用弱引用可以自动回收长时间未访问的缓存项。
  4. 注册缓存项移除监听器:当缓存项被移除时,执行一些清理操作,比如记录日志或更新数据库。
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import java.lang.ref.WeakReference;Caffeine<Object, Object> builder = Caffeine.newBuilder();// 设置最大缓存项数量
int maxCacheSize = 10000; // 假设我们设置最大缓存项为10000条记录
builder.maximumSize(maxCacheSize);// 设置写入后10分钟过期
builder.expireAfterWrite(10, TimeUnit.MINUTES);// 使用弱引用存储键和值
builder.weakKeys().weakValues();// 缓存项移除监听器
builder.removalListener((key, value, cause) -> {// 这里可以执行一些清理操作,比如记录日志System.out.println("Cache entry removed: " + key + ", " + value);
});// 构建缓存
Cache<Object, Object> newsRecordCache = builder.build();// 使用缓存
newsRecordCache.put(“weige123", new WeakReference<>(new NewsRecord("news456")));
NewsRecord record = ((WeakReference<NewsRecord>) newsRecordCache.getIfPresent("weige123")).get();
if (record != null) {// 处理新闻记录
}

解释

  • maximumSize:设置缓存的最大容量,超过这个容量后,将根据W-TinyLFU算法逐出最少使用的缓存项。
  • expireAfterWrite:设置写入后过期时间,过期的缓存项将被自动逐出。
  • weakKeysweakValues:使用弱引用存储键和值,使得长时间未访问的缓存项可以被垃圾回收器回收。
  • removalListener:注册一个监听器,在缓存项被逐出时执行自定义逻辑,比如记录日志或更新数据库。

通过参数调整,咱们可以针对新闻推荐系统的业务需求,构建一个高效且具有自动清理机制的缓存系统。当然,具体的参数值(如maxCacheSize和过期时间)应该根据实际的业务场景和性能测试结果来确定。

Caffeine监控缓存的性能

如果我想监控缓存的性能,Caffeine提供了哪些监控工具或方法?

Caffeine提供了一些工具和方法来帮助监控缓存的性能:

  1. 统计信息(Stats):Caffeine允许你开启统计信息收集功能,通过recordStats()方法,你可以获取到缓存的各种统计数据,如命中率、请求次数、加载成功次数等。这些数据对于了解缓存的性能和状态非常有用。例如:
Cache<String, String> cache = Caffeine.newBuilder().recordStats().build();
System.out.println(cache.stats());
  1. 监听器(Listeners):Caffeine支持自定义监听器,可以用来监听缓存条目的创建、更新和删除事件。这对于追踪缓存活动和调试应用非常有用。例如,注册一个移除监听器:
RemovalListener<String, String> listener = (key, value, cause) ->System.out.println("被移除的键:" + key + ", 原因:" + cause);Cache<String, String> cache = Caffeine.newBuilder().removalListener(listener).build();
  1. 权重(Weigher):在某些场景下,可能需要根据条目的大小而不是数量来限制缓存,Caffeine的权重功能允许你根据值的大小来管理缓存。例如:
   Cache<String, String> cache = Caffeine.newBuilder().maximumWeight(10000).weigher((key, value) -> value.length()).build();
  1. 监控控制器:在Spring Boot应用中,可以创建一个监控控制器来暴露缓存的统计信息。例如,创建一个RestController来返回所有缓存名称和特定缓存的统计信息:
   @RestController@RequestMapping("monitor/caffeine")public class MonitorCaffeineController {@Resourceprivate CacheManager caffeineCacheManager;@GetMapping("cacheNames")public Collection<String> cacheNames() {return caffeineCacheManager.getCacheNames();}@GetMapping("stats")public Map<String, Object> stats(@RequestParam String cacheName) {CaffeineCache caffeineCache = (CaffeineCache) caffeineCacheManager.getCache(cacheName);CacheStats stats = CacheStats.empty();if (caffeineCache != null) {stats = caffeineCache.getNativeCache().stats();}// ...构建返回的监控数据}}
  1. Prometheus监控:Caffeine官方提供了与Prometheus集成的方案,可以通过Prometheus来监控Caffeine缓存的指标,感兴趣的伙伴可以尝试,V 哥回头单独写一篇针对Prometheus监控的文章。

除了以上这些,你还可以注册一个淘汰监听器来监听缓存项被淘汰的事件,并执行一些自定义逻辑,例如记录日志等等。这些工具和方法,可以让咱们有效地监控Caffeine缓存的性能,并根据收集到的数据进行适当的调优。

更多关于Caffeine框架的内容还是需要到官方文档去学习,V 哥抛砖引玉,这么好用的缓存框架不了解一下,甚是可惜啊,你觉得呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/51626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能优化特征选择|基于鹦鹉优化(2024年新出优化算法)的特征选择(分类器选用的是KNN)研究Matlab程序 【优化算法可以替换成其他优化方法】

智能优化特征选择|基于鹦鹉优化&#xff08;2024年新出优化算法&#xff09;的特征选择&#xff08;分类器选用的是KNN&#xff09;研究Matlab程序 【优化算法可以替换成其他优化方法】 文章目录 一、PO基本原理PO基本原理基本流程示例应用 二、实验结果三、核心代码四、代码获…

某张卡NR only下可以驻网 AUTO模式下在2G/3G工作

结论:需要终端设置为data centric&#xff0c;或ps only。 从日志看&#xff0c;5G下的注册收到REGISTRATION ACCEPT。但是没有携带ims support。 正常网络&#xff1a; ims_Vops_3GPP 1 (0x1) nwk_feature_supp_inc 1 (0x1)nwk_feature_supportedlength 2 (0x2)mpsi 0 (0…

ubuntu c++ http服务端event使用

程序&#xff1a; #ifndef PLATFROMCOMMUNICATION_H #define PLATFROMCOMMUNICATION_H#include <iostream> #include <fstream> #include <unistd.h> #include <curl/curl.h>#include <net/if.h> #include <sys/ioctl.h> #include <ar…

【HarmonyOS NEXT开发】鸿蒙开发环境准备,ArkTS基础语法入门

文章目录 鸿蒙开发环境准备&#xff0c;ArkTS基础语法入门大纲简介DevEco Studio简介运行环境要求 安装与配置开发工具下载Harmony OS 和 OpenHarmony 的区别Previewer汉化插件的配置 ArkTS基础快速入门1. 解释说明2. 变量与常量3. 变量命名规则4. 数组5. 函数定义函数调用函数…

Win10 安装 Rabbitmq

参考文档&#xff1a;https://www.rabbitmq.com/docs/install-windows 一、安装 Erlang 语言 安装 RabbitMQ 需要该语言的支持才能安装 下载地址&#xff1a;https://erlang.org/download/otp_versions_tree.html 点击这里下载最新版本&#xff1a;27.0.1 直接默认 next 更…

2d像素游戏基本架构

目录 2D像素游戏的基本架构通常包括以下几个关键部分 Unity和虚幻引擎在2D游戏开发中的性能比较 Unity的2D工具设计复杂的地图和场景 创建和管理地图资源&#xff1a; 使用TileMap工具&#xff1a; 构建复杂场景&#xff1a; 添加碰撞体和物理效果&#xff1a; 优化和…

DNS工作流程

DNS&#xff08;域名系统&#xff09; DNS&#xff08;域名系统&#xff09;的工作流程是将人类可读的域名&#xff08;如 www.example.com&#xff09;转换为机器可读的IP地址&#xff08;如 192.0.2.1&#xff09;&#xff0c;以便计算机能够相互通信。DNS查询过程可以分为递…

企业微信自动回复机器人:提升客户服务与工作效率的智能新篇章

在快节奏的现代商业环境中&#xff0c;企业如何高效、准确地响应客户需求&#xff0c;成为了衡量其竞争力的重要指标之一。企业微信作为企业内部沟通与客户服务的重要平台&#xff0c;其自动回复机器人的出现&#xff0c;无疑为企业带来了革命性的变革。本文将深入探讨企业微信…

Android settings命令讲解和实战

1&#xff0c;简介 在Android系统中&#xff0c;settings命令用于管理设备设置。这些命令可以与Settings提供者&#xff08;Settings provider&#xff09;交互&#xff0c;后者是一个用于存储和检索系统设置的系统服务。Settings provider在Android系统中可以被看作是一个特殊…

接口测试用例设计:关键步骤与注意事项

接口测试是软件测试中至关重要的一部分,它主要验证不同系统或组件之间的数据交换是否准确无误。相比于UI测试,接口测试更早发现问题,因为它直接验证系统的核心逻辑和数据处理。本文将从接口测试用例设计的关键步骤和注意事项展开讨论,并通过具体案例帮助大家更好地理解如何…

携程:从MySQL迁移OceanBase的数据库发布系统实践

作者简介&#xff1a;杨晓军 现就职于携程的数据库团队&#xff0c;主要负责携程数据库的研发与管理&#xff0c;专注于提升数据库的稳定性。 自分布式关系型数据库OceanBase开源以来&#xff0c;携程已经在线上环境中进行了广泛的应用&#xff0c;取代了原先以MySQL为主力的业…

Mysql,sqllite表结构对比

本代码用C#实现&#xff0c;对比有差异的字段 &#xff0c;调用类方法Comare 即可获取结果。 public class CompareDataBaseHelper { string mysqlConnectionString "Server127.0.0.1;Databasetestdb;Uidroot;Pwd123456;charsetutf8;"; string sqliteCo…

组件通信 Vue3

1.props 1.child <template><div class"child"><h3>子组件</h3><h4>玩具&#xff1a;{{ toy }}</h4><h4>父给的车&#xff1a;{{ car }}</h4><button click"sendToy(toy)">把玩具给父亲</butt…

通过visual studio进行dump文件调试和分析

0、前言 很多时候程序crash之后需要分析原因。对于C/C程序&#xff0c;一般最常见的场景和方法就是根据dump文件进行分析。 1、分析的前提条件 进行dump文件分析&#xff0c;需要以下文件&#xff1a; 进程crash时产生的dump文件程序源码进程对应的程序exe文件编译exe文件时产…

【赵渝强老师】MongoDB的存储引擎

存储引擎&#xff08;Storage Engine&#xff09;是MongoDB的核心组件&#xff0c;它负责管理数据如何存储在硬盘&#xff08;Disk&#xff09;和内存&#xff08;Memory&#xff09;上。从MongoDB 3.2 版本开始&#xff0c;MongoDB支持多种类型的数据存储引擎。 视频讲解如下&…

【ubuntu24.04】腾达U12 8812au无线网卡成功安装

U12是腾达2019年的产品 参考:台式机Ubuntu20.04系统下安装Tenda U12 无线网卡驱动当时不支持6.x的内核。官方的ubuntu驱动看起来不能用了。ipconfig /all 查看 Wireless LAN adapter WLAN 2:Connection-specific DNS Suffix . :Description . . . . .

linux-----内核(Kernel)与文件系统(File System)

一、内核作用 1.资源管理&#xff1a; 内核负责管理系统资源&#xff0c;包括CPU、内存、设备驱动和网络通信等。它为用户空间提供了一组接口&#xff0c;使得应用程序能够访问底层硬件&#xff0c;而不需要直接与硬件交互。 2.进程管理 内核负责进程的创建、调度、终止等操作…

使用twilio向手机发短信做监控报警

最近遇到个需求&#xff0c;就是夜班HW希望有个监控系统指标&#xff0c;如果异常就向监控人手机打电话的需求。在考察以后&#xff0c;发现目前由于国内防电信诈骗的原因&#xff0c;所以想要使用云通讯功能必须由企业去申请&#xff0c;但作为一个个人的监控项目来说太大了。…

Python | Leetcode Python题解之第384题打乱数组

题目&#xff1a; 题解&#xff1a; class Solution:def __init__(self, nums: List[int]):self.nums numsself.original nums.copy()def reset(self) -> List[int]:self.nums self.original.copy()return self.numsdef shuffle(self) -> List[int]:for i in range(l…

极光推送(JPush)赋能登虹科技,打造智慧视觉云平台新体验

近日&#xff0c;中国领先的客户互动和营销科技服务商极光&#xff08;Aurora Mobile&#xff0c;纳斯达克股票代码&#xff1a;JG&#xff09;与杭州登虹科技有限公司&#xff08;以下简称“登虹科技&#xff08;Closeli&#xff09;”&#xff09;达成合作&#xff0c;借助极…