MemCache
![Latest Version]

usage
- cache
```rust
use mem_cache::{Cache};
let mut i32cache = Cache::::new();
// expiresinsecs: 0 -> expires immediate
let v1 = i32cache.fetch("v1", 10, || 1);
assert_eq!(v1, &1);
let mut stringcache = Cache::::new();
let v1 = stringcache.fetch("v1", 10, || "1".tostring());
asserteq!(v1, "1");
```
- async cache
```rust
use mem_cache::{AsyncCache};
let mut i32cache = AsyncCache::::new();
// expiresinsecs: 0 -> expires immediate
let v1 = i32cache.fetch("v1", 10, || Box::pin(async {
Ok(1)
})).await?;
assert_eq!(v1, &1);
let mut stringcache = AsyncCache::::new();
let v1 = stringcache.fetch("v1", 10, || Box::pin(async {
Ok("1".tostring())
})).await?;
asserteq!(v1, "1");
```
methods
[async] fetch(key, value, closure)
return cache value if not expires or recalculate closure value
[async] force_fetch(key, value, closure)
force recalculate closure value
[async] read(key)
return key cache value if cache exists
write(key, value)
overwrite cache value and expiration time if cache exists
expire(key)
make cache value expired if cache exists
delete(key)
remove cache if cache exists