`
iluoxuan
  • 浏览: 583741 次
  • 性别: 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语言实现是一门深奥的技术领域,需要开发者具备扎实的网络编程、并发控制以及性能优化的知识。

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

    本文将深入探讨浏览器缓存的实现原理。 首先,浏览器缓存的获取路径包括服务器、本地缓存以及缓存服务器。当用户发起一个HTTP请求时,浏览器会根据服务器返回的HTTP响应头信息来决定是从哪个来源获取内容。页面文件...

    安卓图片加载缓存相关-Android实现-圆形加载控件CircleProgress.rar

    对于图片加载缓存,理解其工作原理并合理运用图片加载库能有效优化性能;而对于CircleProgress,掌握自定义视图的绘制和动画机制是提升应用用户体验的重要手段。如果你在运行示例代码时遇到问题,可能需要自行调试和...

    spring缓存机制-入门实例

    这种抽象允许开发者在不依赖特定缓存实现的情况下,轻松地在应用中添加缓存功能。 1. **Spring缓存注解**: - `@Cacheable`:标记在方法上,表示该方法的返回结果应被缓存。每次调用时,Spring会检查缓存中是否有...

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

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

    缓存 ehcache-1.3.0.rar

    1. **缓存原理** - 缓存是一种存储技术,用于暂时存储经常访问的数据,减少对主存储器或数据库的访问,以提高数据处理速度。Ehcache 使用内存和磁盘混合存储,兼顾速度与容量。 2. **Ehcache 结构** - Ehcache ...

    安卓图片加载缓存相关-Android图片二级缓存.zip

    这个压缩包中的"Cache"文件夹可能包含了一些自定义的缓存实现,你可以通过阅读源码了解其具体实现细节,学习如何构建自己的图片加载和缓存系统。"JavaApk源码说明.txt"可能提供了对源码的简要说明,而"下载更多打包...

    缓存框架-Ehcache学习笔记

    - **Cache**: 实现缓存逻辑的核心类,包含缓存的添加、获取和删除操作。 - **DefaultCache**: Ehcache 的默认实现,包含了缓存的内存和磁盘存储管理。 - **MemoryStore**: 负责在 JVM 内存中存储元素的类。 - **...

    缓存memcached-1.2.1

    **缓存Memcached-1.2.1:深入理解与应用** Memcached是一款高效、轻量级的分布式内存对象缓存系统,广泛应用于Web应用程序中,以减轻数据库负载,提高数据访问速度。在这个版本1.2.1中,我们探讨其核心特性、工作...

    安卓图片加载缓存相关-afinal框架实现图片的简单异步缓存加载.rar

    首先,我们来理解一下图片加载缓存的基本原理。图片加载缓存通常包括内存缓存和磁盘缓存两部分。当用户请求图片时,系统首先会在内存缓存中查找,如果找到则直接返回,如果未找到,则会尝试从磁盘缓存中读取。若磁盘...

    mybatis二级缓存扩展-与redis集成

    二级缓存的工作原理是:当某次查询的结果被缓存后,后续相同查询可以直接从缓存中获取,无需再次执行SQL,从而提高了性能。 集成Redis作为二级缓存的优势在于,Redis是一款高效的内存数据结构存储系统,支持多种...

    安卓图片加载缓存相关-演化理解Android异步加载图片.rar

    "点这里查看更多优质源码~.url"可能是指向其他开源项目或资源的链接,这些项目可能提供了更多的图片加载和缓存实现,可以作为学习和借鉴的资料。 "JavaApk源码说明.txt"可能是对源码的简要说明,包括如何运行项目、...

    缓存、缓存算法和缓存框架简介 - 文章 - 伯乐在线.pdf

    文章中提及的面试者programmerone对缓存的理解非常浅显,仅限于知道使用hashtable实现简单的缓存机制,而没有深入了解缓存的工作原理、缓存算法的选择标准和缓存框架的使用。面试官提出的问题主要集中在缓存的基本...

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

    分布式缓存是现代高并发应用中缓解数据库压力的关键技术,Memcached作为一款广泛使用的分布式内存缓存系统,其设计和实现原理对于理解分布式系统至关重要。本文主要探讨了Memcached的分布式实现,以及它如何通过简单...

    Android应用源码之afinal框架实现图片的简单异步缓存加载-IT计算机-毕业设计.zip

    本示例源码基于afinal框架,展示了如何实现图片的简单异步缓存加载,这对于移动开发App,尤其是那些需要大量展示图片的应用来说,是至关重要的。下面我们将详细探讨afinal框架及其在图片异步加载中的应用。 **一、...

    Hibernate4(关系映射-事务-原理-性能和二级缓存-最佳实践)

    Hibernate 4是该框架的一个版本,它涵盖了关系映射、事务处理、原理、性能优化以及二级缓存的使用与最佳实践。以下知识点详细解释了这些关键概念。 1. 关系映射:在Hibernate框架中,关系映射是指对象与数据库表...

    第六讲-缓存接入之多级缓存实现及分布式部署落地实践.pdf

    本讲的主题聚焦于缓存接入的多级缓存实现以及分布式部署的落地实践,旨在提升系统的响应速度和整体效率。 首先,我们来看项目部署的两种基本形式:单体部署和分离部署。单体部署将项目与MySQL数据库部署在同一台高...

    android的缓存-饼图

    5. **考虑使用更高效的缓存实现**:如Android的DiskLruCache和OkHttp的HttpCache,它们已经考虑了性能和资源管理。 饼图分析不仅适用于开发阶段,也适用于应用发布后的性能监控。通过收集用户反馈和持续监控,...

    SMT缓存机-SOLIDWORKS零件图-机械工程图-机械三维3D设计图

    标题中的"SMT缓存机"是指一种用于表面贴装技术(Surface Mount Technology)生产线上的设备...这个设计图对于理解SMT生产线上的缓存机工作原理、设计思路和制造流程都有很大的帮助,是机械工程和自动化技术结合的实例。

    缓存框架-Memcache的例子

    Memcache是一种广泛使用的分布式内存缓存系统,常用于减轻数据库负载,提高Web应用的性能。在本文中,我们将深入探讨Memcache的工作原理、优势以及如何在实际项目中使用它。 一、Memcache简介 Memcache是由Danga ...

Global site tag (gtag.js) - Google Analytics