`
zhangwei_david
  • 浏览: 475945 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

iBatis缓存实现源码分析-FIFO,LUR实现方法

 
阅读更多

  iBatis的二级缓存支持FIFO,LRU,MEMORY,OSCACHE; 从源码去分析这些缓存是如何实现的

 

  • FIFO
/**
 *先进先出缓存控制器
 * FIFO (first in, first out) cache controller implementation
 */
public class FifoCacheController implements CacheController {
  //缓存大小
  private int cacheSize;
  //缓存
  private Map cache;
  //缓存中key的列表
  private List keyList;

  /**
   * 默认构造器
   */
  public FifoCacheController() {
    // 默认缓存大小为100
    this.cacheSize = 100;
	//初始化一个线程安全的缓存
    this.cache = Collections.synchronizedMap(new HashMap());
	//初始化一个线程安全的key列表
    this.keyList = Collections.synchronizedList(new LinkedList());
  }

  public int getCacheSize() {
    return cacheSize;
  }

  public void setCacheSize(int cacheSize) {
    this.cacheSize = cacheSize;
  }

  /**
   * Configures the cache
   *
   * @param props Optionally can contain properties [reference-type=WEAK|SOFT|STRONG]
   */
  public void setProperties(Properties props) {
    String size = props.getProperty("cache-size");
    if (size == null) {
      size = props.getProperty("size");
    }
    if (size != null) {
      cacheSize = Integer.parseInt(size);
    }
  }

  /**
   * 添加一个对象到缓存中
   *
   * @param cacheModel The cacheModel
   * @param key        The key of the object to be cached
   * @param value      The object to be cached
   */
  public void putObject(CacheModel cacheModel, Object key, Object value) {
	//添加对象到缓存
    cache.put(key, value);
	//将key添加到列表中
    keyList.add(key);
	// 如果key列表的长度大于缓存长度
    if (keyList.size() > cacheSize) {
      try {
		//删除表头
        Object oldestKey = keyList.remove(0);
		//同时清除该缓存数据
        cache.remove(oldestKey);
      } catch (IndexOutOfBoundsException e) {
        //ignore
      }
    }
  }

  /**
   * 从缓存中获取对象
   *
   * @param cacheModel The cache model
   * @param key        The key of the object to be returned
   * @return The cached object (or null)
   */
  public Object getObject(CacheModel cacheModel, Object key) {
    return cache.get(key);
  }

  /**
   * 删除缓存对象
   **/
  public Object removeObject(CacheModel cacheModel, Object key) {
    keyList.remove(key);
    return cache.remove(key);
  }

  /**
   * 刷新缓存清除所有数据
   *
   * @param cacheModel The cache model
   */
  public void flush(CacheModel cacheModel) {
    cache.clear();
    keyList.clear();
  }

}
  •  LRU
/**
 *最少使用缓存控制器
 * LRU (least recently used) cache controller implementation
 */
public class LruCacheController implements CacheController {
  //缓存大小
  private int cacheSize;
  //缓存
  private Map cache;
  //缓存 key的列表
  private List keyList;

  /**
   * 默认构造器
   */
  public LruCacheController() {
   // 初始化
    this.cacheSize = 100;
    this.cache = Collections.synchronizedMap(new HashMap());
    this.keyList = Collections.synchronizedList(new LinkedList());
  }
// 获取缓存大小
  public int getCacheSize() {
    return cacheSize;
  }
// 设置缓存的大小
  public void setCacheSize(int cacheSize) {
    this.cacheSize = cacheSize;
  }

  /**
   * 配置缓存
   *
   * @param props Optionally can contain properties [reference-type=WEAK|SOFT|STRONG]
   */
  public void setProperties(Properties props) {
    String size = props.getProperty("cache-size");
    if (size == null) {
      size = props.getProperty("size");
    }
    if (size != null) {
      cacheSize = Integer.parseInt(size);
    }
  }

  /**
   * 将一个对象添加到缓存中
   *
   * @param cacheModel The cacheModel
   * @param key        The key of the object to be cached
   * @param value      The object to be cached
   */
  public void putObject(CacheModel cacheModel, Object key, Object value) {
    cache.put(key, value);
	//将key添加到队列的尾部
    keyList.add(key);
	// 如果缓存大小查过限制则删除表头的key,以及清空该缓存值
    if (keyList.size() > cacheSize) {
      try {
        Object oldestKey = keyList.remove(0);
        cache.remove(oldestKey);
      } catch (IndexOutOfBoundsException e) {
        //ignore
      }
    }
  }

  /**
   * 从缓存中获取一个对象
   *
   * @param cacheModel The cache model
   * @param key        The key of the object to be returned
   * @return The cached object (or null)
   */
  public Object getObject(CacheModel cacheModel, Object key) {
   //获取缓存数据
    Object result = cache.get(key);
	//将该key从对列中删除后再追加到尾部
    keyList.remove(key);
    if (result != null) {
      keyList.add(key);
    }
    return result;
  }
  // 删除缓存
  public Object removeObject(CacheModel cacheModel, Object key) {
    keyList.remove(key);
    return cache.remove(key);
  }

  /**
   * 清空缓存
   *
   * @param cacheModel The cache model
   */
  public void flush(CacheModel cacheModel) {
    cache.clear();
    keyList.clear();
  }

}

 

1
0
分享到:
评论

相关推荐

    apache开源项目源码ibatis-3-core-src-3.0.0.227(ibatis框架java源程序)

    apache开源项目源码ibatis-3-core-src-3.0.0.227 ibatis框架java源程序 spring,struts,hibernate,ibatis,框架源码 各种ibatis框架应用源码,你会从中得到意想不到的效果! apache开源组织开发的开源项目源码,其...

    ibatis缓存介绍 - 勇泽 - 博客园.mht

    ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园

    ibatis-3-core-3.0.0.242.jar.zip

    ibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zip

    ibatis-3-core-3.0.0.242.zip

    ibatis-3-core-3.0.0.242.zip ibatis-3-core-3.0.0.242.zip ibatis-3-core-3.0.0.242.zip ibatis-3-core-3.0.0.242.zip

    ibatis-3-core-3.0.0.200

    ibatis-3-core-3.0.0.200

    iBATIS-SqlMaps-2-Tutorial_cn.pdf

    iBATIS-SqlMaps-2-Tutorial_cniBATIS-SqlMaps-2-Tutorial_cn.pdf.pdfiBATIS-SqlMaps-2-Tutorial_cn.pdfiBATIS-SqlMaps-2-Tutorial_cn.pdf

    Ibatis基本配置---[环境搭建

    Ibatis基本配置---[环境搭建

    ibatis-3-core-3.0.0.227.z

    总结起来,"ibatis-3-core-3.0.0.227.z"压缩包提供的内容涵盖了iBatis的核心库、源码、授权信息和元数据,是学习和使用iBatis不可或缺的资源。通过对这些内容的深入理解和实践,开发者可以更好地掌握数据库操作的...

    ibatis-3-core-3.0.0.204

    ibatis-3-core-3.0.0.204 最新官方下载版

    Ibatis源代码(ibatis-src.zip)

    在"Ibatis源代码(ibatis-src.zip)"中,我们可以深入理解其内部机制和设计思想。 首先,`release.txt`通常包含项目发布的信息,如版本号、发布日期以及可能的更新日志。这为我们提供了Ibatis当前版本的详细背景信息...

    iBATIS缓存介绍

    ### iBATIS缓存介绍 #### 一、缓存介绍 **1.1 缓存对象** 理论上,Web分层设计的各个层都可以有缓存,Web中的任何对象都可以成为缓存的对象。例如: - **HTTP请求结果的缓存**:如页面数据或API响应。 - **...

    iBATIS缓存的使用方法

    ### iBATIS缓存的使用方法 在数据库访问框架iBATIS中,缓存机制是一项重要的功能,它能够显著提高应用程序的性能。本文将详细介绍iBATIS中的缓存使用方法,包括缓存模型的配置、不同类型的缓存控制器以及如何在SQL...

    ibatis-sqlmap-2.3.4.741-sources.zip_4 3 2 1_ibatis-sqlm_ibatis-s

    标题 "ibatis-sqlmap-2.3.4.741-sources.zip_4 3 2 1_ibatis-sqlm_ibatis-s" 暗示了这是一个关于iBATIS SQLMap的源码包,版本号为2.3.4.741,可能是一个增强或修改后的版本,具有特定的优化和改进。描述中提到了针对...

    iBatis-设置缓存模式-Java源码(下载)

    PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> <sqlMap namespace="Account"> <typeAlias alias="Account" type="Account"/> ...

    ibatis-2-mybatis-2.3.5.zip

    3. 缓存机制:iBatis内置了本地缓存和二级缓存,有助于减少对数据库的访问频率,提升系统性能。 总结,iBatis 2.3.5以其简洁的设计和强大的功能,在Java世界中占据了一席之地。通过深入学习其源码,不仅可以提升对...

    ibatis 开发指南 和 iBATIS-SqlMaps两本图书

    《iBATIS-SqlMaps》则可能更侧重于实战和案例分析,通过具体的项目场景来展示如何设计和实施iBATIS解决方案,以及如何利用iBATIS实现更高效的数据操作。 两本书结合阅读,开发者可以从理论到实践全面掌握iBATIS框架...

    iBATIS缓存介绍[借鉴].pdf

    本文将详细介绍iBATIS缓存的概念、类型以及配置方法。 一.缓存介绍 缓存,简单来说,是为了减少对数据库的频繁访问,将常用数据存储在快速访问的介质中。这有助于降低延迟,提高应用的响应速度。 1.1 缓存对象:...

    iBATIS缓存

    对于源码爱好者来说,研究iBATIS的缓存实现可以深入理解其内部的工作原理。iBATIS的缓存实现主要依赖于Java的Map接口,通过自定义的缓存实现类(如DefaultCache)进行管理。在处理并发访问时,iBATIS可能会使用到...

    ibatis 缓存 - 24小时学习网.mht

    ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网ibatis 缓存 - 24小时学习网

Global site tag (gtag.js) - Google Analytics