solr入门之设计自己的Java本地缓存工具类

本文介绍了作者在学习Solr过程中,为避免内存溢出风险,基于LUR算法和LinkedHashMap重新设计的本地缓存工具类。这个缓存类允许设置容量,以提高缓存效率。
摘要由CSDN通过智能技术生成

上次设计的那个缓存仅仅是个粗糙的模板,存在内存溢出的风险,今天又学习些东西重新构建了一个本地缓存类(可以设置大小)

本次缓存类使用了LUR算法+LinkedHashMap来实现的.

LRU是Least Recently Used 近期最少使用算法。
内存管理的一种页面置换算法,对于在内存中但又不用的 数据块(内存块)叫做LRU,操作系统会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。
什么是LRU算法? LRU是Least Recently Used的缩写,即最少使用 页面置换算法,是为虚拟页式 存储管理服务的。
关于操作系统的内存管理,如何节省利用容量不大的内存为最多的进程提供资源,一直是研究的重要方向。而内存的虚拟存储管理,是现在最通用,最成功的方式—— 在内存有限的情况下,扩展一部分外存作为 虚拟内存,真正的内存只存储当前运行时所用得到信息。这无疑极大地扩充了内存的功能,极大地提高了计算机的并发度。虚拟页式存储管理,则是将进程所需空间划分为多个页面,内存中只存放当前所需页面,其余页面放入外存的管理方式。


LinkedHashMap自身已经实现了顺序存储,默认情况下是按照元素的添加顺序存储,也可以启用按照访问顺序存储,即最近读取的数据放在最前面,最早读取的数据放在最后面,然后它还有一个判断是否删除最老数据的方法,默认是返回false,即不删除数据,我们使用LinkedHashMap实现LRU缓存的方法就是对LinkedHashMap实现简单的扩展,扩展方式有两种,一种是inheritance,一种是delegation,具体使用什么方式看个人喜好

本次借鉴的是inheritance的方式   最后会有另外一种实现的链接 可以参考

package cn.com.mx.gome.suggest.cache;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * lur算法实现定量的简单缓存
 * @author songqinghu
 *
 */
public class LURCache<K,V> extends LinkedHashMap<K, V> {
    
    private final int MAX_CACHE_SIZE ;

    public  LURCache(int cacheSize){
        super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);
        MAX_CACHE_SIZE = cacheSize;
    }
    
    @Override
    protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
        return size() > MAX_CACHE_SIZE;
    }
    
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<K, V> entry : entrySet()) {
            sb.append(String.format(" %s: %s ", entry.getKey(),entry.getValue()));
        }
        return sb.toString();
    }
    
}

package cn.com.mx.gome.suggest.cache;

import java.util.Collections;
import java.util.Map;

/**
 * solr中词语缓存类
 * @author songqinghu
 *
 */
public class WordLURCache {

    private static  Map<String,Integer> mapCache 
    = Collections.synchronizedMap(new LURCache<String,Integer>(50000));//这里的获取方式保证多线下的安全问题
    
    
    public static Map<String,Integer> getWordCache(){
        return mapCache;
    }
    
    
    
    
    
}

参考资料:

http://www.cnblogs.com/lzrabbit/p/3734850.html



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值