首页 > 代码库 > JAVA 实现自定义的缓存实现

JAVA 实现自定义的缓存实现

   首先要了解下java1.6中的ConcurrentMap ,他是一个线程安全的Map实现,特别说明的是在没有特别需求的情况下可以用ConcurrentHashMap。我是想学习一下读写锁的应用,就自己实现了一个SimpleConcurrentHashMap.

  1. package com.cttc.cache.entity;  

  2.   

  3. import java.util.ArrayList;  

  4. import java.util.Collection;  

  5. import java.util.HashSet;  

  6. import java.util.Map;  

  7. import java.util.Set;  

  8. import java.util.concurrent.locks.Lock;  

  9. import java.util.concurrent.locks.ReadWriteLock;  

  10. import java.util.concurrent.locks.ReentrantReadWriteLock;  

  11.   

  12. public class SimpleConcurrentMap<K, V> implements Map<K, V> {  

  13.     final ReadWriteLock lock = new ReentrantReadWriteLock();  

  14.     final Lock r = lock.readLock();  

  15.     final Lock w = lock.writeLock();  

  16.     final Map<K, V> map;  

  17.       

  18.     public SimpleConcurrentMap(Map<K, V> map) {  

  19.         this.map = map;  

  20.         if (map == nullthrow new NullPointerException();  

  21.     }  

  22.   

  23.     public void clear() {  

  24.         w.lock();  

  25.         try {  

  26.             map.clear();  

  27.         } finally {  

  28.             w.unlock();  

  29.         }  

  30.     }  

  31.   

  32.     public boolean containsKey(Object key) {  

  33.         r.lock();  

  34.         try {  

  35.             return map.containsKey(key);  

  36.         } finally {  

  37.             r.unlock();  

  38.         }  

  39.     }  

  40.   

  41.     public boolean containsValue(Object value) {  

  42.         r.lock();  

  43.         try {  

  44.             return map.containsValue(value);  

  45.         } finally {  

  46.             r.unlock();  

  47.         }  

  48.     }  

  49.   

  50.     public Set<java.util.Map.Entry<K, V>> entrySet() {  

  51.         throw new UnsupportedOperationException();  

  52.     }  

  53.   

  54.     public V get(Object key) {  

  55.         r.lock();  

  56.         try {  

  57.             return map.get(key);  

  58.         } finally {  

  59.             r.unlock();  

  60.         }  

  61.     }  

  62.   

  63.     public boolean isEmpty() {  

  64.         r.lock();  

  65.         try {  

  66.             return map.isEmpty();  

  67.         } finally {  

  68.             r.unlock();  

  69.         }  

  70.     }  

  71.   

  72.     public Set<K> keySet() {  

  73.         r.lock();  

  74.         try {  

  75.             return new HashSet<K>(map.keySet());  

  76.         } finally {  

  77.             r.unlock();  

  78.         }  

  79.     }  

  80.   

  81.     public V put(K key, V value) {  

  82.         w.lock();  

  83.         try {  

  84.             return map.put(key, value);  

  85.         } finally {  

  86.             w.unlock();  

  87.         }  

  88.     }  

  89.   

  90.     public void putAll(Map<? extends K, ? extends V> m) {  

  91.         w.lock();  

  92.         try {  

  93.             map.putAll(m);  

  94.         } finally {  

  95.             w.unlock();  

  96.         }  

  97.     }  

  98.   

  99.     public V remove(Object key) {  

  100.         w.lock();  

  101.         try {  

  102.             return map.remove(key);  

  103.         } finally {  

  104.             w.unlock();  

  105.         }  

  106.     }  

  107.   

  108.     public int size() {  

  109.         r.lock();  

  110.         try {  

  111.             return map.size();  

  112.         } finally {  

  113.             r.unlock();  

  114.         }  

  115.     }  

  116.   

  117.     public Collection<V> values() {  

  118.         r.lock();  

  119.         try {  

  120.             return new ArrayList<V>(map.values());  

  121.         } finally {  

  122.             r.unlock();  

  123.         }  

  124.     }  

  125.   

  126. }  


缓存对象CacheEntity.java为:


  1. package com.cttc.cache.entity;  

  2.   

  3. import java.io.Serializable;  

  4.   

  5. public class CacheEntity implements Serializable{  

  6.     private static final long serialVersionUID = -3971709196436977492L;  

  7.     private final int DEFUALT_VALIDITY_TIME = 20;//默认过期时间 20秒  

  8.       

  9.     private String cacheKey;  

  10.     private Object cacheContext;  

  11.     private int validityTime;//有效期时长,单位:秒  

  12.     private long timeoutStamp;//过期时间戳  

  13.       

  14.     private CacheEntity(){  

  15.         this.timeoutStamp = System.currentTimeMillis() + DEFUALT_VALIDITY_TIME * 1000;  

  16.         this.validityTime = DEFUALT_VALIDITY_TIME;  

  17.     }  

  18.       

  19.     public CacheEntity(String cacheKey, Object cacheContext){  

  20.         this();  

  21.         this.cacheKey = cacheKey;  

  22.         this.cacheContext = cacheContext;  

  23.     }  

  24.       

  25.     public CacheEntity(String cacheKey, Object cacheContext, long timeoutStamp){  

  26.         this(cacheKey, cacheContext);  

  27.         this.timeoutStamp = timeoutStamp;  

  28.     }  

  29.       

  30.     public CacheEntity(String cacheKey, Object cacheContext, int validityTime){  

  31.         this(cacheKey, cacheContext);  

  32.         this.validityTime = validityTime;  

  33.         this.timeoutStamp = System.currentTimeMillis() + validityTime * 1000;  

  34.     }  

  35.   

  36.     public String getCacheKey() {  

  37.         return cacheKey;  

  38.     }  

  39.     public void setCacheKey(String cacheKey) {  

  40.         this.cacheKey = cacheKey;  

  41.     }  

  42.     public Object getCacheContext() {  

  43.         return cacheContext;  

  44.     }  

  45.     public void setCacheContext(Object cacheContext) {  

  46.         this.cacheContext = cacheContext;  

  47.     }  

  48.     public long getTimeoutStamp() {  

  49.         return timeoutStamp;  

  50.     }  

  51.     public void setTimeoutStamp(long timeoutStamp) {  

  52.         this.timeoutStamp = timeoutStamp;  

  53.     }  

  54.     public int getValidityTime() {  

  55.         return validityTime;  

  56.     }  

  57.     public void setValidityTime(int validityTime) {  

  58.         this.validityTime = validityTime;  

  59.     }  

  60. }  


List缓存处理对象:

[java] view plaincopyprint?

  1. package com.cttc.cache.handler;  

  2.   

  3. import java.util.ArrayList;  

  4. import java.util.HashMap;  

  5. import java.util.List;  

  6.   

  7. import com.cttc.cache.entity.CacheEntity;  

  8. import com.cttc.cache.entity.SimpleConcurrentMap;  

  9. public class CacheListHandler {  

  10.     private static final long SECOND_TIME = 1000;  

  11.     private static final SimpleConcurrentMap<String, CacheEntity> map;  

  12.     private static final List<CacheEntity> tempList;  

  13.       

  14.     static{  

  15.         tempList = new ArrayList<CacheEntity>();  

  16.         map = new SimpleConcurrentMap<String, CacheEntity>(new HashMap<String, CacheEntity>(1<<18));  

  17.         new Thread(new TimeoutTimerThread()).start();  

  18.     }  

  19.               

  20.     /** 

  21.      * 增加缓存对象 

  22.      * @param key 

  23.      * @param ce 

  24.      */  

  25.     public static void addCache(String key, CacheEntity ce){  

  26.         addCache(key, ce, ce.getValidityTime());  

  27.     }  

  28.       

  29.     /** 

  30.      * 增加缓存对象 

  31.      * @param key 

  32.      * @param ce 

  33.      * @param validityTime 有效时间 

  34.      */  

  35.     public static synchronized void addCache(String key, CacheEntity ce, int validityTime){  

  36.         ce.setTimeoutStamp(System.currentTimeMillis() + validityTime * SECOND_TIME);  

  37.         map.put(key, ce);  

  38.         //添加到过期处理队列  

  39.         tempList.add(ce);  

  40.     }  

  41.       

  42.     /** 

  43.      * 获取缓存对象 

  44.      * @param key 

  45.      * @return 

  46.      */  

  47.     public static synchronized CacheEntity getCache(String key){  

  48.         return map.get(key);  

  49.     }  

  50.       

  51.     /** 

  52.      * 检查是否含有制定key的缓冲 

  53.      * @param key 

  54.      * @return 

  55.      */  

  56.     public static synchronized boolean isConcurrent(String key){  

  57.         return map.containsKey(key);  

  58.     }  

  59.       

  60.     /** 

  61.      * 删除缓存 

  62.      * @param key 

  63.      */  

  64.     public static synchronized void removeCache(String key){  

  65.         map.remove(key);  

  66.     }  

  67.       

  68.     /** 

  69.      * 获取缓存大小 

  70.      * @param key 

  71.      */  

  72.     public static int getCacheSize(){  

  73.         return map.size();  

  74.     }  

  75.       

  76.     /** 

  77.      * 清除全部缓存 

  78.      */  

  79.     public static synchronized void clearCache(){  

  80.         tempList.clear();  

  81.         map.clear();  

  82.         System.out.println("clear cache");  

  83.     }  

  84.       

  85.     static class TimeoutTimerThread implements Runnable {  

  86.         public void run(){  

  87.             while(true){  

  88.                 try {  

  89.                     checkTime();  

  90.                 } catch (Exception e) {  

  91.                     e.printStackTrace();  

  92.                 }  

  93.             }  

  94.         }  

  95.           

  96.         /** 

  97.          * 过期缓存的具体处理方法 

  98.          * @throws Exception 

  99.          */  

  100.         private void checkTime() throws Exception{    

  101.             //"开始处理过期 ";  

  102.             CacheEntity tce = null;  

  103.             long timoutTime = 1000L;  

  104.               

  105.             //" 过期队列大小 : "+tempList.size());  

  106.             if(1 > tempList.size()){  

  107.                 System.out.println("过期队列空,开始轮询");  

  108.                 timoutTime = 1000L;  

  109.                 Thread.sleep(timoutTime);  

  110.                 return;  

  111.             }  

  112.               

  113.             tce = tempList.get(0);  

  114.             timoutTime = tce.getTimeoutStamp() - System.currentTimeMillis();  

  115.             //" 过期时间 : "+timoutTime);  

  116.             if(0 < timoutTime){  

  117.                 //设定过期时间  

  118.                 Thread.sleep(timoutTime);  

  119.                 return;  

  120.             }  

  121.             System.out.print(" 清除过期缓存 : "+tce.getCacheKey());  

  122.             //清除过期缓存和删除对应的缓存队列  

  123.             tempList.remove(tce);  

  124.             removeCache(tce.getCacheKey());  

  125.         }  

  126.     }  

  127. }  


JAVA 实现自定义的缓存实现