• 30秒缓存


    缓存类:

    package test;

    import java.util.AbstractMap;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Map;
    import java.util.Set;

    /**
    * 用来存储短暂对象的缓存类,实现Map接口,内部有一个定时器用来清除过期(30秒)的对象。
    * 为避免创建过多线程,没有特殊要求请使用getDefault()方法来获取本类的实例。
    * 此代码来源于互联网
    * @param <K>
    * @param <V>
    */

    public class CacheMap<K, V> extends AbstractMap<K, V> {
    //过期时间为30秒
    private static final long DEFAULT_TIMEOUT = 30000;
    private static CacheMap<Object, Object> defaultInstance;

    public static synchronized final CacheMap<Object, Object> getDefault() {
    if (defaultInstance == null) {
    defaultInstance = new CacheMap<Object, Object>(DEFAULT_TIMEOUT);
    }
    return defaultInstance;
    }

    private class CacheEntry implements Entry<K, V> {
    long time;
    V value;
    K key;

    CacheEntry(K key, V value) {
    super();
    this.value = value;
    this.key = key;
    this.time = System.currentTimeMillis();
    }

    @Override
    public K getKey() {
    return key;
    }

    @Override
    public V getValue() {
    return value;
    }

    @Override
    public V setValue(V value) {
    return this.value = value;
    }
    }

    private class ClearThread extends Thread {
    ClearThread() {
    setName("clear cache thread");
    }

    public void run() {
    while (true) {
    try {
    long now = System.currentTimeMillis();
    Object[] keys = map.keySet().toArray();
    for (Object key : keys) {
    CacheEntry entry = map.get(key);
    if (now - entry.time >= cacheTimeout) {
    synchronized (map) {
    map.remove(key);
    }
    }
    }
    Thread.sleep(cacheTimeout);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    }

    private long cacheTimeout;
    private Map<K, CacheEntry> map = new HashMap<K, CacheEntry>();

    public CacheMap(long timeout) {
    this.cacheTimeout = timeout;
    new ClearThread().start();
    }

    @Override
    public Set<Entry<K, V>> entrySet() {
    Set<Entry<K, V>> entrySet = new HashSet<Map.Entry<K, V>>();
    Set<Entry<K, CacheEntry>> wrapEntrySet = map.entrySet();
    for (Entry<K, CacheEntry> entry : wrapEntrySet) {
    entrySet.add(entry.getValue());
    }
    return entrySet;
    }

    @Override
    public V get(Object key) {
    CacheEntry entry = map.get(key);
    return entry == null ? null : entry.value;
    }

    @Override
    public V put(K key, V value) {
    CacheEntry entry = new CacheEntry(key, value);
    synchronized (map) {
    map.put(key, entry);
    }
    return value;
    }
    }

    调用缓存类:

    package test;

    /**
    * 调用步骤:
    * 1:向缓存类中存放一个key和Value
    * 2:30秒之前使用get(key)取出的是value
    * 3:30秒后使用get(key)取出的是null
    * @author xuming
    *
    */
    public class run {

    public static void main(String[] args) {
    //实例化CacheMap方法
    CacheMap c = CacheMap.getDefault();
    c.put("k1","v1");
    //存放时的时间戳
    double currentTime =System.currentTimeMillis();
    for(int i = 0;i<500000;i++){
    //当前的时间差---获取get(key)
    System.out.println((System.currentTimeMillis()-currentTime)/10000+"秒---"+c.get("k1"));
    }
    }

    }

  • 相关阅读:
    针对web高并发量的处理
    外边距合并,外边距折叠
    cookie 和session 的区别:
    ng-if ng-show ng-hide 的区别
    JavaScript中的arguments,callee,caller
    git常见命令
    jQuery中.bind() .live() .delegate() .on()的区别
    为什么要使用sass
    js兼容性记录
    poj1004
  • 原文地址:https://www.cnblogs.com/Xmingzi/p/7886722.html
Copyright © 2020-2023  润新知