基于Java实现缓存Cache的深入分析

时间:2023-08-15 20:53:59 

原理是使用LinkedHashMap来实现,当缓存超过大小时,将会删除最老的一个元组。
实现代码如下所示


import java.util.LinkedHashMap;
import java.util.Map;
public class LRUCache {
 public static class CachedData {
  private Object data = null;
  private long time = 0;
  private boolean refreshing = false;
  public CachedData(Object data) {
   this.data = data;
   this.time = System.currentTimeMillis();
  }
  public Object getData() {
   return data;
  }
  public long getTime() {
   return time;
  }

  public void setTime(long time) {
   this.time = time;
  }

  public boolean getRefreshing() {
      return refreshing;
  }

  public void setRefreshing(boolean b) {
      this.refreshing = b;
  }
 }
 protected static class CacheMap extends LinkedHashMap {
  protected int maxsize = 0;
  public CacheMap(int maxsize) {
   super(maxsize * 4 / 3 + 1, 0.75f, true);
   this.maxsize = maxsize;
  }
  protected boolean removeEldestEntry(Map.Entry eldest) {
   return size() > this.maxsize;
  }
 }
 protected CacheMap map = null;
 public LRUCache(int size) {
  this.map = new CacheMap(size);
 }
 public synchronized void set(Object key, Object value) {
  map.remove(key);
  map.put(key, new CachedData(value));
 }
 public synchronized void remove(Object key) {
  map.remove(key);
 }
 public synchronized CachedData get(Object key) {
  CachedData value = (CachedData) map.get(key);
  if (value == null) {
   return null;
  }
  map.remove(key);
  map.put(key, value);

  return value;
 }

 public int usage() {
  return map.size();
 }

 public int capacity() {
  return map.maxsize;
 }

 public void clear() {
  map.clear();
 }
}


标签:Java,cache,缓存
0
投稿

猜你喜欢

  • C#中async和await的深入分析

    2023-09-14 17:11:20
  • C#中使用IFormattable实现自定义格式化字符串输出示例

    2023-05-31 23:34:04
  • Kotlin中空判断处理操作实例

    2023-01-16 00:45:19
  • 详解idea从git上拉取maven项目详细步骤

    2023-04-23 08:51:56
  • Android中方法数超限问题与启动优化详解

    2023-03-05 17:55:41
  • C#实现飞行棋(Winform)

    2023-08-07 07:08:55
  • springboot整合shardingsphere和seata实现分布式事务的实践

    2021-08-10 04:28:37
  • android开发教程之自定义控件checkbox的样式示例

    2023-10-23 13:33:55
  • 详解Java8如何使用Lambda表达式进行比较

    2023-12-09 19:27:16
  • Java实现的质因数分解操作示例【基于递归算法】

    2023-08-19 03:22:12
  • Springboot+WebSocket实现一对一聊天和公告的示例代码

    2022-06-16 11:32:33
  • C#使用默认浏览器打开网页的方法

    2022-02-16 10:39:34
  • Android Studio中统一管理版本号引用配置问题

    2023-03-06 04:23:54
  • Java编码摘要算法实例解析

    2022-07-21 23:33:29
  • 浅谈C# winForm 窗体闪烁的问题

    2023-06-10 09:46:07
  • Mybatis中的延迟加载案例解析

    2023-02-27 01:55:37
  • C#中try...catch的使用与常见面试题分享

    2022-10-22 16:30:35
  • java使用RandomAccessFile类基于指针读写文件实例代码

    2021-07-29 17:45:45
  • java中URLEncoder.encode与URLDecoder.decode处理url特殊参数的方法

    2022-05-22 05:32:00
  • java实现Xml与json之间的相互转换操作示例

    2023-06-21 13:30:39
  • asp之家 软件编程 m.aspxhome.com