文档章节

java_缓存

天呀鲁哇
 天呀鲁哇
发布于 2015/02/03 00:01
字数 756
阅读 50
收藏 2

缓存可以分为2种:

       1,文件缓存(把数据以文件的形式存储到本地硬盘)

       2,内存缓存(实现一个类中静态Map,对这个Map进行常)

下面我们来实现一个内存缓存:

import java.util.LinkedHashMap;
import java.util.Map;
/**
 * 
 * 
 * 基于继承方式扩展LinkedHashMap
 * 
 * 1,重新构造
 * 
 * 2,重写删除老数据方法
 * 
 * **/
public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V> {
    
      private final int MAX_CACHE_SIZE;
     /**
      * 自定义构造方法
      * 
      * LinkedHashMap 有5种构造方法;
      * 1,空构造  初始化容量为16  加载因子为0.75
      * 2,带初始化容量的构造
      * 3,带初始化容量和加载因子的构造  默认加载因子是0.75
      * 4,带初始化容量 构造原子 排序模式的构造   排序模式如果是true则通过访问顺序排序   如果是false 则为插入顺序
      * 5,构造一个映射关系与指定映射相同的插入顺序 LinkedHashMap 实例
      * **/
      public LRULinkedHashMap(int cacheSize) {
            super((int) Math.ceil(cacheSize / 0.75) + 1, 0.8f, true);
            MAX_CACHE_SIZE = cacheSize;
        }     
      
      //LinkedHashMap自带的判断是否删除最老的元素方法,默认返回false,即不删除老数据  我们要做的就是重写这个方法,当满足一定条件时删除老数据
      @Override
        protected boolean removeEldestEntry(Map.Entry 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();
        }
}
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @Description
 *  java 缓存简单那实现 
 *  简介: 
 *              1,通过利用java内存管理的static特性,采用 new static  Map来在内存中存储信息
 * 
 *              2,内存类缓存的 存 取 更新 释放 同步策略 存: add 取:get 更新: 释放: 同步:
 * 
 *              3,缓存控制的多线程实现
 * 
 * 释放策略:
 *               1,LRU last recently used 最近最少使用 2,FIFO first input first output 先进先出
 * 
 * **/
public class CacheManager {
    
    // 我们通过单例模式来实现实例化cache的map
    private static CacheManager instance = null;
    private static LRULinkedHashMap LRUMap = null;
    private static LinkedHashMap FIFOMap = null;
    
    public static CacheManager getInstance() {
        if (instance == null) {
            synchronized (CacheManager.class) {
                if (instance == null) {
                    instance = new CacheManager();
                }
            }
        }
        return instance;
    }
    private CacheManager() {}
    
    //获得LRU模式的存储map
    public LRULinkedHashMap<Object,Object> getLRUCacheMap(int maxCacheSize){
        synchronized(LRUMap){
           if(LRUMap == null){
               LRUMap = new LRULinkedHashMap<Object,Object>(maxCacheSize);
           }    
        }
         
         return LRUMap;
    }
    //获得FIFO模式的map
   public LinkedHashMap getFIFOCacheMap(){
       synchronized(FIFOMap){
           if(FIFOMap == null){
                 FIFOMap = new LinkedHashMap<Integer, String>() {
                     @Override
                     protected boolean removeEldestEntry(Map.Entry<Integer, String> eldest) {
                     return size() > 100;
                     }
           };
           }
       }
       
      return FIFOMap;
     }
}


其实缓存主要的目的就是以空间来换时间;通过内存的快速读写来替代我们的直接读写;


在实现缓存的时主要注意点:

         1,何时需要实现缓存

         2,缓存的大小控制

         3,缓存的数据添加   删除   更新

         4,多线程下地缓存实现


通过以上的代码:

     我们就可以带着问题去学习  EHCache     OSCache 等缓存框架!

    问题:  什么是缓存?  缓存的实中得策略?(添加,更新)   我么改怎么去选择一个适合我们的缓存框架

                如何评价一个缓存的好坏还是要看自己的业务逻辑结合框架的实现策略进行匹配!





© 著作权归作者所有

共有 人打赏支持
上一篇: 不变模式
天呀鲁哇
粉丝 8
博文 98
码字总数 42007
作品 0
长宁
程序员
私信 提问
关于java的DNS解析IP缓存问题

java对DNS解析IP进行缓存,默认缓存超时时间为-1(在重启JVM前永久缓存), 在第一次访问某域名后将会缓存解析到的IP地址,之后直接从缓存里获得所需的信息(如IP地址),而无需再访问DNS服务...

Sub
2013/08/09
0
0
扩展 JDT 实现自动代码注释与格式化

简介: 本文介绍了一个为 Eclipse 工作空间中的 Java 代码自动添加统一注释并格式化排版的工具及其具体实现。该工具扩展 Eclipse Java Development Tool(JDT)API,操作 Java 代码。通过本文...

红薯
2010/07/30
1K
1
再有人问你Java内存模型是什么,就把这篇文章发给他!

前几天,发了一篇文章,介绍了一下JVM内存结构、Java内存模型以及Java对象模型之间的区别。有很多小伙伴反馈希望可以深入的讲解下每个知识点。Java内存模型,是这三个知识点当中最晦涩难懂的...

技术小能手
2018/09/30
0
0
来,了解一下Java内存模型(JMM)

网上有很多关于Java内存模型的文章,在《深入理解Java虚拟机》和《Java并发编程的艺术》等书中也都有关于这个知识点的介绍。但是,很多人读完之后还是搞不清楚,甚至有的人说自己更懵了。本文...

android 开发
2018/08/21
0
0
再有人问你Java内存模型是什么,就把这篇文章发给他。

前几天,发了一篇文章,介绍了一下JVM内存结构、Java内存模型以及Java对象模型之间的区别。有很多小伙伴反馈希望可以深入的讲解下每个知识点。Java内存模型,是这三个知识点当中最晦涩难懂的...

Java架构
2018/07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

创建多个git账号

实习开发中我们可能一个机子上配置多个git账号,如github.com,oschina.com 或者工作账号,私人账号,这时候就2个账号用一个key,肯定会冲突,有一个会提示没权限(账号和密码对应不上) ssh ...

echojson
27分钟前
1
0
rabbitmq安装教程

RabbitMQ有Windows与Linux版本的,这里先写Windows版本的安装。 以前安装软件总是在百度上找某某安装教程,结果能按照教程安装好的软件真的不多。想起先前以为大牛说的一句话,去官网按照官网...

em_aaron
今天
7
0
Android 贝塞尔曲线实践——波浪式运动

一、波浪效果如下 贝塞尔曲线自定义波浪效果的案例很多,同样方法也很简单,大多数和本案例一样使用二次贝塞尔曲线实现,同样还有一种是PathMeasure的方式,这里我们后续补充,先来看贝塞尔曲...

IamOkay
今天
3
0
Nmap之防火墙/IDS逃逸

选项 解释 -f 报文分段 --mtu 指定偏移大小 -D IP欺骗 -sI 原地址欺骗 --source-port 源端口欺骗 --data-length 指定发包长度 --randomize-hosts 目标主机随机排序 --spoof-mac Mac地址欺骗 ...

Frost729
今天
2
0
带你搭一个SpringBoot+SpringData JPA的环境

不知道大家对SpringBoot和Spring Data JPA了解多少,如果你已经学过Spring和Hibernate的话,那么SpringBoot和SpringData JPA可以分分钟上手的。 其实我在学完SpringBoot和SpringData JPA了之...

java菜分享
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部