⚡️ 性能加速器:利用 Redis 实现接口高性能缓存

大家好,我是大布布将军。

在后端世界,数据库是数据可靠性的保证,但它往往是整个系统的性能瓶颈。对于那些访问频率高、但数据变化不快的接口(例如首页推荐商品、配置信息、热门文章列表),我们不应该每次都去查询关系型数据库。

这时,缓存 就成了我们的第一道防线,而 Redis 是 Node.js 后端中最常用的缓存工具。

1. 为什么需要 Redis?------速度和特性

Redis 是一种内存型NoSQL 数据库,它将数据直接存储在内存中,因此读写速度极快,延迟通常在毫秒级。

特性 Redis (NoSQL 内存数据库) MySQL/PostgreSQL (关系型磁盘数据库) 适用场景
读写速度 极快(毫秒级) 较慢(涉及磁盘 I/O) 临时数据、高频读取、排行榜、会话。
持久化 可选(RDB/AOF) 必须 核心业务数据、需要事务保证的场景。
数据结构 丰富(String, Hash, List, Set, Sorted Set) 表结构 需要复杂关系关联的场景。

对于 BFF 服务来说,Redis 最主要的用途就是接口缓存会话存储

2. 核心应用:接口缓存的实现逻辑

缓存的核心逻辑被称为 Cache-Aside Pattern(旁路缓存) 。其流程如下:

  1. 读请求 :请求到达 Service 层,首先查询 Redis 缓存。
  2. 命中 :如果 Redis 中有数据(缓存命中 ),直接返回,不访问数据库
  3. 未命中 :如果 Redis 中没有数据(缓存未命中),则去访问关系型数据库。
  4. 回写 :从数据库读取数据后,在返回给 Controller 之前,同步 将数据写入 Redis,并设置一个过期时间 (TTL)
实践项目:缓存热门商品详情

我们来优化上一篇中的 /product/detail 接口。对于热门商品,我们希望缓存 30 分钟。

TypeScript

复制代码
// 📁 src/product/product.service.ts
import { Injectable } from '@nestjs/common';
import { RedisService } from 'nestjs-redis'; // 假设使用了 NestJS 的 Redis 模块
import { ProductDetailDTO } from '../interfaces';
import { DatabaseService } from './database.service'; // 假设这是操作数据库的服务

@Injectable()
export class ProductService {
    private readonly REDIS_CACHE_KEY = 'product:detail:';
    private readonly CACHE_TTL = 60 * 30; // 30 分钟过期

    constructor(
        private readonly redisService: RedisService,
        private readonly dbService: DatabaseService
    ) {}

    async getProductDetail(productId: number): Promise<ProductDetailDTO> {
        const cacheKey = this.REDIS_CACHE_KEY + productId;
        const redisClient = this.redisService.getClient();

        // 1. 尝试从缓存读取 (R)
        const cachedData = await redisClient.get(cacheKey);

        if (cachedData) {
            console.log(`[Cache Hit] 命中缓存: ${cacheKey}`);
            // 注意:从 Redis 取出的是字符串,需要 JSON.parse() 还原为对象
            return JSON.parse(cachedData); 
        }

        // 2. 缓存未命中,从数据库/核心服务读取 (D)
        console.log(`[Cache Miss] 缓存未命中,查询数据库/核心服务...`);
        // 假设这是一个耗时的数据库查询或远程 API 调用
        const productData = await this.dbService.fetchProductDetails(productId); 

        // 3. 将结果写入缓存并设置过期时间 (W)
        await redisClient.set(cacheKey, JSON.stringify(productData), 'EX', this.CACHE_TTL);
        
        return productData;
    }
}

3. Redis 的其他应用:限流和会话存储

除了接口缓存,Redis 的丰富数据结构让它在 Node.js 后端中还有重要作用:

  • 限流 (Rate Limiting) - 使用 String/ZSet:限制用户或 IP 地址在一定时间内对某个 API 的访问次数,防止被恶意攻击或爬虫。
  • 分布式锁 (Distributed Lock) - 使用 String:在高并发环境中,确保对库存扣减等关键操作,同一时间只有一个请求能执行。
  • 会话存储 (Session Store) - 使用 Hash:将用户登录状态和信息存储在 Redis 中,实现无状态的、可扩展的 Node.js 集群。

总结

Redis 是 Node.js 高性能服务的关键,特别是对于 I/O 密集型的 BFF 而言。通过掌握 Cache-Aside Pattern ,你就能有效减少对核心数据库的压力,将 API 响应速度提升一个数量级。

至此,我们已经掌握了数据在内存(Redis)磁盘(SQL) 上的存取方法。下一篇,我们将探讨后端安全性的基石------身份验证 ,学习如何使用 JWT (JSON Web Token) 来管理用户登录状态和权限。

相关推荐
Cobyte3 分钟前
4.响应式系统基础:从发布订阅模式的角度理解 Vue3 的数据响应式原理
前端·javascript·vue.js
Crazy CodeCrafter5 分钟前
现在做服装,实体和电商怎么选?
大数据·数据库·人工智能·微信·开源软件·零售
晓得迷路了6 分钟前
栗子前端技术周刊第 124 期 - ESLint v10.2.0、React Native 0.85、Node.js 25.9.0...
前端·javascript·eslint
一江寒逸15 分钟前
零基础从入门到精通MongoDB(下篇):进阶精通篇——吃透高级查询、事务、索引优化与集群架构,成为MongoDB实战高手
数据库·mongodb·架构
sa1002719 分钟前
一键获取淘宝天猫商品评论:API 接口实战与多语言实现教程
数据库·oracle
半个俗人22 分钟前
fiddler的基础使用
前端·测试工具·fiddler
a11177625 分钟前
变电站数字孪生大屏ThreeJS 开源项目
前端·信息可视化·开源·html
恋猫de小郭25 分钟前
AI 的公开测评得分都在作弊,就像泡面的封面,一切以实物为准
前端·人工智能·ai编程
huanmieyaoseng100327 分钟前
Linux安装达梦数据库DM8
linux·运维·数据库
禅思院27 分钟前
使用 VueUse 构建一个支持暂停/重置的 CountUp 组件
前端·vue.js·架构