Переглянути джерело

优化,使用SoftReference作为value,在内存不够的时候,自动释放缓存

zhouhao 8 роки тому
батько
коміт
ce07b7cc29

+ 21 - 3
hsweb-web-concurrent/hsweb-web-concurrent-cache/src/main/java/org/hsweb/concureent/cache/monitor/SimpleMonitorCache.java

@@ -19,6 +19,8 @@ package org.hsweb.concureent.cache.monitor;
 import org.hsweb.web.core.cache.monitor.MonitorCache;
 import org.springframework.cache.concurrent.ConcurrentMapCache;
 
+import java.lang.ref.Reference;
+import java.lang.ref.SoftReference;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -29,7 +31,7 @@ public class SimpleMonitorCache extends ConcurrentMapCache implements MonitorCac
     private final AtomicInteger putTimes = new AtomicInteger(0);
 
     public SimpleMonitorCache(String name) {
-        super(name,false);
+        super(name, false);
     }
 
     @Override
@@ -52,6 +54,17 @@ public class SimpleMonitorCache extends ConcurrentMapCache implements MonitorCac
         return hitTimes.get();
     }
 
+    @Override
+    protected Object lookup(Object key) {
+        Object value = super.lookup(key);
+        if (value != null && value instanceof Reference) {
+            Reference reference = (Reference) value;
+            if (reference != null) return reference.get();
+            evict(key);
+        }
+        return value;
+    }
+
     @Override
     public ValueWrapper get(Object key) {
         ValueWrapper wrapper = super.get(key);
@@ -72,22 +85,27 @@ public class SimpleMonitorCache extends ConcurrentMapCache implements MonitorCac
         return value;
     }
 
+    protected Object buildValue(Object value) {
+        return new SoftReference(value);
+    }
+
     @Override
     public void put(Object key, Object value) {
         if (key == null || value == null) return;
         putTimes.addAndGet(1);
-        super.put(key, value);
+        super.put(key, buildValue(value));
     }
 
     @Override
     public ValueWrapper putIfAbsent(Object key, Object value) {
         if (key == null || value == null) return null;
         putTimes.addAndGet(1);
-        return super.putIfAbsent(key, value);
+        return super.putIfAbsent(key, buildValue(value));
     }
 
     @Override
     public long getPutTimes() {
         return putTimes.get();
     }
+
 }