java 缓存的简单实现
实现一个简单的缓存,具有缓存添加,获取,删除,过期自动删除等,主要存储方式为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 缓存的简单实现相关推荐
- java 缓存的简单实现_Java8简单的本地缓存实现
这里我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存.因为Map有一个新的方法,在key为Null的时候自动计算一个新的value值.非常适合实现cache. ...
- java 缓存_Java8简单的本地缓存实现
原文链接 译文链接 翻译:踏雁寻花,校对:丁一 这里我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存.因为Map有一个新的方法,在key为Null的时候自动计 ...
- Map实现java缓存机制的简单实例
缓存是Java中主要的内容,主要目的是缓解项目访问数据库的压力以及提升访问数据的效率,以下是通过Map实现java缓存的功能,并没有用cache相关框架. 一.缓存管理类 CacheMgr.java ...
- java 缓存方法_Java实现一个简单的缓存方法
Java实现一个简单的缓存方法 发布时间:2020-09-07 21:39:55 来源:脚本之家 阅读:99 作者:BrightLoong 缓存是在web开发中经常用到的,将程序经常使用到或调用到的对 ...
- 写缓存java,编写线程安全的Java缓存读写机制 (原创)
一种习以为常的缓存写法: IF value in cached THEN return value from cache ELSE compute value save value in cache ...
- java写一个搜索引擎_搜索引擎—-Java实现一个简单的网络爬虫
Java实现一个简单的爬虫程序. package SearchCrawler;import java.util.*;import java.net.*;import java.io.*;import ...
- Java缓存框架使用EhCache结合Spring AOP
Java缓存框架使用EhCache结合Spring AOP 一.Ehcache简介 EhCache是一个纯Java的进程内缓存框架,具有如下特点: 1. 快速简单,非常容易和应用集成. ...
- java 高性能缓存_高性能Java缓存----Caffeine
简单介绍 Caffeine是新出现的一个高性能的Java缓存,有了它完全可以代替Guava Cache,来实现更加高效的缓存:Caffeine采用了W-TinyLFU回收策略,集合了LRU和LFU的优 ...
- 剑指offer之java缓存总结,从单机缓存到分布式缓存架构
1.缓存定义 高速数据存储层,提高程序性能 2.为什么要用缓存(读多写少,高并发) 1.提高读取吞吐量 2.提升应用程序性能 3.降低数据库成本 4.减少后端负载 5.消除数据库热点 6.可预测的性能 ...
最新文章
- 使用 HttpResponse.Write 方法进行字符串串联
- 7、Altiris cms 7.0 软件管理 下
- 【普通の随笔】6.30
- 自学python到什么程度可以找工作-Python学到什么程度才可以去找工作?掌握这4点足够了!...
- Android OpenGL ES(六)创建实例应用OpenGLDemos程序框架 .
- 韩顺平_JAVA_视频教程_下载(打开迅雷,直接复制链接地址即可下载)
- 下载到的电子书格式是Mobi,这种格式能否在IOS手机上打开?
- ExDirectUI 5.0 项目重构正式启动
- 计算机网络对社会发展的影响
- php 新浪微博登陆,PHP使用新浪微博登入第三方网站实例代码
- 经济学:选择140题
- win10系统更新后底部状态栏经常无响应
- DELL H61刷BIOS开启AHCI
- 基于SPI协议下的OLED显示
- Swift UIImageView 相框
- 算法图解(一):算法简介
- ThymeLeaf工具类:Objects、String、Dates、Calendars、Numbers、Booleans、Arrays、Lists、Sets、Maps工具类
- 数据库之关系数据库之超码,候选码,主码,主属性,非主属性(非码属性)之间的关系
- flutter引入高德地图_玩玩Flutter Web —— 实现高德地图插件
- SEO 小白攻略 to replace