JAVA缓存的实现

article/2025/9/1 20:22:02

缓存可分为二大类:
一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式; 
二、内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查.
下面为一个简单的缓存代码

Java代码 复制代码
  1. package lhm.hcy.guge.frameset.cache;   
  2.   
  3. import java.util.*;   
  4.   
  5. /**  
  6.  * <p>Title: </p>  
  7.  *  
  8.  * <p>Description: 管理缓存</p>  
  9.  * Deep blue 2008-11-28 think  
  10.  * 可扩展的功能:当chche到内存溢出时必须清除掉最早期的一些缓存对象,这就要求对每个缓存对象保存创建时间  
  11.  * <p>Copyright: Copyright (c) 2008</p>  
  12.  *  
  13.  * <p>Company: </p>  
  14.  *  
  15.  * @author Deepblue  2008-11-11  
  16.  * @version 1.0  
  17.  */  
  18. public class CacheManager {   
  19.     private static HashMap cacheMap = new HashMap();   
  20.   
  21.     //单实例构造方法   
  22.     private CacheManager() {   
  23.         super();   
  24.     }   
  25.     //获取布尔值的缓存   
  26.     public static boolean getSimpleFlag(String key){   
  27.         try{   
  28.             return (Boolean) cacheMap.get(key);   
  29.         }catch(NullPointerException e){   
  30.             return false;   
  31.         }   
  32.     }   
  33.     public static long getServerStartdt(String key){   
  34.         try {   
  35.             return (Long)cacheMap.get(key);   
  36.         } catch (Exception ex) {   
  37.             return 0;   
  38.         }   
  39.     }   
  40.     //设置布尔值的缓存   
  41.     public synchronized static boolean setSimpleFlag(String key,boolean flag){   
  42.         if (flag && getSimpleFlag(key)) {//假如为真不允许被覆盖   
  43.             return false;   
  44.         }else{   
  45.             cacheMap.put(key, flag);   
  46.             return true;   
  47.         }   
  48.     }   
  49.     public synchronized static boolean setSimpleFlag(String key,long serverbegrundt){   
  50.         if (cacheMap.get(key) == null) {   
  51.             cacheMap.put(key,serverbegrundt);   
  52.             return true;   
  53.         }else{   
  54.             return false;   
  55.         }   
  56.     }   
  57.   
  58.   
  59.     //得到缓存。同步静态方法   
  60.     private synchronized static Cache getCache(String key) {   
  61.         return (Cache) cacheMap.get(key);   
  62.     }   
  63.   
  64.     //判断是否存在一个缓存   
  65.     private synchronized static boolean hasCache(String key) {   
  66.         return cacheMap.containsKey(key);   
  67.     }   
  68.   
  69.     //清除所有缓存   
  70.     public synchronized static void clearAll() {   
  71.         cacheMap.clear();   
  72.     }   
  73.   
  74.     //清除某一类特定缓存,通过遍历HASHMAP下的所有对象,来判断它的KEY与传入的TYPE是否匹配   
  75.     public synchronized static void clearAll(String type) {   
  76.         Iterator i = cacheMap.entrySet().iterator();   
  77.         String key;   
  78.         ArrayList<String> arr = new ArrayList<String>();   
  79.         try {   
  80.             while (i.hasNext()) {   
  81.                 java.util.Map.Entry entry = (java.util.Map.Entry) i.next();   
  82.                 key = (String) entry.getKey();   
  83.                 if (key.startsWith(type)) { //如果匹配则删除掉   
  84.                     arr.add(key);   
  85.                 }   
  86.             }   
  87.             for (int k = 0; k < arr.size(); k++) {   
  88.                 clearOnly(arr.get(k));   
  89.             }   
  90.         } catch (Exception ex) {   
  91.             ex.printStackTrace();   
  92.         }   
  93.     }   
  94.   
  95.     //清除指定的缓存   
  96.     public synchronized static void clearOnly(String key) {   
  97.         cacheMap.remove(key);   
  98.     }   
  99.   
  100.     //载入缓存   
  101.     public synchronized static void putCache(String key, Cache obj) {   
  102.         cacheMap.put(key, obj);   
  103.     }   
  104.   
  105.     //获取缓存信息   
  106.     public static Cache getCacheInfo(String key) {   
  107.   
  108.         if (hasCache(key)) {   
  109.             Cache cache = getCache(key);   
  110.             if (cacheExpired(cache)) { //调用判断是否终止方法   
  111.                 cache.setExpired(true);   
  112.             }   
  113.             return cache;   
  114.         }else  
  115.             return null;   
  116.     }   
  117.   
  118.     //载入缓存信息   
  119.     public static void putCacheInfo(String key, Cache obj, long dt,boolean expired) {   
  120.         Cache cache = new Cache();   
  121.         cache.setKey(key);   
  122.         cache.setTimeOut(dt + System.currentTimeMillis()); //设置多久后更新缓存   
  123.         cache.setValue(obj);   
  124.         cache.setExpired(expired); //缓存默认载入时,终止状态为FALSE   
  125.         cacheMap.put(key, cache);   
  126.     }   
  127.     //重写载入缓存信息方法   
  128.     public static void putCacheInfo(String key,Cache obj,long dt){   
  129.         Cache cache = new Cache();   
  130.         cache.setKey(key);   
  131.         cache.setTimeOut(dt+System.currentTimeMillis());   
  132.         cache.setValue(obj);   
  133.         cache.setExpired(false);   
  134.         cacheMap.put(key,cache);   
  135.     }   
  136.   
  137.     //判断缓存是否终止   
  138.     public static boolean cacheExpired(Cache cache) {   
  139.         if (null == cache) { //传入的缓存不存在   
  140.             return false;   
  141.         }   
  142.         long nowDt = System.currentTimeMillis(); //系统当前的毫秒数   
  143.         long cacheDt = cache.getTimeOut(); //缓存内的过期毫秒数   
  144.         if (cacheDt <= 0||cacheDt>nowDt) { //过期时间小于等于零时,或者过期时间大于当前时间时,则为FALSE   
  145.             return false;   
  146.         } else { //大于过期时间 即过期   
  147.             return true;   
  148.         }   
  149.     }   
  150.   
  151.     //获取缓存中的大小   
  152.     public static int getCacheSize() {   
  153.         return cacheMap.size();   
  154.     }   
  155.   
  156.     //获取指定的类型的大小   
  157.     public static int getCacheSize(String type) {   
  158.         int k = 0;   
  159.         Iterator i = cacheMap.entrySet().iterator();   
  160.         String key;   
  161.         try {   
  162.             while (i.hasNext()) {   
  163.                 java.util.Map.Entry entry = (java.util.Map.Entry) i.next();   
  164.                 key = (String) entry.getKey();   
  165.                 if (key.indexOf(type) != -1) { //如果匹配则删除掉   
  166.                     k++;   
  167.                 }   
  168.             }   
  169.         } catch (Exception ex) {   
  170.             ex.printStackTrace();   
  171.         }   
  172.   
  173.         return k;   
  174.     }   
  175.   
  176.     //获取缓存对象中的所有键值名称   
  177.     public static ArrayList<String> getCacheAllkey() {   
  178.         ArrayList a = new ArrayList();   
  179.         try {   
  180.             Iterator i = cacheMap.entrySet().iterator();   
  181.             while (i.hasNext()) {   
  182.                 java.util.Map.Entry entry = (java.util.Map.Entry) i.next();   
  183.                 a.add((String) entry.getKey());   
  184.             }   
  185.         } catch (Exception ex) {} finally {   
  186.             return a;   
  187.         }   
  188.     }   
  189.   
  190.     //获取缓存对象中指定类型 的键值名称   
  191.     public static ArrayList<String> getCacheListkey(String type) {   
  192.         ArrayList a = new ArrayList();   
  193.         String key;   
  194.         try {   
  195.             Iterator i = cacheMap.entrySet().iterator();   
  196.             while (i.hasNext()) {   
  197.                 java.util.Map.Entry entry = (java.util.Map.Entry) i.next();   
  198.                 key = (String) entry.getKey();   
  199.                 if (key.indexOf(type) != -1) {   
  200.                     a.add(key);   
  201.                 }   
  202.             }   
  203.         } catch (Exception ex) {} finally {   
  204.             return a;   
  205.         }   
  206.     }   
  207.   
  208. }   
  209.   
  210.   
  211. package lhm.hcy.guge.frameset.cache;   
  212.   
  213. /**  
  214.  * <p>Title: </p>  
  215.  *  
  216.  * <p>Description: 缓存DTO</p>  
  217.  *  
  218.  * <p>Copyright: Copyright (c) 2008</p>  
  219.  *  
  220.  * <p>Company: </p>  
  221.  *  
  222.  * @author Deepblue  2008-11-11  
  223.  * @version 1.0  
  224.  */  
  225. public class Cache {   
  226.         private String key;//缓存ID   
  227.         private Object value;//缓存数据   
  228.         private long timeOut;//更新时间   
  229.         private boolean expired; //是否终止   
  230.         public Cache() {   
  231.                 super();   
  232.         }   
  233.   
  234.         public Cache(String key, Object value, long timeOut, boolean expired) {   
  235.                 this.key = key;   
  236.                 this.value = value;   
  237.                 this.timeOut = timeOut;   
  238.                 this.expired = expired;   
  239.         }   
  240.   
  241.         public String getKey() {   
  242.                 return key;   
  243.         }   
  244.   
  245.         public long getTimeOut() {   
  246.                 return timeOut;   
  247.         }   
  248.   
  249.         public Object getValue() {   
  250.                 return value;   
  251.         }   
  252.   
  253.         public void setKey(String string) {   
  254.                 key = string;   
  255.         }   
  256.   
  257.         public void setTimeOut(long l) {   
  258.                 timeOut = l;   
  259.         }   
  260.   
  261.         public void setValue(Object object) {   
  262.                 value = object;   
  263.         }   
  264.   
  265.         public boolean isExpired() {   
  266.                 return expired;   
  267.         }   
  268.   
  269.         public void setExpired(boolean b) {   
  270.                 expired = b;   
  271.         }   
  272. }   
  273.   
  274. //测试类,   
  275. class Test {   
  276.     public static void main(String[] args) {   
  277.         System.out.println(CacheManager.getSimpleFlag("alksd"));   
  278. //        CacheManager.putCache("abc", new Cache());   
  279. //        CacheManager.putCache("def", new Cache());   
  280. //        CacheManager.putCache("ccc", new Cache());   
  281. //        CacheManager.clearOnly("");   
  282. //        Cache c = new Cache();   
  283. //        for (int i = 0; i < 10; i++) {   
  284. //            CacheManager.putCache("" + i, c);   
  285. //        }   
  286. //        CacheManager.putCache("aaaaaaaa", c);   
  287. //        CacheManager.putCache("abchcy;alskd", c);   
  288. //        CacheManager.putCache("cccccccc", c);   
  289. //        CacheManager.putCache("abcoqiwhcy", c);   
  290. //        System.out.println("删除前的大小:"+CacheManager.getCacheSize());   
  291. //        CacheManager.getCacheAllkey();   
  292. //        CacheManager.clearAll("aaaa");   
  293. //        System.out.println("删除后的大小:"+CacheManager.getCacheSize());   
  294. //        CacheManager.getCacheAllkey();   
  295.   
  296.   
  297.     }   
  298. }  

 

http://www.javaeye.com/topic/544021


http://chatgpt.dhexx.cn/article/11FtkaNy.shtml

相关文章

java缓存技术的介绍

一、什么是缓存 1、Cache是高速缓冲存储器 一种特殊的存储器子系统&#xff0c;其中复制了频繁使用的数据以利于快速访问 2、凡是位于速度相差较大的两种硬件/软件之间的&#xff0c;用于协调两者数据传输速度差异的结构&#xff0c;均可称之为 Cache 二、缓存的分类 1、基于we…

Java缓存介绍

一、缓存 1、什么是缓存&#xff1f; 缓存是硬件&#xff0c;是CPU中的组件&#xff0c;CPU存取数据的速度非常的快&#xff0c;一秒钟能够存取、处理十亿条指令和数据&#xff08;术语&#xff1a;CPU主频1G&#xff09;&#xff0c;而内存就慢很多&#xff0c;快的内存能够达…

Java实现本地缓存、分布式缓存及多级缓存

以下均为自己参考其它博主文章或自己理解整理而成&#xff0c;如有错误之处&#xff0c;欢迎在评论区批评指正&#xff01; 0. 缓存简介 像MySql等传统的关系型数据库已经不能适用于所有的业务场景&#xff0c;比如电商系统的秒杀场景&#xff0c;APP首页的访问流量高峰场景&a…

Java本地高性能缓存的几种实现方式

Java缓存技术可分为远端缓存和本地缓存&#xff0c;远端缓存常用的方案有著名的redis和memcache&#xff0c;而本地缓存的代表技术主要有HashMap&#xff0c;Guava Cache&#xff0c;Caffeine和Encahche。本篇博文仅覆盖了本地缓存&#xff0c;且突出探讨高性能的本地缓存。 本…

SIFT的两个版本:OpenCV和VL_SIFT

暂时记录一下 OpenCV版本&#xff1a; #include<iostream> #include<opencv2/opencv.hpp> #include<opencv2/core.hpp> #include<opencv2/features2d.hpp> #include <opencv2/xfeatures2d/nonfree.hpp>using namespace std; using namespace c…

论文阅读笔记《Matching Images With Multiple Descriptors: An Unsupervised Approach for Locally Adaptive》

核心思想 本文提出一种将多种特征描述算法融合起来实现更好图像匹配的方法。近些年来&#xff0c;图像特征的描述算法层出不穷如SIFT、LIOP 、DAISY等等&#xff0c;每种方法都有各自的优势和侧重点&#xff0c;对于不同图像其效果也各有优劣。那么能不能将多种算法的优势结合起…

LIFT: Learned Invariant Feature Transform详细笔记

LIFT: Learned Invariant Feature Transform Paper: LIFT: Learned Invariant Feature Transform | SpringerLink Code: GitHub - cvlab-epfl/LIFT: Code release for the ECCV 2016 paper 文章目录 Abstract思路来源LIFT文献来源 方法&#xff1a;LIFTPipeline网络架构训练流…

简单的倒计时shell脚本

效果如下: 代码如下: #! /bin/bash #####################倒计时################ #作者:liop #完成时间:2019.12.17 #三位数以内秒数的倒计时 ########################################## display(){case $1 in1)case $2 in1)echo "******** ";;2)echo "…

计算机视觉领域经典论文源码

计算机视觉领域经典论文源码 转载自&#xff1a;http://blog.csdn.net/ddreaming/article/details/52416643 2016-CVPR论文代码资源&#xff1a; https://tensortalk.com/?catconference-cvpr-2016 一个GitHub账号&#xff0c;里面有很多计算机视觉领域最新论文的代码实现&am…

【译文】Local Intensity Order Pattern for Feature Description

在上一篇文章【特征检测】LIOP特征描述算法中讲到了LIOP描述符&#xff0c;下面我将原文翻译如下&#xff0c;如有出入请以原文为准。 —————————————————————————————————————————————————————————————————…

[2015 Springer] Local Image Descriptor: Modern Approaches——2 Classical Local Descriptors

转载请注明链接&#xff1a; 有问题请及时联系博主&#xff1a;Alliswell_WP 第一篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/103475243 第二篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/103610331 翻译 本地图像描述…

[2015 Springer] Local Image Descriptor: Modern Approaches——3 Intensity Order-Based Local Descriptors

转载请注明链接&#xff1a; 有问题请及时联系博主&#xff1a;Alliswell_WP&#xff1a;Alliswell_WP 第一篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/103475243 第二篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/10361…

在SIFT和SURF之后,有哪些比较新的且具有一定影响力的自然图像配准算法?

链接&#xff1a;https://www.zhihu.com/question/32066833/answer/2041516754 编辑&#xff1a;深度学习与计算机视觉 声明&#xff1a;仅做学术分享&#xff0c;侵删 作者&#xff1a;Vinjn张静https://www.zhihu.com/question/32066833/answer/54575191 我就提一下 OpenCV 中…

matlab vlfeat hog,vlfeat-0.9.20-bin 特征提取的工具包,实现各种 ,如hog,lbp,sift. matlab 242万源代码下载- www.pudn.com...

文件名称: vlfeat-0.9.20-bin下载 收藏√ [ 5 4 3 2 1 ] 开发工具: matlab 文件大小: 17828 KB 上传时间: 2015-07-21 下载次数: 0 提 供 者: 刘晓晶 详细说明&#xff1a;特征提取的工具包&#xff0c;实现各种特征&#xff0c;如hog,lbp,sift.-Feature extraction kit …

关于视觉SLAM的最先进技术的调查-A survey of state-of-the-art on visual SLAM

原文见文章末尾&#xff1a; 今天读了一篇视觉slam的综述&#xff0c;真的是读了一天&#xff0c;记录一下。我比较关注的是特征提取和匹配和深度学习有关的章节。好久&#xff0c;但是还算是有收获的吧。 摘要&#xff1a; 本文概述了视觉同步定位和测绘&#xff08;V-SLAM&a…

队列

目录 队列的概念及结构队列代码实现 队列的概念及结构 队列和栈略有不同&#xff0c;队列是先进后出的一种数据结构&#xff0c;通常使用链表来表示&#xff0c;当然有一种特殊的循环队列使用顺序表来进行表示的。 队列只允许从后进入&#xff0c;从前弹出&#xff0c;就像我们…

HPatches数据集(图像匹配)---2关于评估代码的解释---和python画出结果

关于画图: 参考: Matplotlib系列: https://blog.csdn.net/yuyh131/category_7823048.html 关于评估代码的解释: 我们先提前下载所有算法对数据集patches提取的描述符: ./download.sh descr List of available descriptor results file for HPatches: ----------------------…

LIOP特征

注&#xff1a;本文是笔者在阅读相关英文文献后&#xff0c;翻译、整理所得&#xff1b;原文是&#xff1a;Local Intensity Order Pattern for Feature Description&#xff1b; Zhenhua Wang, Bin Fan, and Fuchao Wu&#xff1b;ICCV2011 LIOP: Local Intensity Order Patte…

【特征检测】LIOP特征描述算法

简介&#xff1a; LIOP特征描述算法&#xff0c;是2011年ICCV上一片paper《Local Intensity Order Pattern for Feature Description》中提出的一种特征描述算法。等有空闲时间把原文仔细翻译一遍&#xff0c;然后放上来分享给大家。 算法的提出者也是比较厉害的&#xff0c;其…

php把字符串日期转成时间戳,php怎样把日期转成时间戳

php把日期转成时间戳的方法&#xff1a;可以利用strtotime()函数来实现。strtotime()函数可以将任何字符串的日期时间描述解析为Unix时间戳&#xff0c;若成功则返回时间戳&#xff0c;失败则返回false。 strtotime() 函数将任何字符串的日期时间描述解析为 Unix 时间戳&#x…