聊聊jetcache的CacheManager

本文主要研究一下jetcache的CacheManager

CacheManager

jetcache-core/src/main/java/com/alicp/jetcache/CacheManager.java

public interface CacheManager {<K, V> Cache<K, V> getCache(String area, String cacheName);void putCache(String area, String cacheName, Cache cache);BroadcastManager getBroadcastManager(String area);void putBroadcastManager(String area, BroadcastManager broadcastManager);default <K, V> Cache<K, V> getCache(String cacheName) {return getCache(CacheConsts.DEFAULT_AREA, cacheName);}default void putCache(String cacheName, Cache cache){putCache(CacheConsts.DEFAULT_AREA, cacheName, cache);}/*** create or get Cache instance.* @see QuickConfig#newBuilder(String)*/<K, V> Cache<K, V> getOrCreateCache(QuickConfig config);default void putBroadcastManager(BroadcastManager broadcastManager){putBroadcastManager(CacheConsts.DEFAULT_AREA, broadcastManager);}}

CacheManager定义了getCache、putCache、getBroadcastManager、putBroadcastManager、getOrCreateCache方法,并提供了aera为default的默认getCache、putCache、putBroadcastManager方法

SimpleCacheManager

jetcache-core/src/main/java/com/alicp/jetcache/SimpleCacheManager.java

public class SimpleCacheManager implements CacheManager, AutoCloseable {private static final boolean DEFAULT_CACHE_NULL_VALUE = false;private static final Logger logger = LoggerFactory.getLogger(SimpleCacheManager.class);// area -> cacheName -> Cacheprivate final ConcurrentHashMap<String, ConcurrentHashMap<String, Cache>> caches = new ConcurrentHashMap<>();private final ConcurrentHashMap<String, BroadcastManager> broadcastManagers = new ConcurrentHashMap();private CacheBuilderTemplate cacheBuilderTemplate;public SimpleCacheManager() {}@PreDestroy@Overridepublic void close() {broadcastManagers.forEach((area, bm) -> {try {bm.close();} catch (Exception e) {logger.error("error during close broadcast manager", e);}});broadcastManagers.clear();caches.forEach((area, areaMap) -> {areaMap.forEach((cacheName, cache) -> {try {cache.close();} catch (Exception e) {logger.error("error during close Cache", e);}});});caches.clear();}private ConcurrentHashMap<String, Cache> getCachesByArea(String area) {return caches.computeIfAbsent(area, (key) -> new ConcurrentHashMap<>());}@Overridepublic Cache getCache(String area, String cacheName) {ConcurrentHashMap<String, Cache> areaMap = getCachesByArea(area);return areaMap.get(cacheName);}@Overridepublic void putCache(String area, String cacheName, Cache cache) {ConcurrentHashMap<String, Cache> areaMap = getCachesByArea(area);areaMap.put(cacheName, cache);}@Overridepublic BroadcastManager getBroadcastManager(String area) {return broadcastManagers.get(area);}@Overridepublic void putBroadcastManager(String area, BroadcastManager broadcastManager) {broadcastManagers.put(area, broadcastManager);}public CacheBuilderTemplate getCacheBuilderTemplate() {return cacheBuilderTemplate;}public void setCacheBuilderTemplate(CacheBuilderTemplate cacheBuilderTemplate) {this.cacheBuilderTemplate = cacheBuilderTemplate;}@Overridepublic <K, V> Cache<K, V> getOrCreateCache(QuickConfig config) {if (cacheBuilderTemplate == null) {throw new IllegalStateException("cacheBuilderTemplate not set");}Objects.requireNonNull(config.getArea());Objects.requireNonNull(config.getName());ConcurrentHashMap<String, Cache> m = getCachesByArea(config.getArea());Cache c = m.get(config.getName());if (c != null) {return c;}return m.computeIfAbsent(config.getName(), n -> create(config));}//......
}    

SimpleCacheManager实现了CacheManager及AutoCloseable接口,其close方法先遍历broadcastManagers、caches执行其close方法然后进行clear;它在内存中维护了caches及broadcastManagers的ConcurrentHashMap,其getOrCreateCache主要根据QuickConfig来创建Cache,支持buildRemote、buildLocal以及multiLevelCache,并支持包装为RefreshCache或者LoadingCache,另外也支持设置cachePenetrationProtect以及CacheMonitor

buildLocal

    private Cache buildLocal(QuickConfig config) {EmbeddedCacheBuilder cacheBuilder = (EmbeddedCacheBuilder) cacheBuilderTemplate.getCacheBuilder(0, config.getArea());if (cacheBuilder == null) {throw new CacheConfigException("no local cache builder: " + config.getArea());}if (config.getLocalLimit() != null && config.getLocalLimit() > 0) {cacheBuilder.setLimit(config.getLocalLimit());}if (config.getCacheType() == CacheType.BOTH &&config.getLocalExpire() != null && config.getLocalExpire().toMillis() > 0) {cacheBuilder.expireAfterWrite(config.getLocalExpire().toMillis(), TimeUnit.MILLISECONDS);} else if (config.getExpire() != null && config.getExpire().toMillis() > 0) {cacheBuilder.expireAfterWrite(config.getExpire().toMillis(), TimeUnit.MILLISECONDS);}if (config.getKeyConvertor() != null) {cacheBuilder.getConfig().setKeyConvertor(config.getKeyConvertor());}cacheBuilder.setCacheNullValue(config.getCacheNullValue() != null ?config.getCacheNullValue() : DEFAULT_CACHE_NULL_VALUE);return cacheBuilder.buildCache();}

buildLocal通过cacheBuilderTemplate.getCacheBuilder获取EmbeddedCacheBuilder,然后支持设置limit、expireAfterWrite、keyConvertor、cacheNullValue

buildRemote

    private Cache buildRemote(QuickConfig config) {ExternalCacheBuilder cacheBuilder = (ExternalCacheBuilder) cacheBuilderTemplate.getCacheBuilder(1, config.getArea());if (cacheBuilder == null) {throw new CacheConfigException("no remote cache builder: " + config.getArea());}if (config.getExpire() != null && config.getExpire().toMillis() > 0) {cacheBuilder.expireAfterWrite(config.getExpire().toMillis(), TimeUnit.MILLISECONDS);}String prefix;if (config.getUseAreaInPrefix() != null && config.getUseAreaInPrefix()) {prefix = config.getArea() + "_" + config.getName();} else {prefix = config.getName();}if (cacheBuilder.getConfig().getKeyPrefixSupplier() != null) {Supplier<String> supplier = cacheBuilder.getConfig().getKeyPrefixSupplier();cacheBuilder.setKeyPrefixSupplier(() -> supplier.get() + prefix);} else {cacheBuilder.setKeyPrefix(prefix);}if (config.getKeyConvertor() != null) {cacheBuilder.getConfig().setKeyConvertor(config.getKeyConvertor());}if (config.getValueEncoder() != null) {cacheBuilder.getConfig().setValueEncoder(config.getValueEncoder());}if (config.getValueDecoder() != null) {cacheBuilder.getConfig().setValueDecoder(config.getValueDecoder());}cacheBuilder.setCacheNullValue(config.getCacheNullValue() != null ?config.getCacheNullValue() : DEFAULT_CACHE_NULL_VALUE);return cacheBuilder.buildCache();}

buildRemote方法通过cacheBuilderTemplate.getCacheBuilder获取ExternalCacheBuilder,然后支持设置expireAfterWrite、keyPrefix、keyConvertor、valueEncoder、valueDecoder、cacheNullValue

小结

CacheManager定义了getCache、putCache、getBroadcastManager、putBroadcastManager、getOrCreateCache方法,并提供了aera为default的默认getCache、putCache、putBroadcastManager方法;SimpleCacheManager实现了CacheManager及AutoCloseable接口,其close方法先遍历broadcastManagers、caches执行其close方法然后进行clear;它在内存中维护了caches及broadcastManagers的ConcurrentHashMap,其getOrCreateCache主要根据QuickConfig来创建Cache,支持buildRemote、buildLocal以及multiLevelCache,并支持包装为RefreshCache或者LoadingCache,另外也支持设置cachePenetrationProtect以及CacheMonitor。

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

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

相关文章

架构扩展性

应用扩展性 X轴横向克隆 X轴横向克隆是指将应用部署在多个节点上&#xff0c;以实现负载均衡和高可用性。对于无状态应用&#xff0c;可以通过多节点克隆复制来实现横向扩展。而对于有状态应用&#xff0c;需要处理状态剥离&#xff0c;例如Session的处理。 具体来说&#x…

每日AI资讯-20240616

1. AI漫画角色一致性大突破 由中山大学和联想团队联合提出AutoStudio&#xff0c;它是一个无需训练的多智能体协同框架。AutoStudio采用基于大语言模型的三个智能体来处理交互&#xff0c;并使用基于扩散模型的Drawer生成高质量图像。实验中&#xff0c;AutoStudio无论是在定量…

java 将获取json中的值

在Java中&#xff0c;可以使用FastJson库来获取JSON中的value值。下面是一个简单的示例代码&#xff1a; import com.alibaba.fastjson.JSONObject;public class JsonExample {public static void main(String[] args) {// JSON字符串String jsonString "{\"key1\&…

腾讯地图避坑-获取地图点击点的经纬度

map.on(click,(evt)>{console.log("evt",evt)let lat evt.latLng.getLat();//lat 获取let lng evt.latLng.getLng();//lng 获取console.log("evt.latLng-有效方式",evt.latLng)console.log("evt[latlng]-无效方式",evt[latlng])})

PiDiNet推理手顺

GitHub链接 https://github.com/hellozhuo/pidinet 运行环境 Pyhton 3.8 filelock3.14.0 fsspec2024.5.0 imageio2.34.1 intel-openmp2021.4.0 Jinja23.1.4 lazy_loader0.4 MarkupSafe2.1.5 mkl2021.4.0 mpmath1.3.0 networkx3.1 numpy1.24.4 open…

小程序外卖开发中的关键技术与实现方法

小程序外卖服务凭借其便捷性和灵活性&#xff0c;正成为现代餐饮行业的重要组成部分。开发一个功能完善的小程序外卖系统&#xff0c;需要掌握一系列关键技术和实现方法。本文将介绍小程序外卖开发中的核心技术&#xff0c;并提供具体的代码示例&#xff0c;帮助开发者理解和实…

Verilog-学习verilog中遇到的问题总结

#学习记录# 目录 1 verilog中~和&#xff01;的区别 1 verilog中~和&#xff01;的区别 &#xff01;表示逻辑取反&#xff0c;~表示按位取反。当面对位宽为1时&#xff0c;两个操作符的作用相同。当位宽不为1时&#xff1a; ~会将变量的各个位依次取反&#xff1a;a[2:0]{…

认识异常

一、异常的概念和体系结构 1、异常的概念 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为异常&#xff0c;常见的有算术异常&#xff0c;数组越界异常&#xff0c;空指针异常 2、异常的体系结构 从上图中可以看到&#xff1a; 1.Throwable&#xff1a;是异常体系…

Euro Efficiency(POJ, Open judge)

题目链接: 1252 -- Euro Efficiency 题目描述: 思路: 题面的大概意思就是给你一组基本面值的钱币&#xff0c;问你要凑出指定的面值最少需要多少个钱币的参与&#xff0c;钱币的参与可以是加法也可以是减法。 分析一下&#xff0c;由于答案与钱币参与的顺序无关&#xff0c;…

机器学习-课程整理及初步介绍

简介: 机器学习是人工智能的一个分支&#xff0c;它使计算机系统能够从经验中学习并改进其在特定任务上的表现&#xff0c;而无需进行明确的编程。机器学习涉及多种算法和统计模型&#xff0c;它们可以从数据中学习规律&#xff0c;并做出预测或决策。机器学习的应用非常广泛&…

LabVIEW的热门应用

LabVIEW是一种图形化编程语言&#xff0c;因其易用性和强大的功能&#xff0c;在多个行业和领域中广泛应用。介绍LabVIEW在以下五个热门应用领域中的使用情况&#xff0c;&#xff1a;工业自动化、医疗设备与生物医学工程、科学研究与实验室自动化、能源管理与智能电网、航空航…

[Shell编程学习路线]——if条件语句(单,双,多分支结构)详细语法介绍

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月17日7点50分 &#x1f004;️文章质量&#xff1a;95分 文章目录 ————前言———— &#x1f4af;趣站&#x1f4af…

C语言王国——深入自定义类型(结构体)

目录 一、引言 二、结构体 1. 结构体类型的声明 2. 结构体变量的创建和初始化 2.1 创建 2.2 初始化 2.3 typedef 2.4 特殊声明 2.5 自引用 3. 结构成员访问操作符 4. 结构体内存对齐 4.1 对齐规则 4.2 offsetof 4.3 为什么存在内存对齐 5. 结构体传参 6. 结构体实现…

RTOS实时操作系统

常见的RTOS有&#xff1a; VxWorks&#xff1a;广泛应用于工业、医疗、通信和航空航天领域。FreeRTOS&#xff1a;一个开源的RTOS&#xff0c;广泛用于嵌入式设备。uc/OS&#xff1a;一个适用于教育和小型商业项目的RTOS。QNX&#xff1a;主要应用于汽车和工业自动化领域。Win…

探索C嘎嘎的奇妙世界:第三关---缺省参数与函数重载

在c语言中,我们常常在对有参函数进行传参,这样的繁琐过程,C祖师爷对此进行了相关改进,多说无益,上干货: 1 缺省参数: 缺省参数是指在声明或定义函数时为函数的形参指定一个默认值&#xff08;默认参数&#xff09;。在调用该函数时&#xff0c;如果没有指定实参&#xff0c;则…

Linux常⽤服务器构建-ssh和scp

目录 1.ssh <1>ssh介绍 <2>安装ssh A.安装ssh服务器 B.远程登陆 <3>使⽤ssh连接服务器 2.scp 本地⽂件复制到远程&#xff1a; 本地⽬录复制到远程&#xff1a; 远程⽂件复制到本地&#xff1a; 远程⽬录复制到本地&#xff1a; 1.ssh <1>…

SQLite检索查询结果函数

代码 database.h #include <sqlite3.h> // &#xfffd;&#xfffd;&#xfffd;&#xfffd;SQLite&#xfffd;ӿں&#xfffd;&#xfffd;&#xfffd;#include<stdio.h>// &#xfffd;&#xfffd;&#xfffd;&#xfffd;һ&#xfffd;&#…

TalkingData数据统计:大数据时代的洞察与应用

目录 一 TalkingData简介 公司概述 核心产品 二 数据统计方法 1数据采集 SDK集成 API接口 第三方数据合作 2数据处理与清洗 数据去重 数据校验 数据转换 3数据存储 分布式数据存储 数据分区和索引 4数据分析 描述性统计 探索性数据分析(EDA) 预测性分析 …

04-jQuery工具函数及 jQuery 插件

1. jQuery工具函数 在jQuery中,工具函数是指直接依附于jQuery对象,针对jQuery对象本身定义的方法,即全局性的,我们统称为工具函数,或Utilites函数。 主要作用于&#xff1a;字符串、数组、对象。 调用格式: $.函数名()或jQuery.函数名() 1.1 $.get() 通过远程 HTTP GET 请…

【git使用二】gitee远程仓库创建与本地git命令用法

目录 gitee介绍 管理者注册gitee账号 管理者在gitee网站上创建远程仓库 每个开发者安装git与基本配置 1.git的下载和安装 2.配置SSH公钥 3.开发者信息配置 git命令用法 gitee介绍 Gitee&#xff08;又称码云&#xff09;是一个基于Git的代码托管服务&#xff0c;由开源…