文档章节

org.apache.commons.collections.map.LRUMap 在cache中的使用

Faye_Cai
 Faye_Cai
发布于 2016/08/15 14:33
字数 465
阅读 466
收藏 0

LRUMap对于构建缓存或者连接池之类的技术经常用到,common-collections框架给了现成的实现,大家在不需要修改的情况下,直接用,好用且稳定。

一个cache的简单例子:

import org.apache.commons.collections.map.LRUMap;  

import java.util.Collections;    

public class SampleCache {  

private static SampleCache instance = null;

private Map<Long, Integer> cache = null;

private static int maxLength = 100000;

private SampleCache () {
        init();
    }

public static SampleCache getInstance() {
        if (instance == null) {
            instance = new SampleCache ();
        }
        return instance;
    }

private void init() {
        LRUMap map = new LRUMap(maxLength);
        this.cache = Collections.synchronizedMap(map);

    }

}

=======解析LRUMap=======

参考http://blog.csdn.net/statckoverflow/article/details/18908647 , 下面例子直接copy自参考文章

LRUMap 的一个简单使用示例:

  1. public static void main(String[] args) {  
  2.     LRUMap lruMap = new LRUMap(2);  
  3.     lruMap.put("a1", "1");  
  4.     lruMap.put("a2", "2");  
  5.     lruMap.get("a1");//mark as recentused  
  6.     lruMap.put("a3", "3");  
  7.     System.out.println(lruMap);  
  8. }  

 

上面的示例,当增加”a3”值时,会淘汰最近最少使用的”a2”, 最后输出的结果为:

{a1=1,a3=3} 

LRUMap的使用说明如下:

LRUMap的初始化时需要指定最大集合元素个数,新增的元素个数大于允许的最大集合个数时,则会执行LRU淘汰算法。 所有的元素在LRUMap中会根据最近使用情况进行排序。最近使用的会放在元素的最前面(LRUMap是通过链表来存储元素内容). 所以LRUMap进行淘汰时只需要删除链表最后一个即可(即header.after所指的元素对象)

那么那些操作会影响元素的使用情况:

1.put 当新增加一个集合元素对象,则表示该对象是最近被访问的

2. get 操作会把当前访问的元素对象作为最近被访问的,会被移到链接表头

 

注:当执行containsKey和containsValue操作时,不会影响元素的访问情况。

LRUMap也是非线程安全。在多线程下使用可通过Collections.synchronizedMap(Map)操

作来保证线程安全。

 

© 著作权归作者所有

Faye_Cai
粉丝 0
博文 28
码字总数 5590
作品 0
海淀
高级程序员
私信 提问
spring数据源DriverManagerDataSource和BasicDataSource

说起来没什么好说的东西,Java后台的配置还是照样的配,服务一直调用着正欢的时候发现跑个1000条记录tomcat就会有报错,大致错误如下: org.springframework.tr ansaction.CannotCreateTrans...

ulyn
2013/05/16
6.3K
0
关于 MySQL Query Cache

最近经常有人问我 MySQL Query Cache 相关的问题,就整理一点 MySQL Query Cache 的内容,以供参考。 顾名思义,MySQL Query Cache 就是用来缓存和 Query 相关的数据的。具体来说,Query Cac...

范堡
2010/12/21
561
3
MYSQL的Query Cache

MySQL的Query Cache 就是用来缓存和 Query 相关的数据的。缓存客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集。将 SELECT 语句和语句的结果做了一个 HASH 映射关系然后保存在一定的内...

wuwei5460
2014/04/29
0
0
能否让 Cache 变得更加优雅?

本文是《轻量级 Java Web 框架架构设计》的系列博文。 之前实现了一个简单的 Cache 插件,主要用于 Service 层,为了减少数据库的访问次数,将数据放入 Cache 中缓存起来。在 Service 中直接...

黄勇
2013/11/04
2.3K
2
【MySQL】Query Cache 优化

注:本文内容来自MySQL大神:简朝阳http://isky000.com/ 的《MySQL性能调优与架构设计》一书 谈到Query Cache,恐怕使用过MySQL 的大部分人都会或多或少有一些了解,因为在很多人看来他可以帮...

磊神Ray
2013/07/12
292
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈FlyWeight享元模式

一、前言 享元(FlyWeight)模式顾名思义,即是轻量级,原因就是享元,共享元素,这里的元素指的是对象。如何共享对象,那就是在检测对象产生的时候,如果产生的是同一个对象,那么直接使用已...

青衣霓裳
4分钟前
2
0
Python学习10.14:Python set集合详解

Python 中的集合,和数学中的集合概念一样,用来保存不重复的元素,即集合中的元素都是唯一的,互不相同。 从形式上看,和字典类似,Python 集合会将所有元素放在一对大括号 {} 中,相邻元素...

太空堡垒185
4分钟前
2
0
好程序员大数据教程分享Scala系列之文件以及正则表达式

好程序员大数据教程分享Scala系列之文件以及正则表达式 1 读取行 导入scala.io.Source后,即可引用Source中的方法读取文件信息。 import scala.io.Source object FileDemo extends App{ val ...

好程序员官网
4分钟前
2
0
75.nosql memcached与安装及查看状态

21.1 nosql介绍 21.2 memrcached介绍 21.3 安装memcached 21.4 查看memcachedq状态 21.1 nosql介绍 什么是NoSQL: 1.非关系型数据库就是NoSQL,关系型数据库代表MySQL 也是一种数据库,来存储...

oschina130111
6分钟前
1
0
玩转阿里云 Terraform(二):Terraform 的几个关键概念

上一篇《玩转阿里云Terraform(一):Terraform 是什么》介绍了 Terraform 的基本定义和特点之后,本文将着重介绍几个Terraform中的关键概念。 Terraform 关键概念 在使用Terraform的过程中,通...

阿里云官方博客
6分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部