初步揭开缓存神秘面纱之双map实现缓存管理的类

2024-05-16 05:28

本文主要是介绍初步揭开缓存神秘面纱之双map实现缓存管理的类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在应用程序中,缓存是一种常见的优化手段,可以提高数据的访问速度。针对缓存管理,我们通常会实现一些类来方便地管理缓存数据。缓存具体是如何实现的,这里我们利用双map做一个缓存的基本实现。

1.考虑缓存有哪些属性
1.是否是永久缓存
2.过期时长
3.先进先出算法
4.最近最少使用算法
....

由于我们只需要先对缓存有个基本的认识,所以利用属性1,属性2,实现一个基本的缓存管理器

@Data
public class CacheEntity implements Serializable {private static final long serialVersionUID = 1L;private long beginTime;// 缓存开始时间private boolean isForever = false;// 是否持久private int durableTime;// 持续时间
}

说明

这段Java代码定义了一个名为CacheEntity的类,实现了Serializable接口,这意味着它可以被序列化。这个类有以下属性和方法:

  • 属性
    • beginTime:缓存开始时间。
    • isForever:是否持久,布尔类型。
    • durableTime:持续时间,整型。
      这个类是用于缓存的实体类,记录了缓存的开始时间、持续时间以及是否持久的信息。
2. 定义缓存管理类
public class MapCache {private static Map<String, Object> cacheMap = new HashMap<>();              // 存储实体对象      键-值private static Map<String, Object> entityMap = new HashMap<>();          // 存储实体属性  键-属性private static MapCache mapCache = null;private MapCache() {}/*** 获取一个缓存管理类实例(单例)** @return MapCache 实例*/public static MapCache getInstance() {if (mapCache == null) {mapCache = new MapCache();}return mapCache;}/*** 添加缓存** @param key          缓存键* @param value        缓存值* @param cacheEntity  缓存实体* @return 是否成功添加缓存*/public boolean addCache(String key, Object value, CacheEntity cacheEntity) {cacheMap.put(key, value);entityMap.put(key, cacheEntity);return true;}/*** 获取缓存实体** @param key 缓存键* @return 缓存值*/public Object getValue(String key) {CacheEntity cacheEntity = (CacheEntity) entityMap.get(key);if (cacheEntity != null) {if (!cacheEntity.isForever()) {   // 非持久缓存if ((System.currentTimeMillis() - cacheEntity.getBeginTime())>= cacheEntity.getDurableTime() * 1000) {  // 判断缓存是否过期cacheMap.remove(key);entityMap.remove(key);return null; // 缓存已过期}}return cacheMap.get(key);}return null; // 缓存不存在}/*** 获取缓存数量** @return 缓存数量*/public int getSize() {return cacheMap.size();}/*** 删除缓存** @param key 缓存键* @return 是否成功删除缓存*/public boolean removeCache(String key) {cacheMap.remove(key);entityMap.remove(key);return true;}/*** 测试方法** @param args 参数*/public static void main(String[] args) {System.out.println("进入加载缓存");MapCache mapCache = MapCache.getInstance();CacheEntity cModel = new CacheEntity();cModel.setBeginTime(System.currentTimeMillis());cModel.setDurableTime(3); // 设置缓存持续时间为3秒cModel.setForever(false);mapCache.addCache("test", "123", cModel); // 在缓存中加入值System.out.println("test=" + mapCache.getValue("test"));System.out.println("睡眠2秒,缓存值应该还存在");try {// 让当前线程睡眠2秒钟Thread.sleep(2000);} catch (InterruptedException e) {System.out.println("睡眠被中断");}System.out.println("test=" + mapCache.getValue("test"));System.out.println("再睡眠2秒,此时应该已过期");try {// 让当前线程再睡眠2秒钟Thread.sleep(2000);} catch (InterruptedException e) {System.out.println("睡眠被中断");}System.out.println("test=" + mapCache.getValue("test"));}
}

说明

  • 使用了单例模式,通过getInstance方法获取唯一的MapCache实例。
  • 使用两个HashMap来存储缓存数据和缓存实体属性,其中键为缓存的唯一标识。
  • 提供了addCache方法用于添加缓存,同时将缓存实体属性也存储起来。
  • 提供了getValue方法用于获取缓存数据,如果缓存不是持久的且已经过期,则会从缓存中移除。
  • 提供了getSize方法用于获取缓存数量。
  • 提供了removeCache方法用于删除指定键的缓存数据和缓存实体属性。

同时在测试方法中,我们做了以下几个方面的测试:

设置缓存持续时间为3秒,以验证缓存的过期功能。
通过线程睡眠模拟时间的流逝,以便验证缓存的过期和移除功能。
输出缓存值后,再次睡眠2秒后获取缓存值,验证缓存的过期与移除功能。
输出当前缓存数量,并在删除缓存后再次输出当前缓存数量,以验证删除功能。

这篇关于初步揭开缓存神秘面纱之双map实现缓存管理的类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/994003

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import