JS实现弱缓存

一个对象,如果要缓存它,就要让它占着内存不能释放,如果要释放它,就不能持有它的访问句柄。那有没有办法又让它尽可能的被缓存,在内存紧张的时候又允许被GC回收呢?答案是弱缓存。

写一个node的服务,压测的时候有一个请求没有缓存导致IO太高,直接加缓存的话又担心内存占用太大挤爆了。写一个检测系统内存情况的缓存管理模块又有点太麻烦了。能不能有一个内存充足的时候就缓存,在内存不够需要垃圾回收的时候就自动回收掉呢?在阮一峰那里看到ES2021支持弱引用了,因此现在在版本比较高的node上也可以用弱引用很方便的实现一个弱缓存了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const weakCache = new Map();//弱缓存,当占用内存太多的时候系统会自动回收
function setWeakCache(key,value){
if("function"==typeof WeakRef){
if(typeof value == "object" && !!value)
weakCache.set(key, new WeakRef(value));
}else{
console.log("js版本太旧不支持弱引用")
}
}
function getWeakCache(key){
if(weakCache.has(key)){
let value = weakCache.get(key).deref();
if(!value) weakCache.delete(key);
return value
}
return
}