如何在简单的Java Web代理中实现内部DNS缓存?

丹尼尔·科比(Daniel Kobe)

我的目标是在代理中实现内部DNS缓存:基本上是保存我的DNS解析度以备将来使用,在需要该解析度之前,请检查缓存中是否具有所需的解析度。为简单起见,我忽略了TTL,而是使用了长达30秒的默认值。我将如何做这样的事情,即使指向正确方向的指针也将不胜感激?我的Java网络代理看起来与http://www.jtmelton.com/2007/11/27/a-simple-multi-threaded-java-http-proxy-server/中的示例非常相似

丹尼尔·科比(Daniel Kobe)

这是我为解决这个问题而写的两节课

DnsCache

import java.net.InetAddress;

/**
 * Singleton class that holds the ExpiringMap used for DNS Cache
 */
public class DnsCache {
    private static ExpiringMap<String, InetAddress> theDnsCache = null;

    public static ExpiringMap<String, InetAddress> getInstance() {
        if (theDnsCache == null) {
            theDnsCache = new ExpiringMap<String, InetAddress>();
        }
        return theDnsCache;
    }
}

过期地图

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

/**
 * A HashMap that removes objects after the set TTL
 */
public class ExpiringMap<K, V> implements Map<K, V> {
    private final int DEFAULT_TTL = 30;
    private final HashMap<K, ScheduledFuture<K>> cacheKeys = new HashMap<K, ScheduledFuture<K>>();
    private final HashMap<K, V> theHash = new HashMap<K, V>();
    private ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();

    @Override
    public int size() {
        // TODO Auto-generated method stub
        return theHash.size();
    }

    @Override
    public boolean isEmpty() {
        return theHash.isEmpty();
    }

    @Override
    public boolean containsKey(Object key) {
        return theHash.containsKey(key);
    }

    @Override
    public boolean containsValue(Object value) {
        return theHash.containsValue(value);
    }

    /**
     * If retrieving an object that already exists in the cache 
     * we must resets the TTL timer on that item.
     */
    @SuppressWarnings("unchecked")
    @Override
    public V get(final Object key) {
        // If item exists in cache, then we cancel and reset the timer on that item
        if(cacheKeys.containsKey(key) && cacheKeys.get(key).cancel(false)) {
            ScheduledFuture<K> task = executorService.schedule(new Callable<K>() {
                @Override
                public K call() {
                    cacheKeys.remove(key);
                    theHash.remove(key);
                    return (K) key;
                }
            }, DEFAULT_TTL, TimeUnit.SECONDS);
            cacheKeys.put((K) key, task);
        }
        return theHash.get(key);
    }

    /**
     * When we add an item to cache we add the key to a map that contains FutureScheduled 
     * events that will remove the item after TTL
     */
    @Override
    public V put(final K key, V value) {
        ScheduledFuture<K> task = executorService.schedule(new Callable<K>() {
            @Override
            public K call() {
                cacheKeys.remove(key);
                theHash.remove(key);
                return key;
            }
        }, DEFAULT_TTL, TimeUnit.SECONDS);
        cacheKeys.put(key, task);
        return theHash.put(key, value);
    }

    @Override
    public V remove(Object key) {
        cacheKeys.remove(key);
        return theHash.remove(key);
    }

    @Override
    public void putAll(Map<? extends K, ? extends V> m) {
        // TODO implement

    }

    @Override
    public void clear() {
        cacheKeys.clear();
        theHash.clear();
    }

    @Override
    public Set<K> keySet() {
        return theHash.keySet();
    }

    @Override
    public Collection<V> values() {
        return theHash.values();
    }

    @Override
    public Set<java.util.Map.Entry<K, V>> entrySet() {
        return theHash.entrySet();
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java中的简单Web代理

来自分类Dev

如何在JAVA中的简单FPS中使用游戏状态

来自分类Dev

如何在JAVA中的简单FPS中使用游戏状态

来自分类Dev

如何在Java中简单地获取输入到数组?

来自分类Dev

如何在Android中实现简单的TableLayout?

来自分类Dev

如何在rebus中实现简单回复

来自分类Dev

如何在rebus中实现简单回复

来自分类Dev

如何在此简单的Java日志记录实现中附加到日志文件?

来自分类Dev

如何在此简单的Java日志记录实现中附加到日志文件?

来自分类Dev

如何在Redis上并发实现简单缓存?

来自分类Dev

我们如何在Java中实现方法缓存

来自分类Dev

如何在Vala的libsoup中缓存DNS?

来自分类Dev

如何在OSX中查看DNS缓存?

来自分类Dev

如何在Vala的libsoup中缓存DNS?

来自分类Dev

如何在简单的自动完成中缓存结果

来自分类Dev

如何在一个简单的Java Web项目上运行声纳?

来自分类Dev

如何在Java中创建简单的4x3二维数组?

来自分类Dev

如何在JAVA中修复此简单程序?猜谜游戏

来自分类Dev

如何在Java(Android)中解析简单的Json响应(多个字符串)?

来自分类Dev

如何在java中读取一个简单的播放列表

来自分类Dev

如何在 Java Swing 中拥有不会不断变化/闪烁颜色的简单动画形状?

来自分类Dev

如何在CPU中实现LRU缓存?

来自分类Dev

如何在CPU中实现LRU缓存?

来自分类Dev

内部HashMap工作:如何在Java中实现hashCode

来自分类Dev

内部HashMap工作:如何在Java中实现hashCode

来自分类Dev

如何在Scala中优雅地实现此简单算法

来自分类Dev

如何在Node.js中实现简单的音频播放?

来自分类Dev

如何在Django REST Framework中实现简单的“喜欢”功能?

来自分类Dev

如何在简单的恢复模型中实现灾难恢复(DR)

Related 相关文章

  1. 1

    Java中的简单Web代理

  2. 2

    如何在JAVA中的简单FPS中使用游戏状态

  3. 3

    如何在JAVA中的简单FPS中使用游戏状态

  4. 4

    如何在Java中简单地获取输入到数组?

  5. 5

    如何在Android中实现简单的TableLayout?

  6. 6

    如何在rebus中实现简单回复

  7. 7

    如何在rebus中实现简单回复

  8. 8

    如何在此简单的Java日志记录实现中附加到日志文件?

  9. 9

    如何在此简单的Java日志记录实现中附加到日志文件?

  10. 10

    如何在Redis上并发实现简单缓存?

  11. 11

    我们如何在Java中实现方法缓存

  12. 12

    如何在Vala的libsoup中缓存DNS?

  13. 13

    如何在OSX中查看DNS缓存?

  14. 14

    如何在Vala的libsoup中缓存DNS?

  15. 15

    如何在简单的自动完成中缓存结果

  16. 16

    如何在一个简单的Java Web项目上运行声纳?

  17. 17

    如何在Java中创建简单的4x3二维数组?

  18. 18

    如何在JAVA中修复此简单程序?猜谜游戏

  19. 19

    如何在Java(Android)中解析简单的Json响应(多个字符串)?

  20. 20

    如何在java中读取一个简单的播放列表

  21. 21

    如何在 Java Swing 中拥有不会不断变化/闪烁颜色的简单动画形状?

  22. 22

    如何在CPU中实现LRU缓存?

  23. 23

    如何在CPU中实现LRU缓存?

  24. 24

    内部HashMap工作:如何在Java中实现hashCode

  25. 25

    内部HashMap工作:如何在Java中实现hashCode

  26. 26

    如何在Scala中优雅地实现此简单算法

  27. 27

    如何在Node.js中实现简单的音频播放?

  28. 28

    如何在Django REST Framework中实现简单的“喜欢”功能?

  29. 29

    如何在简单的恢复模型中实现灾难恢复(DR)

热门标签

归档