Java本地缓存工具类

标签: java localcache
5人阅读 评论(0) 收藏 举报
分类:

使用了Map写了一个简单的本地缓存类,只实现了添加、获取数据以及数据有效期,若有兴趣可自行拓展其他功能。如有不足,请指正,谢谢!

package cache;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * 本地cache(程序变量)用于少数对数据实时性要求不高的场景,一般与memcache或redis配合使用 <br/>
 * 分布式环境下请慎用
 * @author choimeyu
 * @date 2018/04/16
 */
public class LocalCacheClient {
    // 缓存map
    private static Map<String, Object> cacheMap = new HashMap<String, Object>();
    // 缓存有效期map
    private static Map<String, Long> expireTimeMap = new HashMap<String, Long>();


    /**
     * 获取指定的value,如果key不存在或者已过期,则返回null
     * @param key
     * @return
     */
    public static Object get(String key) {
        if (!cacheMap.containsKey(key)) {
            return null;
        }
        if (expireTimeMap.containsKey(key)) {
            if (expireTimeMap.get(key) < System.currentTimeMillis()) { // 缓存失效,已过期
                return null;
            }
        }
        return cacheMap.get(key);
    }

    /**
     * @param key
     * @param <T>
     * @return
     */
    public static <T> T getT(String key) {
        Object obj = get(key);
        return obj == null ? null : (T) obj;
    }

    /**
     * 设置value(不过期)
     * @param key
     * @param value
     */
    public static void set(String key, Object value) {
        cacheMap.put(key, value);
    }

    /**
     * 设置value
     * @param key
     * @param value
     * @param millSeconds 过期时间(毫秒)
     */
    public static void set(final String key, Object value, int millSeconds) {
        final long expireTime = System.currentTimeMillis() + millSeconds;
        cacheMap.put(key, value);
        expireTimeMap.put(key, expireTime);
        if (cacheMap.size() > 2) { // 清除过期数据
            new Thread(new Runnable() {
                public void run() {
                    // 此处若使用foreach进行循环遍历,删除过期数据,会抛出java.util.ConcurrentModificationException异常
                    Iterator<Map.Entry<String, Object>> iterator = cacheMap.entrySet().iterator();
                    while (iterator.hasNext()) {
                        Map.Entry<String, Object> entry = iterator.next();
                        if (expireTimeMap.containsKey(entry.getKey())) {
                            long expireTime = expireTimeMap.get(key);
                            if (System.currentTimeMillis() > expireTime) {
                                iterator.remove();
                                expireTimeMap.remove(entry.getKey());
                            }
                        }
                    }
                }
            }).start();
        }
    }

    /**
     * key是否存在
     * @param key
     * @return
     */
    public static boolean isExist(String key) {
        return cacheMap.containsKey(key);
    }


    public static void main(String[] args) {
        LocalCacheClient.set("testKey_1", "testValue_1");
        LocalCacheClient.set("testKey_2", "testValue_2", 1);
        LocalCacheClient.set("testKey_3", "testValue_3");
        LocalCacheClient.set("testKey_4", "testValue_4", 1);
        Object testKey_2 = LocalCacheClient.get("testKey_2");
        System.out.println(testKey_2);
    }

}

查看评论

Java 实现本地缓存工具

基本思路: 1、继承线程安全的ConcurrentHashMap  2、增加定时器配置信息 3、缓存工具使用单例模式 4、重写put 与 get 方法 5、重载一个 put 方法,增加一个缓存时间参数...
  • ljm_503909378
  • ljm_503909378
  • 2016-12-01 12:11:40
  • 1458

Java - Map本地缓存工具类

这两天无意之中接触到了进程内缓存这个概念,很是开心(原谅我是一个刚入行的小白),在我的知识储备中,缓存的概念只有redis作为缓存工具.所以说路漫漫其修远兮,不是没有道理的. 什么是进程内缓存呢?根...
  • qq_15302415
  • qq_15302415
  • 2017-10-27 11:00:03
  • 107

缓存工具类MyCacheUtil

MyCacheUtil.java package com.sunrise.jop.common.util; import java.io.File; import java.sql.Timestam...
  • jianfpeng241241
  • jianfpeng241241
  • 2016-10-27 11:24:21
  • 413

java CacheProxy 缓存工具类

所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。 1.缓存代理类CacheProxy packag...
  • w410589502
  • w410589502
  • 2016-07-25 11:29:08
  • 1810

本地缓存工具类

项目中经常可能需要用到本地缓存来提高效率,自己写缓存又太麻烦,而且还有内存溢出的问题。本工具类是通过goole的开源框架Guava来实现的本地缓存,使用方式很简单,可以自己进行扩展。当缓存达到最大值时...
  • f529352479
  • f529352479
  • 2015-03-27 10:11:07
  • 261

java实现本地缓存

本地缓存的作用是减少db或cache的查询次数。 使用场景为静态或者非敏感数据。 可以使用google的guava cache。 本文尝试自己写本地缓存。 import lombok.AllArgsC...
  • mik1s
  • mik1s
  • 2016-12-12 10:44:47
  • 3459

Java 本地缓存的实现(转)

转自:http://zhangwei-david.iteye.com/blog/2179087  在java web 项目中对频繁读取且相对稳定的数据一般都是用了缓存,这样可以极大地减少数据...
  • lunhuishizhe
  • lunhuishizhe
  • 2015-01-28 23:07:25
  • 2796

如何使用Java实现简单的本地缓存?

我们知道,频繁的IO操作(包括网络请求、数据库请求等)是非常耗费时间资源的,同时也会极大的加重数据库等的压力,降低响应速度。因此对经常访问的数据做适当的缓存机制是非常有必要的。一般我们是通过key从缓...
  • liucan9035
  • liucan9035
  • 2017-06-26 15:30:42
  • 275

LocalCache本地缓存分享

LocalCache本地缓存分享 前言 一、本地缓存应用场景 二、java本地缓存标准 三、java开源缓存框架 四、LocalCache实现 结束语...
  • u011683530
  • u011683530
  • 2016-03-31 20:17:06
  • 8057

java本地缓存实现

在java web 项目中对频繁读取且相对稳定的数据一般都是用了缓存,这样可以极大地减少数据库的压力且提高的响应的速度。 一般都是,通过key 从缓存中读取value 如果value 为空则读取DB,...
  • mrxiky
  • mrxiky
  • 2017-03-11 17:44:55
  • 3177
    个人资料
    持之以恒
    等级:
    访问量: 3万+
    积分: 590
    排名: 8万+
    最新评论