`
iluoxuan
  • 浏览: 571214 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

缓存的实现--原理

    博客分类:
  • java
 
阅读更多

转载:http://www.iteye.com/topic/544021

1:缓存的原理:

 

 

package cache;

/**
* <p>
* Description: 缓存
* </p>
*/
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;
}
}
 

2:

 

 

package cache; 

import java.util.*; 

/** 
* <p>Description: 管理缓存</p> 
* 可扩展的功能:当chche到内存溢出时必须清除掉最早期的一些缓存对象,这就要求对每个缓存对象保存创建时间
* 
* @version 1.0
*/
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<String> arr = new ArrayList<String>();
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<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;
}
}

}

 3:

 

 

package cache;
/**
* 测试类
* @author Song Shi Chao
*
*/
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);
}
System.out.println(CacheManager.getCacheSize());

// 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();


}
}
分享到:
评论

相关推荐

    分布式缓存 原理 架构及Go语言实现-高清-完整目录

    分布式缓存 原理 架构及Go语言实现-高清-完整目录,分享给所有需要的人!

    初探浏览器缓存实现原理-提高性能

    因此我们有必要了解它的实现原理,用来提高网站的性能。 当一个客户端请求web服务器, 请求的内容可以从以下几个地方获取:服务器、浏览器缓存中或缓存服务器中。这取决于服务器端输出的页面信息。页面文件有三种缓存...

    php缓存实现原理

    php缓存实现原理,静态模版技术,关于ob系列函数,

    web服务器缓存实现原理,通过chrome f12观察web服务器缓存

    web服务器缓存实现原理,通过chrome f12观察web服务器缓存 后台action命中缓存hit Via X-cache X-Cache-Lookup

    java简单的缓存池实现

    java缓存原理,简单的缓存池实现,java缓存原理,简单的缓存池实现,java缓存原理,简单的缓存池实现,java缓存原理,简单的缓存池实现。

    Asp.net里的缓存原理

    Asp.net的缓存技术用于对网页里的经常被人访问的内容进行缓存,这样当用户第二次访问时就会速度的访问到您的页面

    Memcached 分布式缓存实现原理简介

    本文主要介绍分布式缓存服务mencached的分布式实现原理。 缓存本质 计算机体系缓存 什么是缓存,我们先看看计算机体系结构中的存储体系,根据冯·诺依曼计算机体系结构模型,计算机分为五大部分:运算器、控制器、...

    ASP.NET缓存的实现

    应用程序缓存其实现原理说来平淡无奇,仅仅是通过ASP.NET管理内存中的缓存空间。放入缓存中的应用程序数据对象,以键/值对的方式存储,这便于用户在访问缓存中的数据项时,可以根据key值判断该项是否存在缓存中。 放...

    计算机组成原理实验报告-Cache模拟器的实现.doc

    计算机组成原理实验报告-Cache模拟器的实现

    C++数据结构与算法之双缓存队列实现方法详解

    主要介绍了C++数据结构与算法之双缓存队列实现方法,结合实例形式分析了双缓存队列的原理、实现方法与相关注意事项,需要的朋友可以参考下

    浅谈Vue页面级缓存解决方案feb-alive (下)

    keep-alive实现原理 history api vue渲染原理 vue虚拟dom原理 feb-alive与keep-alive差异性 1. 针对activated钩子差异性 keep-alive配合vue-router在动态路由切换的情况下不会触发activated钩子,因为切换的...

    Memcached 分布式缓存实现原理 – 码农网1

    摘要在高并发环境下,大量的读、写请求涌向数据库,此时磁盘IO将成为瓶颈,从而导致过高的响应延迟,因此缓存应运而生。无论是单机缓存还是分布式缓存都有其适应场景和优

    让html页面不缓存js的实现方法

    先让大家了解下不缓存的一个简单的原理: 当浏览不同Url时,浏览器会自动将当前访问的地址进行一次缓存;而第二次访问时着调用缓存下来的页面,从而达到页面快速加载(页面加载优化)的目的; 因此,我们可以给页面...

    php实现网页缓存的工具类.zip

    php实现网页缓存的工具类的代码及使用方法,非常的实用。 ... php程序在抵抗大流量访问的时候动态网站... 主要原理使用缓存函数来存储网页显示结果,如果在规定时间里再次调用则可以加载缓存文件。

    spring AOP实现查询缓存

    本代码通过使用spring aop+ehcache的技术,实现了方法级别的查询缓存,主要原理是 方法的完整路径+方法参数值,作为key,放入cache中,下次访问时先判断cache中是否有该key.

    环形缓冲区实现原理

    在通信程序中,经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。

    MFC双缓存技术实现源码

    MFC双缓存技术实现源码,实现细节及原理

    MyBatis缓存实现原理及代码实例解析

    主要介绍了MyBatis缓存实现原理及代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    《分布式对象存储——原理 架构及Go语言实现 》_胡世杰.zip

    分布式对象存储——原理 架构及Go语言实现, 没有密码版本。请下载支持。谢谢

    基于DDR3 SDRAM的大容量异步FIFO缓存系统的设计与实现

    7系列FPGA的片上FIFO,软件通过研究DDR3的基本工作原理编写用户接口模块,同时结合片上FIFO的控制模块完成异步FIFO缓存系统的设计,通过改变异步FIFO的读写时钟就可以实现数据的跨时钟域传输。该设计通过...

Global site tag (gtag.js) - Google Analytics