初步揭开缓存神秘面纱之双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

相关文章

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体