如何设计一个牛逼的本地缓存?
点击上方“码农突围”,马上关注
这里是码农充电第一站,回复“666”,获取一份专属大礼包 真爱,请设置“星标”或点个“在看
前言 考虑点 如何实现 总结
前言
考虑点
1.数据结构
2.对象上限
3.清除策略
4.过期时间
5.线程安全
6.简明的接口
7.是否持久化
8.阻塞机制
如何实现
1.数据结构
Map
2.对象上限
3.清除策略
4.过期时间
if (System.currentTimeMillis() - lastClear > clearInterval) {
clear();
}
5.线程安全
public synchronized void putObject(Object key, Object object) {
...省略...
}
@Override
public synchronized Object getObject(Object key) {
...省略...
}
6.简明的接口
public interface Cache {
String getId();
void putObject(Object key, Object value);
Object getObject(Object key);
Object removeObject(Object key);
void clear();
int getSize();
ReadWriteLock getReadWriteLock();
}
public interface Cache<K, V> {
V getIfPresent(@CompatibleWith("K") Object key);
V get(K key, Callable extends V> loader) throws ExecutionException;
ImmutableMapgetAllPresent(Iterable> keys) ;
void put(K key, V value);
void putAll(Map extends K, ? extends V> m);
void invalidate(@CompatibleWith("K") Object key);
void invalidateAll(Iterable> keys);
void invalidateAll();
long size();
CacheStats stats();
ConcurrentMapasMap() ;
void cleanUp();
}
7.是否持久化
diskPersistent="false" //是否持久化磁盘缓存
8.阻塞机制
public class Memoizerl<A, V> implements Computable<A, V> {
private final Map> cache = new ConcurrentHashMap>();
private final Computable c;
public Memoizerl(Computable c) {
this.c = c;
}
@Override
public V compute(A arg) throws InterruptedException, ExecutionException {
while (true) {
Futuref = cache.get(arg);
if (f == null) {
Callableeval = new Callable () {
@Override
public V call() throws Exception {
return c.compute(arg);
}
};
FutureTaskft = new FutureTask (eval);
f = cache.putIfAbsent(arg, ft);
if (f == null) {
f = ft;
ft.run();
}
try {
return f.get();
} catch (CancellationException e) {
cache.remove(arg, f);
}
}
}
}
}
总结
- END - 最近热文
• 清华大学:2021 元宇宙研究报告! • 996加班累到肺部切除,维权之路 • 这份工程师简历火了:手磨14nm咖啡,在微软传播性病,90%公司伸橄榄枝 • 致歉!抖音Semi Design承认参考阿里Ant Design
评论