快速入门:将 Azure Cache for Redis 与 Node.js 应用配合使用

在本快速入门中,你会将 Azure Cache for Redis 合并到 Node.js 应用中,以便能够访问 Azure 中的任何应用程序都可访问的安全专用缓存。

先决条件

创建缓存

  1. 若要创建缓存,请登录到 Azure 门户并选择“创建资源”

    左侧导航窗格中突出显示了“创建资源”。

  2. 在“入门”页上的搜索框中键入“Azure Cache for Redis”。 然后选择创建

    Azure 市场的屏幕截图,其中的搜索框中包含“Azure Cache for Redis”,并用红色框突出显示了“创建”。

  3. 在“新建 Redis 缓存”页上配置缓存的设置。

    设置 选择值 说明
    订阅 单击下拉箭头并选择你的订阅。 要在其下创建此新的 Azure Cache for Redis 实例的订阅。
    资源组 单击下拉箭头并选择一个资源组,或者选择新建并输入新的资源组名称。 要在其中创建缓存和其他资源的资源组的名称。 将所有应用资源放入一个资源组可以轻松地统一管理或删除这些资源。
    DNS 名称 输入唯一名称。 缓存名称必须是包含 1 到 63 个字符的字符串,只能包含数字、字母或连字符。 该名称必须以数字或字母开头和结尾,且不能包含连续的连字符。 缓存实例的主机名<DNS name>.redis.cache.chinacloudapi.cn
    位置 单击下拉箭头并选择一个位置。 选择使用缓存的其他服务附近的区域
    缓存 SKU 打开下拉列表并选择一个 SKU 此 SKU 决定可用于缓存的大小、性能和功能参数。 有关详细信息,请参阅用于 Redis 的 Azure 缓存概述
    缓存大小 打开下拉列表并选择缓存的大小 有关详细信息,请参阅用于 Redis 的 Azure 缓存概述
  4. 选择网络选项卡,或选择网络按钮(位于页面底部) 。

  5. 网络选项卡中,选择你的连接方法。

  6. 选择“下一步: 高级”选项卡,或选择页面底部的“下一步: 高级”按钮,以查看“高级”选项卡。

    显示工作窗格中的“高级”选项卡和可供选择选项的屏幕截图。

    • 对于“基本”或“标准”缓存,请切换非 TLS 端口的选项。 还可以选择是否要启用“Microsoft Entra 身份验证”。
    • 对于“高级”缓存,请配置非 TLS 端口、群集、托管标识和数据持久性的设置。 还可以选择是否要启用“Microsoft Entra 身份验证”。
  7. 选择下一步: 标记选项卡,或选择页面底部的下一步: 标记按钮 。

  8. 或者,在标记选项卡中,如果希望对资源分类,请输入名称或值。

  9. 选择查看 + 创建。 随后你会转到“查看 + 创建”选项卡,Azure 将在此处验证配置。

  10. 显示绿色的“已通过验证”消息后,选择创建

创建缓存需要一段时间。 可以在 Azure Cache for Redis 的概述页上监视进度。 如果状态显示为正在运行,则表示该缓存可供使用。

安装 node-redis 客户端库

node-redis 库是 Redis 的主要 Node.js 客户端。 你可以使用 npm 和以下命令来安装客户端:

npm install redis

创建 Node.js 应用以访问缓存

创建一个 Node.js 应用,该应用使用 Microsoft Entra ID 或访问密钥连接到 Azure Cache for Redis。 建议使用 Microsoft Entra ID。

在缓存上启用 Microsoft Entra ID 身份验证

对于现有的缓存,首先请检查是否启用了 Microsoft Entra 身份验证。 如果未启用,请完成以下步骤来启用 Microsoft Entra 身份验证。 建议在应用程序中使用 Microsoft Entra ID 进行身份验证。

  1. 在 Azure 门户中,选择你想要使用基于 Microsoft Entra 令牌的身份验证的 Azure Cache for Redis 实例。

  2. 在服务菜单中的“设置”下,选择“身份验证”

  3. 在“身份验证”窗格中,检查是否选中了“启用 Microsoft Entra 身份验证”复选框。 如果是,你可以转到下一部分。

  4. 否则,请选中“启用 Microsoft Entra 身份验证”复选框。 然后输入有效用户的名称。 选择“保存”。 将为输入的用户名自动分配数据所有者访问策略。

    你还可以输入托管标识或服务主体来连接缓存。

    屏幕截图显示在服务菜单中选择了“身份验证”,并且选中了“启用 Microsoft Entra 身份验证”复选框。

  5. 在对话框中,系统会询问你是否要更新配置,并告知更新需要几分钟才能完成。 选择

    重要

    启用操作完成后,缓存中的节点将重新启动以加载新配置。 建议在标准维护时段或高峰营业时间之外完成此操作。 此过程最多可能需要 30 分钟。

有关将 Microsoft Entra ID 与 Azure CLI 配合使用的信息,请参阅标识参考页面

安装适用于 JavaScript 的 Azure 标识客户端库

适用于 JavaScript 的 Azure 标识客户端库使用所需的 Microsoft 身份验证库 (MSAL) 来提供令牌身份验证支持。 使用 npm 安装该库:

npm install @azure/identity

使用 Microsoft Entra ID 创建 Node.js 应用

  1. 为主机名和服务主体 ID 添加环境变量。

    服务主体 ID 是 Microsoft Entra ID 服务主体或用户的对象 ID。 在 Azure 门户中,此值显示为“用户名”

    set AZURE_CACHE_FOR_REDIS_HOST_NAME=contosoCache
    set REDIS_SERVICE_PRINCIPAL_ID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    
  2. 创建名为 redistest.js 的脚本文件

  3. 将下面的示例 JavaScript 添加到文件。 此代码演示了如何使用缓存主机名和密钥环境变量连接到 Azure Cache for Redis 实例。 此代码还在缓存中存储和检索字符串值。 还执行了 PINGCLIENT LIST 命令。 有关将 Redis 与 node-redis 客户端一起使用的更多示例,请参阅 Node-Redis

    const { createClient } = require("redis");
    const { DefaultAzureCredential } = require("@azure/identity");
    
    async function main() {
      // Construct a Token Credential from Identity library, e.g. ClientSecretCredential / ClientCertificateCredential / ManagedIdentityCredential, etc.
      const credential = new DefaultAzureCredential();
      const redisScope = "https://redis.azure.com/.default";
    
      // Fetch a Microsoft Entra token to be used for authentication. This token will be used as the password.
      let accessToken = await credential.getToken(redisScope);
      console.log("access Token", accessToken);
    
      // Create redis client and connect to the Azure Cache for Redis over the TLS port using the access token as password.
      const cacheConnection = createClient({
        username: process.env.REDIS_SERVICE_PRINCIPAL_ID,
        password: accessToken.token,
        url: `redis://${process.env.AZURE_CACHE_FOR_REDIS_HOST_NAME}:6380`,
        pingInterval: 100000,
        socket: { 
          tls: true,
          keepAlive: 0 
        },
      });
    
      cacheConnection.on("error", (err) => console.log("Redis Client Error", err));
      await cacheConnection.connect();
    
      // PING command
      console.log("\nCache command: PING");
      console.log("Cache response : " + await cacheConnection.ping());
    
      // SET
      console.log("\nCache command: SET Message");
      console.log("Cache response : " + await cacheConnection.set("Message",
          "Hello! The cache is working from Node.js!"));
    
      // GET
      console.log("\nCache command: GET Message");
      console.log("Cache response : " + await cacheConnection.get("Message"));
    
      // Client list, useful to see if connection list is growing...
      console.log("\nCache command: CLIENT LIST");
      console.log("Cache response : " + await cacheConnection.sendCommand(["CLIENT", "LIST"]));
    
      cacheConnection.disconnect();
    
      return "Done"
    }
    
    main().then((result) => console.log(result)).catch(ex => console.log(ex));
    
  4. 使用 Node.js 运行脚本:

    node redistest.js
    
  5. 验证代码的输出如以下示例所示:

    Cache command: PING
    Cache response : PONG
    
    Cache command: GET Message
    Cache response : Hello! The cache is working from Node.js!
    
    Cache command: SET Message
    Cache response : OK
    
    Cache command: GET Message
    Cache response : Hello! The cache is working from Node.js!
    
    Cache command: CLIENT LIST
    Cache response : id=10017364 addr=76.22.73.183:59380 fd=221 name= age=1 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 argv-mem=10 obl=0 oll=0 omem=0 tot-mem=61466 ow=0 owmem=0 events=r cmd=client user=default numops=6
    
    Done
    

创建具有重新身份验证的示例 JavaScript 应用

Microsoft Entra ID 访问令牌的有效期大约为 75 分钟。 若要保持与缓存的连接,必须刷新该令牌。

此示例演示如何使用 JavaScript 刷新令牌:

  1. 创建名为 redistestreauth.js 的脚本文件。

  2. 将下面的示例 JavaScript 添加到文件:

     const { createClient } = require("redis");
     const { DefaultAzureCredential } = require("@azure/identity");
    
     async function returnPassword(credential) {
         const redisScope = "https://redis.azure.com/.default";
    
         // Fetch a Microsoft Entra token to be used for authentication. This token will be used as the password.
         return credential.getToken(redisScope);
     }
    
     async function main() {
       // Construct a Token Credential from Identity library, e.g. ClientSecretCredential / ClientCertificateCredential / ManagedIdentityCredential, etc.
       const credential = new DefaultAzureCredential();
       let accessToken = await returnPassword(credential);
    
       // Create redis client and connect to the Azure Cache for Redis over the TLS port using the access token as password.
       let cacheConnection = createClient({
         username: process.env.REDIS_SERVICE_PRINCIPAL_ID,
         password: accessToken.token,
         url: `redis://${process.env.AZURE_CACHE_FOR_REDIS_HOST_NAME}:6380`,
         pingInterval: 100000,
         socket: { 
           tls: true,
           keepAlive: 0 
         },
       });
    
       cacheConnection.on("error", (err) => console.log("Redis Client Error", err));
       await cacheConnection.connect();
    
       for (let i = 0; i < 3; i++) {
         try {
             // PING command
             console.log("\nCache command: PING");
             console.log("Cache response : " + await cacheConnection.ping());
    
             // SET
             console.log("\nCache command: SET Message");
             console.log("Cache response : " + await cacheConnection.set("Message",
                 "Hello! The cache is working from Node.js!"));
    
             // GET
             console.log("\nCache command: GET Message");
             console.log("Cache response : " + await cacheConnection.get("Message"));
    
             // Client list, useful to see if connection list is growing...
             console.log("\nCache command: CLIENT LIST");
             console.log("Cache response : " + await cacheConnection.sendCommand(["CLIENT", "LIST"]));
           break;
         } catch (e) {
           console.log("error during redis get", e.toString());
           if ((accessToken.expiresOnTimestamp <= Date.now())|| (redis.status === "end" || "close") ) {
             await redis.disconnect();
             accessToken = await returnPassword(credential);
             cacheConnection = createClient({
               username: process.env.REDIS_SERVICE_PRINCIPAL_ID,
               password: accessToken.token,
               url: `redis://${process.env.AZURE_CACHE_FOR_REDIS_HOST_NAME}:6380`,
               pingInterval: 100000,
               socket: {
                 tls: true,
                 keepAlive: 0
               },
             });
           }
         }
       }
     }
    
     main().then((result) => console.log(result)).catch(ex => console.log(ex));
    
  3. 使用 Node.js 运行脚本:

    node redistestreauth.js
    
  4. 检查输出是否如以下示例所示:

     Cache command: PING
     Cache response : PONG
    
     Cache command: GET Message
     Cache response : Hello! The cache is working from Node.js!
    
     Cache command: SET Message
     Cache response : OK
    
     Cache command: GET Message
     Cache response : Hello! The cache is working from Node.js!
    
     Cache command: CLIENT LIST
     Cache response : id=10017364 addr=76.22.73.183:59380 fd=221 name= age=1 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 argv-mem=10 obl=0 oll=0 omem=0 tot-mem=61466 ow=0 owmem=0 events=r cmd=client user=default numops=6
    
    

注意

有关如何使用 Microsoft Entra ID 通过 node-redis 库向 Redis 进行身份验证的更多示例,请参阅 node-redis GitHub 存储库

清理资源

要继续使用在本文中创建的资源,请保留资源组。

否则,为了避免与资源相关的费用,若已用完资源,可以删除已创建的 Azure 资源组。

警告

删除资源组的操作不可逆。 删除一个资源组时,该资源组中的所有资源都会被永久删除。 请确保不会意外删除错误的资源组或资源。 如果在现有资源组内创建了资源,并且该资源组中还有想要保留的资源,可以逐个删除这些资源,而不是删除资源组。

删除资源组

  1. 登录到 Azure 门户,然后选择“资源组”。

  2. 选择要删除的资源组。

    如果有多个资源组,请在“筛选任何字段”中,输入为完成本文创建的资源组的名称。 在搜索结果列表中,选择该资源组。

    屏幕截图显示了可从中选择要删除的资源组列表。

  3. 选择“删除资源组”

  4. 在“删除资源组”窗格中,输入资源组的名称进行确认,然后选择“删除”。

    屏幕截图显示了要求输入资源名称以确认删除的框。

很快将会删除该资源组及其所有资源。

获取示例代码

获取 GitHub 上的 Node.js 快速入门示例