首页 > 解决方案 > 自动过期字典

问题描述

我想要一个提供内存数据结构的库,以便我可以编写,例如:

cache.insert(key,value,expiry)

我可以用类似的东西检索值cache[key],除非它已经过了过期秒数。

可以做到?我应该使用什么库?

如果可能,首选 D 的库

标签: cachingd

解决方案


我不知道有任何图书馆这样做。另一方面,让某些东西工作起来并不是很多工作。这是我在十分钟内拼凑的东西:

struct Dict(K, V, E)
if (isExpiry!E)
{
    import std.typecons : Tuple;
private:
    Tuple!(V, "value", E, "expiry")[K] _payload;
public:
    V opIndex(K key)
    {
        return *(key in this);
    }

    V* opBinaryRight(string op : "in")(K key)
    {
        auto p = key in _payload;
        if (!p || p.expiry.expired) return null;
        return &p.value;
    }

    void insert(K key, V value, E expiry)
    {
        expiry.initialize();
        _payload[key] = typeof(_payload[key])(value, expiry);
    }

    void remove(K key)
    {
        _payload.remove(key);
    }
}

enum isExpiry(T) = is(typeof((T t){
        t.initialize();
        if (t.expired) {}
    }));
static assert(!isExpiry!int);

struct Timeout
{
    import core.time;
    Duration duration;
    MonoTime start;

    void initialize() {
        start = MonoTime.currTime;
    }

    @property
    bool expired()
    {
        auto elapsed = MonoTime.currTime - start;
        return elapsed > duration;
    }
}
static assert(isExpiry!Timeout);

unittest
{
    import core.time;
    import core.thread;
    Dict!(int, string, Timeout) a;
    assert(3 !in a);
    a.insert(3, "a", Timeout(100.dur!"msecs"));
    a.insert(4, "b", Timeout(10.dur!"days"));
    assert(3 in a);
    assert(4 in a);
    Thread.sleep(200.dur!"msecs");
    assert(3 !in a);
    assert(4 in a);
    a.remove(4);
    assert(4 !in a);
}

推荐阅读