caching - 自动过期字典
问题描述
我想要一个提供内存数据结构的库,以便我可以编写,例如:
cache.insert(key,value,expiry)
我可以用类似的东西检索值cache[key]
,除非它已经过了过期秒数。
可以做到?我应该使用什么库?
如果可能,首选 D 的库
解决方案
我不知道有任何图书馆这样做。另一方面,让某些东西工作起来并不是很多工作。这是我在十分钟内拼凑的东西:
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);
}
推荐阅读
- java - 如何修复错误:不兼容的类型:不存在类型变量 S 的实例,因此回调
- docker - Docker 包含直接打开到指定的 conda 环境
- css - Dropzone.css 图像预览具有白色背景的圆角
- amazon-elastic-beanstalk - 无法在 Elastic Beanstalk 中设置配置
- typescript - @typescript-eslint 中的任何标准方法可以将返回值转换为 'any' 而不会收到 'no-explicit-any' 警告?
- javascript - 如何在 Laravel 的帮助下将 HTML 表单输入中的值相加
- wordpress - WordPress + Gatsby 自定义休息路线未在 GraphQL 中显示
- python - 使用标量使用 tf.Data 加载图像 Tensorflow 会引发异常
- javascript - 如何循环浏览一组图片
- firebase - 为什么 dataSnapshot 在 ViewModel 中反序列化,而不是在扩展 LiveData 的类中?