- 浏览: 27843 次
- 性别:
- 来自: 北京
文章分类
最新评论
缓存在很多地方我们都能看见,从数据库,hibernate(数据访问层),web前端都存在缓存问题.其中利弊我就不争论了,只是在上次的面试中,遇到一个实例.在一个项目中会存在大量的查询操作,有什么办法能更好的解决.我想缓存机制或许可以运用到.
下面大概写一下java的缓存机制吧,一个简单的缓存实例,方便以后在实际需求中进一步的改进.
Cache对象类
缓存管理类
另一种考虑多线程的Cache
这都是借鉴别人的代码,我自己重新写了一次,并自己理解.纯粹自己使用...
下面大概写一下java的缓存机制吧,一个简单的缓存实例,方便以后在实际需求中进一步的改进.
Cache对象类
package cn.iholdmika.cache; public class Cache { private String key;// 缓存ID private Object value;// 缓存数据 private long timeOut;// 更新时间 private boolean expired; // 是否终止 public Cache() { super(); } public Cache(String key, Object value, long timeOut, boolean expired) { this.key = key; this.value = value; this.timeOut = timeOut; this.expired = expired; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } public long getTimeOut() { return timeOut; } public void setTimeOut(long timeOut) { this.timeOut = timeOut; } public boolean isExpired() { return expired; } public void setExpired(boolean expired) { this.expired = expired; } }
缓存管理类
package cn.iholdmika.cache; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; public class CacheManager { private static HashMap<String, Object> cacheMap = new HashMap<String, Object>(); // 单例模式 private CacheManager() { super(); } // 获取布尔值的缓存 public static boolean getSimpleFlag(String key) { try { boolean value = Boolean.parseBoolean((String) cacheMap.get(key)); return value; } catch (NullPointerException e) { return false; } } // 获取long型缓存 public static long getServerStartdt(String key) { try { return (long) cacheMap.get(key); } catch (Exception e) { return 0; } } // 设置布尔值的缓存 public synchronized static boolean setSimpleFlag(String key, boolean flag) { if (flag && getSimpleFlag(key)) { return false; } else { cacheMap.put(key, flag); return true; } } public synchronized static boolean setSimpleFlag(String key, long serverbegrundt) { if (cacheMap.get(key) == null) { cacheMap.put(key, serverbegrundt); return true; } else { return false; } } // 得到缓存,同步静态方法 private synchronized static Cache getCache(String key) { return (Cache) cacheMap.get(key); } // 判断是否存在一个缓存 private synchronized static boolean hasCache(String key) { return cacheMap.containsKey(key); } // 清楚所有的缓存 public synchronized static void clearAll() { cacheMap.clear(); } // 清除某一类特定缓存,通过遍历hashmap下的所有对象,来判断它的key与传入的type是否匹配 public synchronized static void clearAll(String type) { Iterator iterator = cacheMap.entrySet().iterator(); String key; ArrayList<String> arr = new ArrayList<String>(); try { while (iterator.hasNext()) { java.util.Map.Entry<String, Object> entry = (Entry<String, Object>) iterator .next(); key = entry.getKey(); if (key.startsWith(type)) {// 如果匹配则删除掉 arr.add(key); } } for (int k = 0; k < arr.size(); k++) { clearOnly(arr.get(k)); } } catch (Exception ex) { ex.printStackTrace(); } } // 清除指定的缓存 public synchronized static void clearOnly(String key) { cacheMap.remove(key); } // 载入缓存 public synchronized static void putCache(String key, Cache obj) { cacheMap.put(key, obj); } // 获取缓存信息 public static Cache getCacheInfo(String key) { if (hasCache(key)) { Cache cache = getCache(key); if (cacheExpired(cache)) { // 调用判断是否终止方法 cache.setExpired(true); } return cache; } else return null; } // 载入缓存信息 public static void putCacheInfo(String key, Cache obj, long dt, boolean expired) { Cache cache = new Cache(); cache.setKey(key); cache.setTimeOut(dt + System.currentTimeMillis()); // 设置多久后更新缓存 cache.setValue(obj); cache.setExpired(expired); // 缓存默认载入时,终止状态为FALSE cacheMap.put(key, cache); } // 重写载入缓存信息方法 public static void putCacheInfo(String key, Cache obj, long dt) { Cache cache = new Cache(); cache.setKey(key); cache.setTimeOut(dt + System.currentTimeMillis()); cache.setValue(obj); cache.setExpired(false); cacheMap.put(key, cache); } // 判断缓存是否终止 public static boolean cacheExpired(Cache cache) { if (null == cache) { // 传入的缓存不存在 return false; } long nowDt = System.currentTimeMillis(); // 系统当前的毫秒数 long cacheDt = cache.getTimeOut(); // 缓存内的过期毫秒数 if (cacheDt <= 0 || cacheDt > nowDt) { // 过期时间小于等于零时,或者过期时间大于当前时间时,则为FALSE return false; } else { // 大于过期时间 即过期 return true; } } // 获取缓存中的大小 public static int getCacheSize() { return cacheMap.size(); } // 获取指定的类型的大小 public static int getCacheSize(String type) { int k = 0; Iterator i = cacheMap.entrySet().iterator(); String key; try { while (i.hasNext()) { java.util.Map.Entry entry = (java.util.Map.Entry) i.next(); key = (String) entry.getKey(); if (key.indexOf(type) != -1) { // 如果匹配则删除掉 k++; } } } catch (Exception ex) { ex.printStackTrace(); } return k; } // 获取缓存对象中的所有键值名称 public static ArrayList<String> getCacheAllkey() { ArrayList a = new ArrayList(); try { Iterator i = cacheMap.entrySet().iterator(); while (i.hasNext()) { java.util.Map.Entry entry = (java.util.Map.Entry) i.next(); a.add((String) entry.getKey()); } } catch (Exception ex) { } finally { return a; } } // 获取缓存对象中指定类型 的键值名称 public static ArrayList<String> getCacheListkey(String type) { ArrayList a = new ArrayList(); String key; try { Iterator i = cacheMap.entrySet().iterator(); while (i.hasNext()) { java.util.Map.Entry entry = (java.util.Map.Entry) i.next(); key = (String) entry.getKey(); if (key.indexOf(type) != -1) { a.add(key); } } } catch (Exception ex) { } finally { return a; } } }
另一种考虑多线程的Cache
package cn.iholdmika.cache01; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class ReadWriteLockDemo { static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void main(String[] args) { Data data = new Data(); Worker t1 = new Worker(data, true); Worker t2 = new Worker(data, true); t1.start(); t2.start(); } static class Worker extends Thread { Data data; boolean read; public Worker(Data data, boolean read) { this.data = data; this.read = read; } public void run() { if (read) data.get(); else data.set(); } } static class Data { //ReadWriteLock 可以实现在对加锁后的对象进行 ' 写 ' 操作的时,其他线程不能读写,而在 ' 读 ' 操作时其他线程则可以 ' 读而不可以写'. ReadWriteLock lock = new ReentrantReadWriteLock(); Lock read = lock.readLock(); Lock write = lock.writeLock(); public void set() { write.lock(); System.out.println(Thread.currentThread().hashCode() + " set:begin " + sdf.format(new Date())); try { Thread.sleep(5000); // } catch (Exception e) { } finally { System.out.println(Thread.currentThread().hashCode() + " set:end " + sdf.format(new Date())); write.unlock(); } } public int get() { read.lock(); System.out.println(Thread.currentThread().hashCode() + " get :begin " + sdf.format(new Date())); try { Thread.sleep(5000); } catch (Exception e) { } finally { System.out.println(Thread.currentThread().hashCode() + " get :end " + sdf.format(new Date())); read.unlock(); } return 1; } } }
这都是借鉴别人的代码,我自己重新写了一次,并自己理解.纯粹自己使用...
相关推荐
在 Java 中,缓存机制的实现可以通过各种方式,例如使用 HashMap、TreeMap、LinkedHashMap 等数据结构来存储缓存对象。下面是一个简单的缓存管理器的实现: CacheManager 类的实现: CacheManager 类是一个简单...
Java 缓存机制是提高...综上所述,Java缓存机制涉及到声明式缓存的使用、缓存抽象的理解以及Web开发中的会话管理、Cookie和SSO实现。在实际应用中,还需要考虑SEO策略,合理利用各种技术来提升用户体验和系统的性能。
本文介绍了 Java 日志机制,并通过扩展日志功能,实现日志缓存。同时,可以动态控制日志信息打印到日志文件的级别,从而提高了日志的灵活性,给产品质量带来更大的帮助。文章主要围绕 MemoryHandler 类和 logging....
在Java中实现LRU缓存机制,不仅可以帮助我们更好地理解和应用数据结构,还能在实际开发中提高程序的性能。本文将详细介绍如何在Java中实现LRU缓存机制,包括其原理、实现方式以及编码实践。 LRU缓存机制是一种非常...
JAVA缓存研究之剖析Jive的缓存机制JAVA缓存研究之剖析Jive的缓存机制
在高级选项中,还可以配置更多关于Java缓存的设置,比如缓存大小、更新策略等。 总的来说,理解并掌握如何管理Java Applet缓存对于开发者来说至关重要,尤其是在迭代开发和调试过程中,能够及时清除缓存以确保始终...
Hibernate缓存机制是提高应用程序性能的关键技术之一,它通过存储数据副本减少对物理数据库的访问。缓存可以分为两层:第一级缓存和第二级缓存。 **第一级缓存**是内置在Session中的,它是不可卸载的,也称为...
EhCache是一款广泛使用的Java缓存库,它提供了高度可配置的内存和磁盘存储,以及丰富的缓存策略。在MyBatis中,我们可以使用EhCache作为二级缓存的实现。要实现MyBatis与EhCache的整合,我们需要做以下几步: 1. ...
总结起来,文档深入探讨了Java中缓存技术的多个方面,包括Hibernate框架中的缓存使用、不同缓存策略的实现、本地缓存与分布式缓存的区别和配置、以及Java缓存技术在企业应用中的实际应用。这些知识对于Java开发者来...
实现分页缓存的关键在于设计一个高效且可扩展的缓存机制。Java中常用的缓存库有Ehcache、Guava Cache以及Spring Data Redis等。这里我们以Ehcache为例,讨论如何构建一个简单的分页缓存系统。 1. **Ehcache配置**:...
在Spring Boot应用中,自定义注解来实现缓存机制是一种常见的优化手段,尤其是在处理大量重复数据查询时,可以显著提升应用性能。本教程将详细解释如何利用Spring Boot结合Redis来实现这一功能。 首先,我们需要...
在这个“Java缓存技术的使用实例”中,我们将深入探讨Java缓存的实现、工作原理以及如何部署和运行示例代码。 首先,让我们理解什么是缓存。缓存是一种存储机制,用于临时存储常用或最近使用的数据,以便快速访问。...
6. **缓存失效通知**:当缓存中的数据被更新或删除时,SimpleCache 可能提供回调机制,以便应用程序能够及时做出反应。 7. **缓存预加载**:在应用启动时,SimpleCache 可以预先加载一部分关键数据,以提升应用的...
ListView是Android平台上常见的一种用于展示大量数据的控件,它通过高效的缓存机制来提高滚动时的性能,避免频繁地创建和销毁视图。在深入理解ListView缓存机制之前,我们先来了解一下ListView的基本工作原理。 ...
缓存机制在IT行业中,尤其是Web开发领域,扮演着至关重要的角色。它通过存储经常访问的数据,减少了对服务器资源的依赖,从而提升了系统的响应速度和用户体验。本项目“缓存机制demo”着重展示了如何实现ASP.NET平台...
通过本文的介绍,我们了解了Java Web应用中实现缓存的多种策略,包括服务器端缓存、分布式缓存、浏览器缓存以及多级缓存的实现。通过合理配置和使用缓存,可以显著提升Java Web应用的性能和用户体验。在实际开发中,...
这种缓存机制减少了重复的JVM查找,从而降低了运行时的开销。 缓存思路通常有以下几种实现方式: 1. **静态内部类**:创建一个静态内部类,在类加载时初始化,存储反射对象。由于静态内部类只会在类加载时初始化一...
### Jive缓存机制的实现 #### 一、引言 Jive作为一款经典的开源论坛系统,凭借其灵活的设计架构和强大的功能,在Java开发者社区中享有极高的声誉。本文将重点探讨Jive缓存机制的设计与实现,尤其关注其如何通过...
Spring 缓存机制是Spring框架中的一个重要特性,它允许开发者在应用程序中轻松地实现缓存功能,从而提高性能,减少数据库的访问压力。在“spring缓存机制-自定义缓存(五, 六)”中,我们将深入探讨如何扩展Spring的...