使用map实现本地缓存

一、创建定时器线程池

static class FactoryClass implements ThreadFactory{
      @Override
      public Thread newThread(Runnable r) {
          Thread t = new Thread(r, "SegmentScheduledExecutorThread");
          t.setDaemon(true);
          return t;
      }
  }
private static final ScheduledExecutorService ScheduledService = Executors.newSingleThreadScheduledExecutor(new FactoryClass());

二、创建map,并实现put和get方法

 private final static Map<String, Entity> MAP = new HashMap<>(16);
 /**
  * 添加缓存
  *
  * @param key    键
  * @param data   值
  * @param expire 过期时间,单位:毫秒, 0表示无限长
  */
  public synchronized static void put(String key, Object data, long expire) {
        //清除原键值对
        CacheUtils.remove(key);
        //设置过期时间
        if (expire > 0) {
            Future future = ScheduledService.schedule(new Runnable() {
                @Override
                public void run() {
                    //过期后清除该键值对
                    synchronized (CacheUtils.class) {
                        MAP.remove(key);
                    }
                }
            }, expire, TimeUnit.MILLISECONDS);
            MAP.put(key, new Entity(data, future));
        } else {
            //不设置过期时间
            MAP.put(key, new Entity(data, null));
        }
    }

    /**
     * 读取缓存
     *
     * @param key 键
     * @return
     */
    public synchronized static <T> T get(String key) {
        Entity entity = MAP.get(key);
        return entity == null ? null : (T) entity.value;
    }

三、创建remove方法,移除过期的键值对

   /**
     * 清除缓存
     *
     * @param key 键
     * @return
     */
    public synchronized static <T> T remove(String key) {
        //清除原缓存数据
        Entity entity = MAP.remove(key);
        if (entity == null) {
            return null;
        }
        //清除原键值对定时器
        if (entity.future != null) {
            entity.future.cancel(true);
        }
        return (T) entity.value;
    }

四、使用到的内部实体类

   /**
     * 缓存实体类
     */
    static class Entity {
        /**
         * 键值对的value
         */
        public Object value;
        /**
         * 定时器Future
         */
        public Future future;

        public Entity(Object value, Future future) {
            this.value = value;
            this.future = future;
        }
    }

你可能感兴趣的:(#,缓存,Java)