LRU是Least Recently Used 近期最少使用算法,内存管理的一种页面置换算法
对于在内存中但又不用的数据块(内存块)叫做LRU,LRU算法的提出,是基于这样一个事实:在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。反过来说,已经很久没有使用的页面很可能在未来较长的一段时间内不会被用到,因此,我们只需要在每次调换时,找到最近最少使用的那个页面调出内存。这就是LRU算法的全部内容。
代码如下:
public class LruCacheController implements CacheController {
private int cacheSize;
private Map cache;
private List keyList;
/**
* Default constructor
*/
public LruCacheController() {
this.cacheSize = 100;
this.cache = Collections.synchronizedMap(new HashMap());
this.keyList = Collections.synchronizedList(new LinkedList());
}
从这个方法可以看出来,如果把缓存装满后,就会删除最老的数据,将最老的数据从
keyList,cache中删除,这样就淘汰了最老的数据,其实也就是删除最近最少使用
的数据,因为只有最老的数据才会在最后面,新的数据添加到末尾。
public void putObject(CacheModel cacheModel, Object key, Object value) {
cache.put(key, value);
keyList.add(key);
if (keyList.size() > cacheSize) {
try {
Object oldestKey = keyList.remove(0);
cache.remove(oldestKey);
} catch (IndexOutOfBoundsException e) {
//ignore
}
}
}
查询对象的时候,说明这个key被使用了,就删除以前所在的位置,然后添加到最前面,这样
就可以保证经常使用的数据永远在最前面,最老的数据就是最近最少使用的数据。
就是这么个原理,这里的实现就是利用了list的remove(0)以及list.add(key)来移动
位置,这样就保证最近最少使用的数据永远在0哪些地方,实现了RLU算法。cache中的数据
位置信息不变。
public Object getObject(CacheModel cacheModel, Object key) {
Object result = cache.get(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);
}
分享到:
相关推荐
3. **配置Ibatis**:在Ibatis的配置文件中,定义一个Memcached的Cache实现,指定缓存的ID、超时时间等参数。 4. **创建缓存插件**:编写自定义的Ibatis拦截器,拦截SQL执行,实现数据的缓存和读取。 5. **在Mapper...
为了提高查询性能,ibatis内置了多种缓存机制,包括`MEMORY`类型缓存、`LRU`(Least Recently Used)型缓存、`FIFO`(First In First Out)型缓存和`OSCache`。其中,`MEMORY`类型缓存使用弱引用(WeakReference)来...
- 这是最简单的缓存实现方式,使用引用计数来管理缓存项。当一个缓存项的引用计数为零时,该项就会被移除。 - MEMORY缓存不支持统一的失效策略,适合对内存使用没有严格限制的场景。 2. **LRU ...
Ibatis 提供了几种类型的缓存,如基于内存的缓存(MEMORY 类型,可能结合 WeakReference 使用)、LRU(Least Recently Used)缓存、FIFO(First In First Out)缓存,以及 OSCache。缓存可以帮助减少对数据库的访问...
通过对iBATIS内置别名列表的学习,我们不仅能够更好地理解iBATIS的工作原理,还能在实际项目中更加高效地使用该框架。此外,掌握这些内置别名也有助于提高配置文件的可读性和可维护性,减少因错误配置导致的问题。...
相较于其他 ORM(对象关系映射)框架如 Hibernate 和 Apache OJB 的“一站式”解决方案,iBATIS 提供了一种“半自动化”的 ORM 实现,允许开发者更加灵活地控制 SQL 语句的编写和执行。 #### 重要特点 - **“半...
缓存(Cache)功能是iBATIS提高性能的重要手段,它提供了几种类型的缓存策略,包括MEMORY类型(基于内存的缓存,可能使用WeakReference防止内存泄漏)、LRU(Least Recently Used,最近最少使用,一种淘汰算法)和...
- 目前iBatis内置了四种Cache实现,包括LRU、FIFO、Memory和OsCache,但不支持用户自定义扩展Cache。 - 用户可以指定Cache的数量。 - Cache的put和get方法内部实现了同步,但在外部没有同步,这意味着当同一参数的...
ibatis支持简单的对象关系映射,主要包括以下几种方式: - **一对一映射**:通过resultMap标签定义一个实体类和数据库表之间的映射关系,其中可以使用association标签进行一对一关联。 - **一对多映射**:同样通过...
- **缓存类型**:Ibatis支持多种缓存类型,如PERPETUAL、FIFO、LRU等。 #### 使用SQLMap API编程 - **配置SQLMap**:通过`SqlMapConfig`类进行初始化配置。 - **事务处理**:Ibatis支持自动事务管理,也可以通过...
这意味着,当面对某些特定环境,如数据安全限制、业务逻辑需在数据库层实现或系统性能极端敏感时,ibatis因其灵活的SQL定制能力和更高的设计自由度而成为更优选择。 #### ibatis基础语义 - **...
通过以上知识点的详细介绍,我们可以了解到ibatis作为一种“半自动化”的ORM实现方式,不仅提供了灵活的数据访问机制,而且通过其丰富的特性支持,能够在各种复杂的场景下提供高效的数据访问服务。
通过上述知识点的介绍,我们可以看出 iBatis 在灵活性和性能方面具有明显的优势,特别是在需要高度定制化 SQL 查询的情况下。然而,这也意味着开发者需要具备一定的 SQL 编写能力。对于那些对性能有极高要求的应用,...
- 可以在应用层或容器层实现事务控制。 - **缓存机制**: - iBatis内置了多种缓存策略: - `MEMORY`: 简单的内存缓存。 - `WEAK_REFERENCE`: 基于弱引用的缓存,适用于长时间运行的应用。 - `LRU`: 最近最少使用...
书中既详实地介绍了iBATIS的设计理念和基础知识,也讨论了动态SQL、高速缓存、DAD框架等高级主题,还讲解了iBATIS在实际开发中的应用。书的最后给出了一个设计优雅、层次清晰的示例程序JGameStore,该示例涵盖全书的...
iBATIS支持Memory、LRU(Least Recently Used)、FIFO(First In First Out)三种缓存策略,每种策略在过期策略上有所不同,但都支持动态过期依赖,即当执行某些特定的statement时,缓存自动失效。然而,需要注意的...