一个对象,如果要缓存它,就要让它占着内存不能释放,如果要释放它,就不能持有它的访问句柄。那有没有办法又让它尽可能的被缓存,在内存紧张的时候又允许被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 }
|