Node-Cache 完全指南 | Node.js 内存缓存模块使用教程
Node-Cache 详解
Node-Cache 是一个简单的 Node.js 内存缓存模块,它提供了一种在内存中存储键值对的简单方法,类似于其他语言中的缓存库(如 Python 的 dict 或 Java 的 HashMap)。下面是对 Node-Cache 的详细解析。
安装
使用 npm 安装:
npm install node-cache --save
基本使用
const NodeCache = require("node-cache");
const myCache = new NodeCache();
// 设置缓存
myCache.set("key", "value");
// 获取缓存
let value = myCache.get("key");
console.log(value); // 输出: "value"
主要功能
1. 设置缓存
// 设置单个键值对
myCache.set("key", "value");
// 设置带TTL(生存时间)的键值对(单位:秒)
myCache.set("key", "value", 10); // 10秒后过期
// 设置多个键值对
myCache.mset([
{key: "key1", val: "val1"},
{key: "key2", val: "val2", ttl: 20} // 第二个键20秒后过期
]);
2. 获取缓存
// 获取单个值
let value = myCache.get("key");
// 获取多个值
let values = myCache.mget(["key1", "key2"]);
// 检查键是否存在
let exists = myCache.has("key");
3. 删除缓存
// 删除单个键
myCache.del("key");
// 删除多个键
myCache.del(["key1", "key2"]);
// 清空所有缓存
myCache.flushAll();
4. 统计信息
// 获取缓存统计信息
let stats = myCache.getStats();
// 获取所有键
let keys = myCache.keys();
5. TTL(生存时间)相关操作
// 获取键的剩余TTL(秒)
let ttl = myCache.getTtl("key");
// 设置新的TTL
myCache.ttl("key", 20); // 重置为20秒
// 删除键的TTL(永久存储)
myCache.ttl("key", 0); // 或 myCache.ttl("key", null);
高级功能
1. 回调函数
大多数方法都支持回调:
myCache.set("key", "value", function(err, success) {
if (!err && success) {
console.log("缓存设置成功");
}
});
2. 过期事件监听
可以监听缓存过期事件:
myCache.on("expired", function(key, value) {
console.log(`键 ${key} 已过期,值为: ${value}`);
});
3. 删除事件监听
可以监听缓存删除事件:
myCache.on("del", function(key, value) {
console.log(`键 ${key} 被删除,值为: ${value}`);
});
4. 克隆选项
创建缓存时可以设置克隆选项,确保存储的值不会被外部修改:
const myCache = new NodeCache({ stdTTL: 100, checkperiod: 120, useClones: false });
配置选项
创建 NodeCache 实例时可以传入配置对象:
const myCache = new NodeCache({
stdTTL: 60, // 默认TTL(秒),0表示无限
checkperiod: 600, // 定期检查过期缓存的时间间隔(秒)
useClones: true, // 是否克隆存储的值
deleteOnExpire: true // 是否自动删除过期键
});
使用场景
- API 响应缓存:缓存频繁请求的API响应
- 数据库查询结果缓存:减少数据库查询压力
- 会话存储:简单的会话管理
- 计算密集型结果缓存:存储耗时的计算结果
注意事项
- Node-Cache 是内存缓存,进程重启后数据会丢失
- 不适合存储大量数据,因为会占用内存
- 在多进程环境中,每个进程有自己的缓存实例,数据不共享
- 对于生产环境的高并发应用,可能需要考虑更强大的缓存解决方案如 Redis
示例:API 响应缓存
const express = require("express");
const NodeCache = require("node-cache");
const app = express();
const cache = new NodeCache({ stdTTL: 60 });
function getDataFromDB() {
// 模拟数据库查询
return new Promise(resolve => {
setTimeout(() => resolve({ data: "数据库数据", timestamp: Date.now() }), 1000);
});
}
app.get("/data", async (req, res) => {
const cacheKey = "dbData";
let data = cache.get(cacheKey);
if (data) {
console.log("从缓存获取数据");
return res.json({ ...data, source: "cache" });
}
console.log("从数据库获取数据");
data = await getDataFromDB();
cache.set(cacheKey, data);
res.json({ ...data, source: "database" });
});
app.listen(3000, () => console.log("Server running on port 3000"));
Node-Cache 是一个轻量级但功能强大的缓存解决方案,适合需要在 Node.js 应用中实现简单内存缓存的场景。