实现一个简单的缓存,具有缓存添加,获取,删除,过期自动删除等,主要存储方式为Map

首先建一个缓存数据实体类,用到了lombok消除get set 和全参构造函数

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;@Getter
@Setter
@AllArgsConstructor
public class CacheEntity {/*** 数据主体*/private Object data;/*** 超时时长,0永不超时*/private Long timeout; /*** 缓存设置初始时间*/private Long initialTime;
}

再建一个缓存具体操作接口,支持对缓存的各种操作

import java.util.Map;
import java.util.Set;public interface CacheManager {/*** 存入缓存* @param key* @param data*/void put(String key, CacheEntity cacheData);/*** 存入缓存* @param key* @param data* @param timeout*/void put(String key, Object data, Long timeout);/*** 获取缓存* @param key* @return*/CacheEntity getCacheByKey(String key);/*** 获取所有缓存* @return*/Map<String, CacheEntity> getCacheAll();/*** 判断缓存是否存在* @param key* @return*/boolean isExist(String key);/*** 清除所有缓存*/void clearAll();/*** 清除对应缓存* @param key*/void clearByKey(String key);/*** 缓存是否失效* @param key* @return*/boolean isTimeOut(String key);/*** 获取所有key* @return*/Set<String> getKeys();
}

对缓存接口实现,主要运用ConcurrentHashMap来保证多线程读写

import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;public class CacheManagerImpl implements CacheManager{private static volatile CacheManagerImpl INSTANCE;private static Map<String, CacheEntity> caches = new ConcurrentHashMap<>();private  CacheManagerImpl() {}public static CacheManagerImpl getInstance() {if (INSTANCE == null) {synchronized (CacheManagerImpl.class) {if (INSTANCE == null) {INSTANCE = new CacheManagerImpl();}}}return INSTANCE;}@Overridepublic void put(String key, CacheEntity cacheData) {caches.put(key, cacheData);}@Overridepublic void put(String key, Object data, Long timeout) {timeout = timeout > 0? timeout : 0L;put(key, new CacheEntity(data, timeout, System.currentTimeMillis()));}@Overridepublic CacheEntity getCacheByKey(String key) {if(this.isExist(key))return caches.get(key);return null;}@Overridepublic Map<String, CacheEntity> getCacheAll() {return caches;}@Overridepublic boolean isExist(String key) {return caches.containsKey(key);}@Overridepublic void clearAll() {caches.clear();}@Overridepublic void clearByKey(String key) {if (this.isExist(key)) {caches.remove(key);}}@Overridepublic boolean isTimeOut(String key) {if (!this.isExist(key)) {return true;} CacheEntity cacheEntity = caches.get(key);Long timeOut = cacheEntity.getTimeout();Long initialTime = cacheEntity.getInitialTime();if (timeOut == 0 || System.currentTimeMillis() - initialTime < timeOut) {return false;} return true;}@Overridepublic Set<String> getKeys() {return caches.keySet();}}

然后再新建一个线程对该缓存进行监听,来处理过期数据

import java.util.Set;public class CacheListener {private CacheManager cacheManager;public CacheListener(CacheManager cacheManager) {this.cacheManager = cacheManager;}public void startListen() {new Thread(new Runnable() {@Overridepublic void run() {while(true) {Set<String> keys = cacheManager.getKeys();for (String key : keys) {if(cacheManager.isTimeOut(key)) {cacheManager.clearByKey(key);System.out.println(key + " 被清除了");}}try {Thread.sleep(5000);System.out.println("休息5s再检查");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}).start();}
}

最后测试类如下

import java.util.Arrays;
import java.util.concurrent.TimeUnit;public class TestCache {public static void main(String[] args) {CacheManager cacheManager = CacheManagerImpl.getInstance();cacheManager.put("testtimeout", "kkkkkkkkk", 20 * 1000L);cacheManager.put("test1", "111111111", 0L);cacheManager.put("test2", "222222222222222", 100 * 1000L);cacheManager.put("test3", "33333333333333", 0L);CacheListener cacheListener = new CacheListener(cacheManager);cacheListener.startListen();System.out.println("getCacheAll : " + Arrays.asList(cacheManager.getCacheAll()));System.out.println("getCacheKeyAll : " + Arrays.asList(cacheManager.getKeys()));System.out.println("getKey : " + Arrays.asList(cacheManager.getCacheByKey("test1")));System.out.println("isExist false: " + Arrays.asList(cacheManager.isExist("test")));System.out.println("isExist true: " + Arrays.asList(cacheManager.isExist("test1")));System.out.println("istimeOut false: " + Arrays.asList(cacheManager.isTimeOut("test1")));try {TimeUnit.SECONDS.sleep(30);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("isExist : " + Arrays.asList(cacheManager.isExist("testtimeout")));}
}

运行结果:

java 缓存的简单实现相关推荐

  1. java 缓存的简单实现_Java8简单的本地缓存实现

    这里我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存.因为Map有一个新的方法,在key为Null的时候自动计算一个新的value值.非常适合实现cache. ...

  2. java 缓存_Java8简单的本地缓存实现

    原文链接 译文链接 翻译:踏雁寻花,校对:丁一 这里我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存.因为Map有一个新的方法,在key为Null的时候自动计 ...

  3. Map实现java缓存机制的简单实例

    缓存是Java中主要的内容,主要目的是缓解项目访问数据库的压力以及提升访问数据的效率,以下是通过Map实现java缓存的功能,并没有用cache相关框架. 一.缓存管理类 CacheMgr.java ...

  4. java 缓存方法_Java实现一个简单的缓存方法

    Java实现一个简单的缓存方法 发布时间:2020-09-07 21:39:55 来源:脚本之家 阅读:99 作者:BrightLoong 缓存是在web开发中经常用到的,将程序经常使用到或调用到的对 ...

  5. 写缓存java,编写线程安全的Java缓存读写机制 (原创)

    一种习以为常的缓存写法: IF value in cached THEN return value from cache ELSE compute value save value in cache ...

  6. java写一个搜索引擎_搜索引擎—-Java实现一个简单的网络爬虫

    Java实现一个简单的爬虫程序. package SearchCrawler;import java.util.*;import java.net.*;import java.io.*;import ...

  7. Java缓存框架使用EhCache结合Spring AOP

    Java缓存框架使用EhCache结合Spring AOP 一.Ehcache简介     EhCache是一个纯Java的进程内缓存框架,具有如下特点:     1. 快速简单,非常容易和应用集成. ...

  8. java 高性能缓存_高性能Java缓存----Caffeine

    简单介绍 Caffeine是新出现的一个高性能的Java缓存,有了它完全可以代替Guava Cache,来实现更加高效的缓存:Caffeine采用了W-TinyLFU回收策略,集合了LRU和LFU的优 ...

  9. 剑指offer之java缓存总结,从单机缓存到分布式缓存架构

    1.缓存定义 高速数据存储层,提高程序性能 2.为什么要用缓存(读多写少,高并发) 1.提高读取吞吐量 2.提升应用程序性能 3.降低数据库成本 4.减少后端负载 5.消除数据库热点 6.可预测的性能 ...

最新文章

  1. 使用 HttpResponse.Write 方法进行字符串串联
  2. 7、Altiris cms 7.0 软件管理 下
  3. 【普通の随笔】6.30
  4. 自学python到什么程度可以找工作-Python学到什么程度才可以去找工作?掌握这4点足够了!...
  5. Android OpenGL ES(六)创建实例应用OpenGLDemos程序框架 .
  6. 韩顺平_JAVA_视频教程_下载(打开迅雷,直接复制链接地址即可下载)
  7. 下载到的电子书格式是Mobi,这种格式能否在IOS手机上打开?
  8. ExDirectUI 5.0 项目重构正式启动
  9. 计算机网络对社会发展的影响
  10. php 新浪微博登陆,PHP使用新浪微博登入第三方网站实例代码
  11. 经济学:选择140题
  12. win10系统更新后底部状态栏经常无响应
  13. DELL H61刷BIOS开启AHCI
  14. 基于SPI协议下的OLED显示
  15. Swift UIImageView 相框
  16. 算法图解(一):算法简介
  17. ThymeLeaf工具类:Objects、String、Dates、Calendars、Numbers、Booleans、Arrays、Lists、Sets、Maps工具类
  18. 数据库之关系数据库之超码,候选码,主码,主属性,非主属性(非码属性)之间的关系
  19. flutter引入高德地图_玩玩Flutter Web —— 实现高德地图插件
  20. SEO 小白攻略 to replace

热门文章

  1. java工具封装树形对象,常用于菜单 json树逆向生成list集合
  2. 微信影视小程序是如何赚钱的?效果怎么样?
  3. 栈,队列和链表三者之间的关系与区别
  4. 归置归置,我的 2022
  5. 数据结构(一):数据结构的概述
  6. 什么是推挽输出,开漏输出?
  7. 5分钟弄懂程序员的如何升级到架构师。
  8. Apache服务安装完整教程
  9. 基于深度学习的图标型验证码识别系统(包含完整代码、界面)
  10. 微信小程序canvas实现签名功能