闭包实现内存缓存数据库,通过私有store对象封装数据,暴露set/get/has/delete/clear/size等api;支持ttl过期、前缀分组、批量操作,适用于轻量单实例场景。

用闭包实现一个简单的内存缓存数据库,核心是利用函数作用域“私有化”数据,同时暴露增删查改的接口,避免全局污染,还能自动管理生命周期。
基础结构:闭包封装数据存储
把缓存数据(比如一个对象)定义在外部函数内部,不对外暴露原始引用;所有操作都通过返回的 API 对象进行:
function createCacheDB() {
const store = {}; // 私有缓存对象,外部无法直接访问
return {
set(key, value) {
store[key] = value;
},
get(key) {
return store[key];
},
has(key) {
return key in store;
},
delete(key) {
return delete store[key];
},
clear() {
Object.keys(store).forEach(key => delete store[key]);
},
size() {
return Object.keys(store).length;
}
};
}
// 使用
const db = createCacheDB();
db.set('user:123', { id: 123, name: 'Alice' });
console.log(db.get('user:123')); // { id: 123, name: 'Alice' }
增强功能:支持过期时间(TTL)
加一层时间控制,让缓存自动失效。每次 set 时记录写入时间,get 时检查是否超时:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function createTTLCacheDB(defaultTTL = 60000) {
const store = {};
return {
set(key, value, ttl = defaultTTL) {
store[key] = {
value,
expiresAt: Date.now() + ttl
};
},
get(key) {
const item = store[key];
if (!item) return undefined;
if (Date.now() > item.expiresAt) {
delete store[key];
return undefined;
}
return item.value;
},
has(key) {
const item = store[key];
if (!item) return false;
if (Date.now() > item.expiresAt) {
delete store[key];
return false;
}
return true;
},
delete(key) {
return delete store[key];
},
clear() {
Object.keys(store).forEach(key => delete store[key]);
}
};
}
实用技巧:支持批量操作和键名前缀
实际使用中常需要按业务分组(如 user:、post:),可加 prefix 过滤或批量清理:
- 在 set/get 时自动拼接前缀(如
set('123', data, 'user')→ 存为'user:123') - 提供 keys(prefix) 返回匹配的所有键名
- 提供 clearByPrefix(prefix) 清除某类缓存
注意事项与边界处理
闭包缓存适合轻量、短期、单实例场景,要注意:
- 不适用于多线程/多 Worker 环境(每个闭包实例数据隔离)
- 大量数据可能引发内存泄漏,建议配合 maxSize 和 LRU 策略(可引入 Map + 链表或用第三方库如
lru-cache) - value 是对象或数组时,get 返回的是原引用,修改会影响缓存内容——如需深拷贝,可在 get 内用
structuredClone(现代环境)或 JSON 序列化(简单结构)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










