如何手撸一个java缓存框架

创建一个简单的Java缓存框架涉及到多个方面,包括数据结构的选择、缓存策略的实现、线程安全的保证等。下面是一个简单的Java缓存框架的核心代码案例,它将展示如何实现一个基本的缓存机制。
首先,我们定义一个Cache接口,它包含缓存的基本操作:

public interface Cache<K, V> {void put(K key, V value);V get(K key);void remove(K key);int size();void clear();
}

接下来,我们实现这个接口,创建一个基于ConcurrentHashMap的简单缓存:

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
public class SimpleCache<K, V> implements Cache<K, V> {private final ConcurrentHashMap<K, CacheValue<V>> cache;private final long expirationTime;private final TimeUnit timeUnit;public SimpleCache(long expirationTime, TimeUnit timeUnit) {this.cache = new ConcurrentHashMap<>();this.expirationTime = expirationTime;this.timeUnit = timeUnit;}@Overridepublic void put(K key, V value) {long expirationTimestamp = System.currentTimeMillis() + timeUnit.toMillis(expirationTime);CacheValue<V> cacheValue = new CacheValue<>(value, expirationTimestamp);cache.put(key, cacheValue);}@Overridepublic V get(K key) {CacheValue<V> cacheValue = cache.get(key);if (cacheValue == null || isExpired(cacheValue)) {return null;}return cacheValue.getValue();}@Overridepublic void remove(K key) {cache.remove(key);}@Overridepublic int size() {return cache.size();}@Overridepublic void clear() {cache.clear();}private boolean isExpired(CacheValue<V> cacheValue) {return System.currentTimeMillis() > cacheValue.getExpirationTimestamp();}private static class CacheValue<V> {private final V value;private final long expirationTimestamp;public CacheValue(V value, long expirationTimestamp) {this.value = value;this.expirationTimestamp = expirationTimestamp;}public V getValue() {return value;}public long getExpirationTimestamp() {return expirationTimestamp;}}
}

在这个简单的实现中,我们使用ConcurrentHashMap来存储键值对,并且每个值都有一个过期时间。当获取一个值时,我们会检查它是否已经过期,如果过期则返回null
这个缓存框架非常基础,它没有实现复杂的缓存策略(如LRU)或者分布式缓存功能。在实际应用中,你可能需要添加更多的功能和配置选项,例如缓存加载器、缓存写回策略、缓存事件监听器等。
要使用这个缓存框架,你可以像这样创建一个缓存实例并使用它:

public class CacheExample {public static void main(String[] args) {Cache<String, String> cache = new SimpleCache<>(10, TimeUnit.SECONDS);cache.put("key", "value");String value = cache.get("key");System.out.println(value); // 输出: value// 等待超过过期时间try {Thread.sleep(11000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}value = cache.get("key");System.out.println(value); // 输出: null,因为值已经过期}
}

这个例子展示了如何创建一个简单的Java缓存框架,并使用它来存储和获取值。在实际项目中,你可能需要根据具体需求来扩展和优化这个框架。

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

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

相关文章

探索str Python用法:深入理解字符串操作的精髓

探索str Python用法&#xff1a;深入理解字符串操作的精髓 在Python的广袤天地中&#xff0c;str类型无疑占据着举足轻重的地位。它不仅是数据处理和信息交换的基石&#xff0c;更是我们与计算机世界沟通的桥梁。然而&#xff0c;str的用法远非表面所见那般简单&#xff0c;它…

端午节景区视频监控方案:智慧景区EasyCVR视频监控系统构建与运用

端午节&#xff0c;作为中国传统节日之一&#xff0c;每年吸引着大量游客前往各地景区参观游览&#xff0c;感受浓厚的文化氛围。然而&#xff0c;随着游客数量的增多&#xff0c;景区管理也面临着越来越多的挑战&#xff0c;其中安全问题尤为突出。因此&#xff0c;实施端午节…

顺序表、链表、栈和队列总结

目录 顺序表 链表 栈 队列 总结 补充 顺序表 实现 链表 实现 栈 实现 队列 实现 顺序表、链表、栈和队列都是线性数据结构&#xff0c;但它们在管理和访问数据方面有不同的特点和用途。以下是它们之间的主要区别&#xff1a; 顺序表 存储方式&#xff1a;在连续…

使用 ESPCN 模型进行超分辨率图像处理

前言 使用 ESPCN (Efficient Sub-Pixel CNN) 模型对低分辨率的图像&#xff0c;进行超分辨率处理。 效果展示 lowres 表示低分辨率图像&#xff0c;highres 表示高分辨率图像&#xff0c;prediction 表示模型预测的高分辨率图像&#xff0c;可以看出模型在生成高分辨率图像过…

力扣hot100:155. 最小栈(栈,辅助栈存储相关信息)

LeetCode&#xff1a;155. 最小栈 1、尝试单调栈 看到这题说&#xff0c;要常数时间内检索最小元素的栈&#xff0c;想到了单调栈&#xff0c;递增单调栈确实能维护最小值&#xff0c;但是这个最小值是存在一定意义的&#xff0c;即如果后面出现了最小值&#xff0c;那么前面…

光电管道液位传感器与电容式液位开关相比

如今&#xff0c;随着检测液位技术的不断发展&#xff0c;检测液位的方法也越来越多&#xff0c;比如浮球开关、电容式液位传感器、管道式液位传感器等等&#xff0c;那么光电管道液位传感器与电容式液位开关相比&#xff0c;有哪些优势&#xff1f; 光电管道液位传感器采用先…

论文高级图表绘制(Python语言,局部放大图)

本文将通过一个具体的示例,展示如何使用Python语言和Matplotlib库来绘制高级图表,包括局部放大图的制作。适用于多条曲线绘制在同一个图表中,但由于数据量过大,导致曲线的细节看不清,需要对细节进行局部放大。如下图: 环境准备 首先,确保你的Python环境中已经安装了以…

页面加载性能分析中,如何确定哪些资源是关键的,哪些可以延迟加载?

在页面加载性能分析中&#xff0c;确定哪些资源是关键的&#xff0c;哪些可以延迟加载&#xff0c;可以通过以下步骤进行&#xff1a; 使用 Performance 面板&#xff1a; 在 Chrome DevTools 的 Performance 面板中记录页面加载过程。分析记录结果&#xff0c;查看哪些资源加载…

基于SSM+Jsp的高校信息资源共享平台

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

页面加载性能分析时,有哪些常见的性能瓶颈需要特别注意?

在进行页面加载性能分析时&#xff0c;以下是一些常见的性能瓶颈&#xff0c;需要特别注意&#xff1a; 长页面加载时间&#xff1a; 页面加载时间超过行业标准或用户期望&#xff0c;导致用户流失。 高 CPU 使用率&#xff1a; 某些脚本或操作导致 CPU 使用率飙升&#xff0c;…

基于STM32开发的智能家居监控系统

目录 引言环境准备智能家居监控系统基础代码实现&#xff1a;实现智能家居监控系统 4.1 传感器数据读取4.2 电器设备控制4.3 实时数据监控与分析4.4 用户界面与数据可视化应用场景&#xff1a;家庭安全监控与管理问题解决方案与优化收尾与总结 1. 引言 随着智能家居技术的发…

C++的MQTT开发:使用Paho的C++接口实现消息发布、订阅、连接RabbitMQ

C Paho实现MQTT消息发布功能 要使用paho的cpp接口实现发布MQTT消息的功能&#xff0c;需要进行以下步骤&#xff1a; 安装paho库&#xff1a;首先从paho官方网站下载并安装paho的C库。可以从https://www.eclipse.org/paho/clients/cpp/ 下载适合操作系统的版本。 创建MQTT客户…

FM151A,FM171B和利时工控

FM151A,FM171B和利时工控&#xff0c;DCS系统应该具备以下特点&#xff1a;1.系统具备开放的体系结构&#xff0c;可以提供多层的开放数据接口&#xff1b;FM151A,FM171B和利时工控。2.系统应具备强大的处理功能&#xff0c;中型分布式控制系统大型数据采集监控系统功能。FM151…

[数据集][目标检测]室内积水检测数据集VOC+YOLO格式761张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;761 标注数量(xml文件个数)&#xff1a;761 标注数量(txt文件个数)&#xff1a;761 标注类别…

Spark Python环境搭建与优化:深入剖析四个方面、五个方面、六个方面及七个关键要点

Spark Python环境搭建与优化&#xff1a;深入剖析四个方面、五个方面、六个方面及七个关键要点 在大数据处理领域&#xff0c;Apache Spark凭借其出色的性能和灵活性备受瞩目。而要在Python中利用Spark的强大功能&#xff0c;首先需要搭建一个稳定且高效的Spark Python环境。本…

使用小黄鸟(HttpCanary)、VMOS Pro虚拟机对手机APP进行抓包(附带软件)

老规矩先看&#xff0c;效果图&#xff1a; 文章很详细&#xff0c;希望可以耐心看完&#xff0c;保证可以学会抓包&#xff0c;不再走冤枉路&#xff0c;小编在之前看过太多类似文章&#xff0c;折腾了太久才搞懂的&#xff0c;写这篇文章就是不想希望你们像小编一样再花时间…

C++ 20新特性之三向比较运算符

概述 在C中&#xff0c;如果需要对两个自定义类的对象进行比较&#xff0c;我们通常要单独定义6个比较运算符&#xff1a;、!、<、<、>、>。这不仅繁琐&#xff0c;还很容易出错&#xff0c;特别是当比较逻辑复杂时&#xff0c;稍有不慎就会引发不一致的比较结果。…

最新的ffmepg.js前端VUE3实现视频、音频裁剪上传功能

package.json "dependencies": {"ffmpeg/ffmpeg": "^0.12.10","ffmpeg/util": "^0.12.1" }vue3组件代码 根据需要更改 <script setup lang"ts"> import { FFmpeg } from ffmpeg/ffmpeg; import { fetchF…

mac无法读取windows分区怎么办 苹果硬盘怎么读取

对于Mac电脑用户但有Windows系统使用需求的&#xff0c;我们可以通过Boot Camp启动转换助理安装Windows分区这个方案来解决&#xff0c;不过因为两个系统的磁盘格式不同&#xff0c;相应的也会产生一些问题&#xff0c;例如无法正常读取windows分区。下面本文就详细说明mac无法…

在Java中使用SeleniumAPI,超详细

Java中 Selenium相关操作 1 定位元素 1.1 css选择器定位元素 就是定位到页面的元素&#xff0c;本质上就是一个一个的语法 下面举几个具体的例子&#xff1a; 类选择器 按照给定的 class 属性的值&#xff0c;选择所有匹配的元素。 语法&#xff1a;.classname 例子&am…