`

Java中缓存机制

    博客分类:
  • java
阅读更多
  缓存在很多地方我们都能看见,从数据库,hibernate(数据访问层),web前端都存在缓存问题.其中利弊我就不争论了,只是在上次的面试中,遇到一个实例.在一个项目中会存在大量的查询操作,有什么办法能更好的解决.我想缓存机制或许可以运用到.
  下面大概写一下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 中常用缓存Cache机制的实现

    在 Java 中,缓存机制的实现可以通过各种方式,例如使用 HashMap、TreeMap、LinkedHashMap 等数据结构来存储缓存对象。下面是一个简单的缓存管理器的实现: CacheManager 类的实现: CacheManager 类是一个简单...

    java 缓存机制

    Java 缓存机制是提高...综上所述,Java缓存机制涉及到声明式缓存的使用、缓存抽象的理解以及Web开发中的会话管理、Cookie和SSO实现。在实际应用中,还需要考虑SEO策略,合理利用各种技术来提升用户体验和系统的性能。

    Java 日志缓存机制的实现

    本文介绍了 Java 日志机制,并通过扩展日志功能,实现日志缓存。同时,可以动态控制日志信息打印到日志文件的级别,从而提高了日志的灵活性,给产品质量带来更大的帮助。文章主要围绕 MemoryHandler 类和 logging....

    Java实现LRU缓存机制:深入解析与高效编码实践

    在Java中实现LRU缓存机制,不仅可以帮助我们更好地理解和应用数据结构,还能在实际开发中提高程序的性能。本文将详细介绍如何在Java中实现LRU缓存机制,包括其原理、实现方式以及编码实践。 LRU缓存机制是一种非常...

    JAVA缓存研究之剖析Jive的缓存机制

    JAVA缓存研究之剖析Jive的缓存机制JAVA缓存研究之剖析Jive的缓存机制

    清楚Java Applet缓存

    在高级选项中,还可以配置更多关于Java缓存的设置,比如缓存大小、更新策略等。 总的来说,理解并掌握如何管理Java Applet缓存对于开发者来说至关重要,尤其是在迭代开发和调试过程中,能够及时清除缓存以确保始终...

    hibernate缓存机制

    Hibernate缓存机制是提高应用程序性能的关键技术之一,它通过存储数据副本减少对物理数据库的访问。缓存可以分为两层:第一级缓存和第二级缓存。 **第一级缓存**是内置在Session中的,它是不可卸载的,也称为...

    MyBatis-05 缓存机制

    EhCache是一款广泛使用的Java缓存库,它提供了高度可配置的内存和磁盘存储,以及丰富的缓存策略。在MyBatis中,我们可以使用EhCache作为二级缓存的实现。要实现MyBatis与EhCache的整合,我们需要做以下几步: 1. ...

    java中的缓存.pdf

    总结起来,文档深入探讨了Java中缓存技术的多个方面,包括Hibernate框架中的缓存使用、不同缓存策略的实现、本地缓存与分布式缓存的区别和配置、以及Java缓存技术在企业应用中的实际应用。这些知识对于Java开发者来...

    分页缓存

    实现分页缓存的关键在于设计一个高效且可扩展的缓存机制。Java中常用的缓存库有Ehcache、Guava Cache以及Spring Data Redis等。这里我们以Ehcache为例,讨论如何构建一个简单的分页缓存系统。 1. **Ehcache配置**:...

    自定义注解实现缓存机制

    在Spring Boot应用中,自定义注解来实现缓存机制是一种常见的优化手段,尤其是在处理大量重复数据查询时,可以显著提升应用性能。本教程将详细解释如何利用Spring Boot结合Redis来实现这一功能。 首先,我们需要...

    Java缓存技术的使用实例

    在这个“Java缓存技术的使用实例”中,我们将深入探讨Java缓存的实现、工作原理以及如何部署和运行示例代码。 首先,让我们理解什么是缓存。缓存是一种存储机制,用于临时存储常用或最近使用的数据,以便快速访问。...

    java缓存工具 SimpleCache_java_缓存_

    6. **缓存失效通知**:当缓存中的数据被更新或删除时,SimpleCache 可能提供回调机制,以便应用程序能够及时做出反应。 7. **缓存预加载**:在应用启动时,SimpleCache 可以预先加载一部分关键数据,以提升应用的...

    ListView缓存机制

    ListView是Android平台上常见的一种用于展示大量数据的控件,它通过高效的缓存机制来提高滚动时的性能,避免频繁地创建和销毁视图。在深入理解ListView缓存机制之前,我们先来了解一下ListView的基本工作原理。 ...

    缓存机制demo

    缓存机制在IT行业中,尤其是Web开发领域,扮演着至关重要的角色。它通过存储经常访问的数据,减少了对服务器资源的依赖,从而提升了系统的响应速度和用户体验。本项目“缓存机制demo”着重展示了如何实现ASP.NET平台...

    Java Web应用中的缓存机制实现策略与代码示例

    通过本文的介绍,我们了解了Java Web应用中实现缓存的多种策略,包括服务器端缓存、分布式缓存、浏览器缓存以及多级缓存的实现。通过合理配置和使用缓存,可以显著提升Java Web应用的性能和用户体验。在实际开发中,...

    java之反射优化(缓存思路)源码

    这种缓存机制减少了重复的JVM查找,从而降低了运行时的开销。 缓存思路通常有以下几种实现方式: 1. **静态内部类**:创建一个静态内部类,在类加载时初始化,存储反射对象。由于静态内部类只会在类加载时初始化一...

    缓存机制(Jive缓存机制的实现)

    ### Jive缓存机制的实现 #### 一、引言 Jive作为一款经典的开源论坛系统,凭借其灵活的设计架构和强大的功能,在Java开发者社区中享有极高的声誉。本文将重点探讨Jive缓存机制的设计与实现,尤其关注其如何通过...

    spring缓存机制-自定义缓存(五, 六)

    Spring 缓存机制是Spring框架中的一个重要特性,它允许开发者在应用程序中轻松地实现缓存功能,从而提高性能,减少数据库的访问压力。在“spring缓存机制-自定义缓存(五, 六)”中,我们将深入探讨如何扩展Spring的...

Global site tag (gtag.js) - Google Analytics