TypeScript 中的缓存:Redis、Memcached 与内置方案——完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么需要在 TypeScript 中进行缓存?



现代 Web 应用需要高响应速度和最低的数据库负载。缓存是实现这一目标的最有效方法之一。在 TypeScript(和 Node.js)生态系统中,开发者可以使用三种主要方法:分布式系统(Redis、Memcached)和内置方案(内存缓存)。在本文中,我们将逐一分析每种方法,提供 TypeScript 实践示例,并帮助您为项目选择最佳方案。



缓存允许将频繁请求的数据存储在快速存储中,避免重复执行昂贵的操作(数据库查询、计算、外部 API 调用)。正确的缓存策略可以将服务器响应时间缩短 10-100 倍。



1. TypeScript 中的内置缓存(内存缓存)



最简单的方法是将数据直接存储在 Node.js 进程的内存中。这不需要外部服务,非常适合小型应用或原型。



1.1. 使用 Map 和 WeakMap



JavaScript 内置集合是简单缓存的绝佳基础。以下是带有 TTL(生存时间)的实现示例:



type CacheEntry<T> = {  value: T;  expiresAt: number;};

class SimpleCache<T> { private store = new Map<string, CacheEntry<T>>();

set(key: string, value: T, ttlMs: number = 60000): void { this.store.set(key, { value, expiresAt: Date.now() + ttlMs, }); }

get(key: string): T | undefined { const entry = this.store.get(key); if (!entry) return undefined; if (Date.now() > entry.expiresAt) { this.store.delete(key); return undefined; } return entry.value; }

delete(key: string): boolean { return this.store.delete(key); }

clear(): void { this.store.clear(); }}

// 使用示例const userCache = new SimpleCache<object>();userCache.set('user:1', { name: '阿列克谢' }, 30000); // TTL 30 秒console.log(userCache.get('user:1'));


1.2. node-cache 库



对于生产级解决方案,最好使用经过验证的 node-cache 库。它提供了高级功能:自动清理、统计和事件。



import NodeCache from 'node-cache';

const myCache = new NodeCache({ stdTTL: 100, checkperiod: 120 });

// 保存对象const success = myCache.set('myKey', { data: 'value' });if (success) console.log('缓存已保存');

// 读取const value = myCache.get('myKey');console.log(value); // { data: 'value' }

// 获取统计信息const stats = myCache.getStats();console.log(`命中: ${stats.hits}, 未命中: ${stats.misses}`);


优点:简单、零网络延迟、无需安装服务。
缺点:应用重启后缓存丢失,不适用于分布式系统。



2. 在 TypeScript 中使用 Redis 进行缓存



Redis 是生产环境中用于缓存的最流行解决方案。它作为独立服务器运行,支持复杂的数据结构,并且对应用重启具有弹性。



2.1. 连接 ioredis



ioredis 库是从 TypeScript 使用 Redis 的事实标准。它支持集群、发布/订阅和管道。



import Redis from 'ioredis';

const redis = new Redis({ host: 'localhost', port: 6379, retryStrategy: (times) => Math.min(times * 50, 2000),});

// 检查连接redis.on('connect', () => console.log('已连接到 Redis'));redis.on('error', (err) => console.error('Redis 错误:', err));


2.2. 带 TTL 的缓存示例



async function getCachedData(key: string): Promise<string | null> {  const cached = await redis.get(key);  if (cached) {    console.log('数据来自                

博客

书籍推荐