Java中常用缓存Cache机制的实现

缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。

缓存主要可分为二大类:

一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式;

二、内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查.

import java.util.*; 

 //Description: 管理缓存 

 //可扩展的功能:当chche到内存溢出时必须清除掉最早期的一些缓存对象,这就要求对每个缓存对象保存创建时间 

public class CacheManager {
 private static HashMap cacheMap = new HashMap(); 

 //单实例构造方法
 private CacheManager() {
  super();
 }
 //获取布尔值的缓存
 public static boolean getSimpleFlag(String key){
  try{
   return (Boolean) cacheMap.get(key);
  }catch(NullPointerException e){
   return false;
  }
 }
 public static long getServerStartdt(String key){
  try {
   return (Long)cacheMap.get(key);
  } catch (Exception ex) {
   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 i = cacheMap.entrySet().iterator();
  String key;
  ArrayList arr = new ArrayList();
  try {
   while (i.hasNext()) {
    java.util.Map.Entry entry = (java.util.Map.Entry) i.next();
    key = (String) 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 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 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;
  }
 } 

} 

package lhm.hcy.guge.frameset.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 long getTimeOut() {
    return timeOut;
  } 

  public Object getValue() {
    return value;
  } 

  public void setKey(String string) {
    key = string;
  } 

  public void setTimeOut(long l) {
    timeOut = l;
  } 

  public void setValue(Object object) {
    value = object;
  } 

  public boolean isExpired() {
    return expired;
  } 

  public void setExpired(boolean b) {
    expired = b;
  }
} 

//测试类,
class Test {
 public static void main(String[] args) {
  System.out.println(CacheManager.getSimpleFlag("alksd"));
//  CacheManager.putCache("abc", new Cache());
//  CacheManager.putCache("def", new Cache());
//  CacheManager.putCache("ccc", new Cache());
//  CacheManager.clearOnly("");
//  Cache c = new Cache();
//  for (int i = 0; i < 10; i++) {
//   CacheManager.putCache("" + i, c);
//  }
//  CacheManager.putCache("aaaaaaaa", c);
//  CacheManager.putCache("abchcy;alskd", c);
//  CacheManager.putCache("cccccccc", c);
//  CacheManager.putCache("abcoqiwhcy", c);
//  System.out.println("删除前的大小:"+CacheManager.getCacheSize());
//  CacheManager.getCacheAllkey();
//  CacheManager.clearAll("aaaa");
//  System.out.println("删除后的大小:"+CacheManager.getCacheSize());
//  CacheManager.getCacheAllkey(); 

 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 实例讲解分布式缓存软件Memcached的Java客户端使用

    Memcached介绍 下面就来介绍一下Memcached. 1.什么是Memcached Memcached是一个开源的高性能,分布式的内存对象缓存系统,通过键值队的形式来对数据进行存取,Memcached是简单而强大,它的简单设计促进快速部署,易于开发,解决了大数据缓存面临的许多问题. 官方网址是:http://memcached.org/,目前已经有很多知名的互联网应用使用到了Memcached,比如Wikipedia.Flickr.Youtube.Wordpress等等. 2.下载Win

  • JavaWeb开发之Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架

    简单介绍一下,本框架的基本功能点: Spring:整个框架的主体部分,这个自不用说. SpringMVC:MVC部分我还是比较喜欢Spring的. MyBatis:选型的时候选择这个ORM主要也是考虑其灵活性的问题,毕竟我也不知道,今后会遇到怎样的需求,用Hibernate一来是不太会用,二来,我还是比较喜欢直接写SQL来的简单一点. SpringSecurity:这个主要是安全框架,负责用户登录验证及整站权限分配的相关事项(权限分配真的很有用,这个我就不多说了). EhCache:一个非常流行

  • java web项目里ehcache.xml介绍

    复制代码 代码如下: <?xml version="1.0" encoding="UTF-8"?><ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false"    monitoring=&qu

  • 基于Java实现缓存Cache的深入分析

    原理是使用LinkedHashMap来实现,当缓存超过大小时,将会删除最老的一个元组.实现代码如下所示 复制代码 代码如下: import java.util.LinkedHashMap;import java.util.Map;public class LRUCache { public static class CachedData {  private Object data = null;  private long time = 0;  private boolean refreshi

  • Java Cache详解及简单实现

     Java Cache详解及简单实现 概要: 最近在做spring的项目,想做一个缓存,访问数据库,定期来做数据更新 要实现两个功能 可以通过http请求来立刻刷新缓存 缓存可以通过自己配置的时间间隔来定期刷新 通过Controller来做 因为需要通过http来刷新缓存,所以第一个想法就是把缓存做成一个Controller Controller的实现 Controller最大的优势,就是可以通过Spring的配置,注入很多依赖,比如对Service的依赖,对数据库的依赖等. 大量的访问数据库跟

  • Java中tomcat memecached session 共享同步问题的解决办法

    事件缘由:一个主项目"图说美物",另外一个子功能是品牌商的入驻功能,是跟主项目分开的项目,为了共享登录的用户信息,而实现session共享,俩个tomcat,一个tomcat6,一个tomcat7 web项目windows系统下实现session的共享 第一个步: 在俩个tomcat的context.xml这个文件中配置如下代码: <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManage

  • java使用Memcached简单教程

    Memcached作为一个高并发内存Cached系统被很多大公司使用,最近也一直在用Memcached做项目也积累了一些相关经验. InstallMemcached的安装很简单,在Ubuntu下面一行命令搞定. 复制代码 代码如下: sudo apt-get install memcached Start实际使用的时候,memcached需要调整内存大小和端口号等命令,则启动的使用时用以下的Command就行. 复制代码 代码如下: usr/local/bin/memcached -p 1121

  • java实现清理DNS Cache的方法

    本文实例讲述了java实现清理DNS Cache的方法.分享给大家供大家参考.具体分析如下: 一.测试环境 OS:Windows7 x64 JDK:1.6.0_45 二.本人找到四种方式清理jvm的DNS缓存,大家可以根据自己的情况选用. 1. 在首次调用InetAddress.getByName()前,设置java.security.Security.setProperty("networkaddress.cache.ttl", "0"); 2. 修改jre/li

  • Java资源缓存 之 LruCache

    例如对 网络加载图片进行缓存 : // 得到 应用程序 被分配的最大的内存 int maxMemory=(int) Runtime.getRuntime().maxMemory(); // 取处内存的 1/5 用来当 缓存 大小 int cachSize=maxMemory/5; // 实例化 LruCache lruCache=new lruCache<String, Bitmap>(cachSize){ //内部方法sizeOf设置每一张图片的缓存大小 protected int size

  • Java中常用缓存Cache机制的实现

    缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例.这样做可以减少系统开销,提高系统效率. 缓存主要可分为二大类: 一.通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式: 二.内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查. import java.util.*; //Description: 管理缓存 //可扩展的功能:当chche到内存溢出时必须清除掉最早

  • java中Hibernate缓存形式总结

    对于数据的访问来说,肯定是在有缓存的情况下运行快一些.对于Hibernate这种与数据库结合紧密的框架来说,在调用数据的时候肯定会有缓存的出现,其中有三种缓存的形式存在:一级缓存.二级缓存和查询缓存.下面我们就Hibernate中这三种缓存的类型分别带来介绍. 1.一级缓存 hibernate的一级缓存是session级别的,所以如果session关闭后,缓存就没了,此时就会再次发sql去查数据库. /** * 此时会发出一条sql,将所有学生全部查询出来,并放到session的一级缓存当中 *

  • Java实现常用缓存淘汰算法:FIFO、LRU、LFU

    目录 缓存淘汰算法 FIFO LRU LFU 总结 缓存淘汰算法 在高并发.高性能的质量要求不断提高时,我们首先会想到的就是利用缓存予以应对. 第一次请求时把计算好的结果存放在缓存中,下次遇到同样的请求时,把之前保存在缓存中的数据直接拿来使用. 但是,缓存的空间一般都是有限,不可能把所有的结果全部保存下来.那么,当缓存空间全部被占满再有新的数据需要被保存,就要决定删除原来的哪些数据.如何做这样决定需要使用缓存淘汰算法. 常用的缓存淘汰算法有:FIFO.LRU.LFU,下面我们就逐一介绍一下. F

  • 详解java中动态代理实现机制

    代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. JAVA各种动态代理实现的比较 接口 interface AddInterface{ int add(int a, int b); } interface SubInterfa

  • JAVA中常用的设计模式:单例模式,工厂模式,观察者模式

    1.单例模式 每个类只能创建一个实例对象 Java Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection). 好处: 第一.控制资源的使用,通过线程同步来控制资源的并发访问: 第二.控制实例产生的数量,达到节约资源的目的. 第三.作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程

  • Java中常用修饰符的使用方法汇总

    修饰符汇总: 一:public protected default private 修饰类,修饰方法,修饰属性,修饰代码块. 类: 顶级类只能用public 修饰,顶级类不能使用private 和protected 修饰. 外部类可以被public修饰或者默认不写,不能用private和protected. 内部类可为静态,可用protected和private修饰. 方法: 通常方法可以被四个访问修饰符修饰,构造方法也可以被四个访问修饰符修饰. 抽象类中的抽象方法不能被private修饰,可以

  • java中常用工具类之字符串操作类和MD5加密解密类

    java中常用的工具类之String和MD5加密解密类 我们java程序员在开发项目的是常常会用到一些工具类.今天我分享一下我的两个工具类,大家可以在项目中使用. 一.String工具类 package com.itjh.javaUtil; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import

  • 浅谈Java中常用数据结构的实现类 Collection和Map

    线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类. Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap Collection接口 Collection是最基本的集合接口,一个C

  • 基于java中stack与heap的区别,java中的垃圾回收机制的相关介绍

    #. 在java中有两类内存.分别称为stack(堆栈)和heap(堆). stack是程序内存空间,因此所有的基本类型和对象的引用是存在stack中. heap是java虚拟机储存对象的,它是一个巨大的内存,当你创造一个对象,java虚拟机把对象放入heap中,把创造的对象的地址放入stack中. 因此,基本类型.对象的引用储存在stack中:对象储存在heap中. #. java中的垃圾回收机制 当你new一个新的对象,java分配必需的内存.当你用完一个对象时,java的垃圾回收器为你把内

  • Java中常用的类型转换(推荐)

    1.将字符串转换成整数(String--->int) 方法一: (1) int i = Integer.parseInt(String s); 其中(1)其实就是我们经常用到的将s转换为10进制得数,其实默认是调用了 int i =Integer.parseInt("123",10); (2) i = Integer.parseInt(String s,int radix); radix的范围是在2~36之间,超出范围会抛异常.其中s的长度也不能超出7,否则也会抛异常. 方法二:

随机推荐