1 package org.shiftone.cache.policy.lru; 2 3 4 5 import org.shiftone.cache.util.*; 6 import org.shiftone.cache.util.reaper.ReapableCache; 7 8 import java.util.Map ; 9 10 11 18 class LruCache extends AbstractPolicyCache implements ReapableCache 19 { 20 21 private static final Log LOG = new Log(LruCache.class); 22 private final Map map; 23 private final LinkedList fifo; 24 private final LinkedList lru; 25 26 LruCache(String name, long timeoutMilliSeconds, int maxSize) 27 { 28 29 super(name, timeoutMilliSeconds, maxSize); 30 31 map = MapFactory.createMap(maxSize); 32 fifo = new LinkedList(); 33 lru = new LinkedList(); 34 } 35 36 37 protected CacheNode findNodeByKey(Object key) 38 { 39 return (LruNode) map.get(key); 40 } 41 42 43 public int size() 44 { 45 return map.size(); 46 } 47 48 49 protected void revalueNode(CacheNode node) 50 { 51 52 LruNode n = (LruNode) node; 53 54 lru.moveToFirst(n.lruNode); 55 } 56 57 58 protected void delete(CacheNode node) 59 { 60 61 LruNode n = (LruNode) node; 62 63 fifo.remove(n.fifoNode); 64 lru.remove(n.lruNode); 65 map.remove(n.key); 66 } 67 68 69 protected void removeLeastValuableNode() 70 { 71 72 LinkedListNode lln = null; 73 LruNode node = null; 74 75 lln = lru.peekLast(); 76 node = (LruNode) lln.getValue(); 77 78 delete(node); 79 } 80 81 82 public void removeExpiredElements() 83 { 84 85 LinkedListNode lln = null; 86 LruNode node = null; 87 88 while ((lln = fifo.peekLast()) != null) 89 { 90 node = (LruNode) lln.getValue(); 91 92 if (node.isExpired()) 93 { 94 delete(node); 95 } 96 else 97 { 98 99 break; 101 } 102 } 103 } 104 105 106 protected CacheNode createNode(Object userKey, Object cacheObject) 107 { 108 109 LruNode node = new LruNode(); 110 111 node.key = userKey; 112 node.value = cacheObject; 113 node.fifoNode = fifo.addFirst(node); 114 node.lruNode = lru.addFirst(node); 115 node.timeoutTime = System.currentTimeMillis() + getTimeoutMilliSeconds(); 116 117 map.put(userKey, node); 118 119 return node; 120 } 121 122 123 String dumpLruKeys() 124 { 125 126 String dump = null; 127 StringBuffer sb = new StringBuffer (); 128 LinkedListNode node = lru.peekFirst(); 129 LruNode current = null; 130 131 while (node != null) 132 { 133 current = (LruNode) node.getValue(); 134 135 sb.append(current.key); 136 137 node = node.getNext(); 138 } 139 140 dump = sb.toString(); 141 142 LOG.debug("dumpLruKeys : " + dump); 143 144 return dump; 145 } 146 147 148 String dumpFifoKeys() 149 { 150 151 String dump = null; 152 StringBuffer sb = new StringBuffer (); 153 LinkedListNode node = fifo.peekFirst(); 154 LruNode current = null; 155 156 while (node != null) 157 { 158 current = (LruNode) node.getValue(); 159 160 sb.append(current.key); 161 162 node = node.getNext(); 163 } 164 165 dump = sb.toString(); 166 167 LOG.debug("dumpFifoKeys : " + dump); 168 169 return dump; 170 } 171 } 172 | Popular Tags |