一个轻量级java缓存的实现

上代码

package com.lemon.demo.test;

import java.util.ArrayList;
import org.apache.commons.collections.MapIterator;
import org.apache.commons.collections.map.LRUMap;
 
/**
 * @author bjs
 */
 
public class CrunchifyInMemoryCache<K, T> {
 
    private long timeToLive;//缓存的存放时间
    private LRUMap crunchifyCacheMap;//存放缓存的对象
 
    protected class CrunchifyCacheObject {
        public long lastAccessed = System.currentTimeMillis();
        public T value;
 
        protected CrunchifyCacheObject(T value) {
            this.value = value;
        }
    }
 
    /**
     * 构造函数
     * @param crunchifyTimeToLive 对象的生存周期(单位s秒)
     * @param crunchifyTimerInterval 回收时间间隔
     * @param maxItems 缓存最大数量
     */
    public CrunchifyInMemoryCache(long crunchifyTimeToLive, final long crunchifyTimerInterval, int maxItems) {
        this.timeToLive = crunchifyTimeToLive * 1000;
 
        crunchifyCacheMap = new LRUMap(maxItems);//达到最大值后,会保持住last recenty used对象,LRUmap会回收最近最好使用的对象
 
        if (timeToLive > 0 && crunchifyTimerInterval > 0) {
 
            Thread t = new Thread(new Runnable() {
                public void run() {
                    while (true) {
                        try {
                            Thread.sleep(crunchifyTimerInterval * 1000);
                        } catch (InterruptedException ex) {
                        }
                        System.out.println("shit垃圾回收了 了");
                        cleanup();
                    }
                }
            });
 
            t.setDaemon(true);
            t.start();
        }
    }
 
    public void put(K key, T value) {
        synchronized (crunchifyCacheMap) {
            crunchifyCacheMap.put(key, new CrunchifyCacheObject(value));
        }
    }
 
    @SuppressWarnings("unchecked")
    public T get(K key) {
        synchronized (crunchifyCacheMap) {
            CrunchifyCacheObject c = (CrunchifyCacheObject) crunchifyCacheMap.get(key);
 
            if (c == null)
                return null;
            else {
                c.lastAccessed = System.currentTimeMillis();
                return c.value;
            }
        }
    }
 
    public void remove(K key) {
        synchronized (crunchifyCacheMap) {
            crunchifyCacheMap.remove(key);
        }
    }
 
    public int size() {
        synchronized (crunchifyCacheMap) {
            return crunchifyCacheMap.size();
        }
    }
 
    @SuppressWarnings("unchecked")
    public void cleanup() {
 
        long now = System.currentTimeMillis();
        ArrayList<K> deleteKey = null;
 
        synchronized (crunchifyCacheMap) {
            MapIterator itr = crunchifyCacheMap.mapIterator();
 
            deleteKey = new ArrayList<K>((crunchifyCacheMap.size() / 2) + 1);
            K key = null;
            CrunchifyCacheObject c = null;
            
            //收集过期的key值
            while (itr.hasNext()) {
                key = (K) itr.next();
                c = (CrunchifyCacheObject) itr.getValue();
 
                if (c != null && (now > (timeToLive + c.lastAccessed))) {
                    deleteKey.add(key);
                }
            }
        }
 
        for (K key : deleteKey) {
            synchronized (crunchifyCacheMap) {
                crunchifyCacheMap.remove(key);
            }
 
            Thread.yield();
        }
    }
}

测试类

为什么要做这个东西呢,我了个大擦,因为最近做了个手机客户端的服务接口,要存一个上次登录时间,数据库里面只有一个字段lastlogintime,这时候呢,为了最小的减少数据库的污染,所以我自己实现了一个缓存,用用户登录的id做为key,查出来的时间作为value缓存起来。所以,做了这个类。

时间: 2024-09-20 20:42:20

一个轻量级java缓存的实现的相关文章

初识轻量级Java开源框架 --- Spring

初识轻量级Java开源框架 --- Spring 作者:egg 微博:http://weibo.com/xtfggef 出处:http://blog.csdn.net/zhangerqing spring是一个轻量级Java框架,其核心思想就是DI(Dependency Injection,即依赖注入)和IoC(Inversion of Control,即控制反转),因为其开源.低侵入性,现在已经席卷了很大一部分市场,其最大竞争对手乃是JavaEE框架EJB.EJB3.0以前,由于其笨重以及使用

闲来无事,用Java的软引用写了一个山寨的缓存

闲来无事,用Java的软引用写了一个山寨的缓存 博客分类: java基础 众所周知java中的引用分为 StrongReference.SoftReference.WeakReference.PhantomReference.这几种引用有不同那个的 使用场景,平时我们用的最频繁的也就是StrongReference也就是说形如之这样的引用: Object obj = new Object(); 这种引用就是所谓的强引用,如果此对象没有引用指向它,并且活着的线程无法访问到它(针对垃圾孤岛而言),那

java动态缓存成长小纪(一)——创建一个简单的缓存

在实际项目中,我们经常会需要使用到缓存.一般来说,缓存介质是内存:而常见的DB将数据存储在硬盘中的:缓存读取是电脉冲,而硬盘读取是机械地读取转动的硬盘,速度差异是上百倍的.所以往往可以通过缓存,对经常用到的数据进行访问,以提高速度. 创建缓存实际上就是针对两个对象,1. Cache对象,即一个缓存对象:2. CacheManager对象,即一个管理不同缓存的对象,其核心实际上就是一个Map,用来保存与获取不同缓存. 最简单的缓存 实现如下: /** * 项目名称: * 文件说明:创建一个缓存管理

Java实现一个简单的缓存方法

缓存是在web开发中经常用到的,将程序经常使用到或调用到的对象存在内存中,或者是耗时较长但又不具有实时性的查询数据放入内存中,在一定程度上可以提高性能和效率.下面我实现了一个简单的缓存,步骤如下. 创建缓存对象EntityCache.java public class EntityCache {   /**    * 保存的数据    */   private Object datas;   /**    * 设置数据失效时间,为0表示永不失效    */   private long time

JDK9版本以上Java独有的一个轻量级小工具,你知道吗?jshell

jshell,是JavaJDK9这个大版本更新以来,带来的一个轻量级小工具.我们再也不用进入Java目录,编写一个Java文件,然后再去编译,最后才能执行它. 这里,你可以直接写一个小功能,就能去实现它.这就是jshell带来的一个小便利. 介绍:jshell这是Java用来写脚本的轻量小工具. 直接输入:jshell进入 退出: 输入/exit   记得一定要加/ 对于byte/short/char/三种类型来说,如果右侧赋值的数值没有超过范围, 那么Javac编译器将会自动隐含的为我们补上一

轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)

轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Java EE经典著作) 李刚 编著   ISBN 978-7-121-24253-3 2014年10月出版 定价:108.00元 824页 16开 编辑推荐 国内知名IT图书作家李刚老师基于曾荣获中国书刊发行业协会“年度全行业优秀畅销品种”大奖的<轻量级Java EE企业应用实战(第3版)>全新升级:

java缓存(1、概述)

概述 对于程序员来说,听到缓存,一定会非常的亢奋,因为这年代,你去找工作,说不知道缓存,没用过缓存,都不好意思说自己是程序员,所以说缓存时一个非常热的话题,今天就讲一下自己关于缓存的理解,希望对于对大家有相应的帮助. 缓存概念 学习一个东西,我们首先应该清楚他是什么,那么,缓存到底是什么呢?缓存就是内存里面用于存放数据的空间,即,缓存就是内存.缓存的目的是什么呢?缓存就是为了优化程序查询IO数据,将程序经常从IO中查询的数据,保存到内存中,使程序直接操作内存即可获得数据,优化了程序等待IO数据的

基于Netty和SpringBoot实现一个轻量级RPC框架-Client篇

前提 前置文章: <基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇> <基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇> 前一篇文章相对简略地介绍了RPC服务端的编写,而这篇博文最要介绍服务端(Client)的实现.RPC调用一般是面向契约编程的,而Client的核心功能就是:把契约接口方法的调用抽象为使用Netty向RPC服务端通过私有协议发送一个请求.这里最底层的实现依赖于动态代理,因此动态代理是动态实现接口的最简单方式(如果

Java 缓存技术

以下仅是对map对方式讨论.没有对点阵图阵讨论.作缓存要做以下2点:  1:清理及更新缓存时机的处理: . 虚拟机内存不足,清理缓存 .. 缓存时间超时,或访问次数超出, 启动线程更新 2:类和方法的反射 (线程嵌套调用) reflect.invoke的使用. JAVA缓存有两种: 一.文件缓存,是指把数据存储在磁盘上,可以XML格式,也可以序列化文件DAT格式还是其它文件格式. 二.内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查. 代码如下:内存中的缓存 package