使用 Memorystore 缓存数据

在执行某些任务时,高性能的可扩缩 Web 应用通常会先使用内存中的分布式数据缓存,当其不可用时才会使用可靠的永久性存储空间。我们建议您使用 Memorystore for Redis 作为缓存服务。请注意,Memorystore for Redis 不提供免费层级。如需了解详情,请参阅 Memorystore 价格

开始之前,请确保您的应用不会超出 Memorystore for Redis 配额

何时使用内存缓存

会话数据、用户偏好设置以及网页查询返回的其他数据都非常适合进行缓存。通常,如果频繁运行的查询所返回的结果集不需要立即显示在您的应用中,便可以缓存结果。如此,后续请求可以检查缓存,只有当结果缺失或过期时才会查询数据库。

如果您将某个值仅存储在 Memorystore 中,而没有将其备份到永久性存储空间,请确保在该值过期及从缓存中移除时,您的应用仍可正常运作。例如,如果用户会话数据的突然缺失会导致会话出现故障,则应考虑除了在 Memorystore 中存储该数据之外,还应将其存储在数据库中。

了解 Memorystore 权限

与 Google Cloud 服务之间进行的每一次交互操作都需要经过授权。例如,如需与 Memorystore 托管的 Redis 数据库进行交互,您的应用需要提供有权访问 Memorystore 的帐号的相应凭据。

默认情况下,您的应用会提供 App Engine 默认服务帐号的凭据,该帐号有权访问与您应用同属一个项目中的数据库。

如果满足以下任何条件,则您需要使用明确提供凭据的备用身份验证技术:

  • 您的应用和 Memorystore 数据库位于不同的 Google Cloud 项目中。

  • 您已更改分配给默认 App Engine 服务帐号的角色。

如需了解备用身份验证技术,请参阅为服务器到服务器的生产应用设置身份验证

使用 Memorystore 概览

如需在您的应用中使用 Memorystore,请执行以下操作:

  1. 设置 Memorystore for Redis,此操作需要您在 Memorystore 上创建 Redis 实例并创建无服务器 VPC 访问通道,以供您的应用与 Redis 实例通信。

  2. 安装适用于 Redis 的客户端库并使用 Redis 命令缓存数据。

    Memorystore for Redis 与适用于 Redis 的任何客户端库都兼容。本指南介绍如何使用 node_redis 客户端库从应用中发送 Redis 命令。

  3. 测试您的更新

  4. 将应用部署到 App Engine

设置 Memorystore for Redis

如需设置 Memorystore for Redis,请执行以下操作:

  1. 在 Memorystore 中创建 Redis 实例

    当系统提示您为 Redis 实例选择地区时,请选择您的 App Engine 应用所在的地区

  2. 记下您创建的 Redis 实例的 IP 地址和端口号。您在自己的代码中创建 Redis 客户端时,将会用到这些信息。

  3. 将 App Engine 连接到 VPC 网络。您的应用只能通过 VPC 连接器与 Memorystore 通信。

    请务必按照将应用配置为使用连接器中的说明,将 VPC 连接信息添加到 app.yaml 文件中。

安装依赖项

要使 node_redis 客户端库可供在 App Engine 中运行的应用使用,请将此库添加到该应用的 package.json 文件中。例如:
{
  "name": "memorystore-redis",
  "description": "An example of using Memorystore(Redis) with Node.js",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "Google Inc.",
  "engines": {
    "node": ">=12.0.0"
  },
  "dependencies": {
    "redis": "^4.0.0"
  }
}

详细了解如何为 Node.js 应用指定依赖项

创建 Redis 客户端

如需与 Redis 数据库进行交互,您的代码需要创建 Redis 客户端才能管理与 Redis 数据库的连接。以下部分介绍如何使用 node_redis 客户端库创建 Redis 客户端。

指定环境变量

node_redis 客户端库使用两个环境变量为您的 Redis 数据库组建网址:

  • 用于标识您在 Memorystore 中创建的 Redis 数据库的 IP 地址的变量。
  • 用于标识您在 Memorystore 中创建的 Redis 数据库的端口号的变量。

我们建议您在应用的 app.yaml 文件中定义这些变量,而不是直接在您的代码中定义这些变量。这样可以更轻松地在不同的环境(例如本地环境和 App Engine)中运行您的应用。

例如,将下面几行代码添加到 app.yaml 文件中:

 env_variables:
      REDISHOST: '10.112.12.112'
      REDISPORT: '6379'

导入 node_redis 并创建客户端

在定义了 REDISHOSTREDISPORT 环境变量后,您可以使用以下行导入 node_redis 库并创建 Redis 客户端:

'use strict';
const http = require('http');
const redis = require('redis');

const REDISHOST = process.env.REDISHOST || 'localhost';
const REDISPORT = process.env.REDISPORT || 6379;

const client = redis.createClient(REDISPORT, REDISHOST);
client.on('error', err => console.error('ERR:REDIS:', err));

// create a server
http
  .createServer((req, res) => {
    // increment the visit counter
    client.incr('visits', (err, reply) => {
      if (err) {
        console.log(err);
        res.status(500).send(err.message);
        return;
      }
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end(`Visitor number: ${reply}\n`);
    });
  })
  .listen(8080);

使用 Redis 命令在缓存中存储和检索数据

虽然 Memorystore Redis 数据库支持大多数 Redis 命令,但您只需使用几个命令即可在缓存中存储和检索数据。下表建议了一些可用于缓存数据的 Redis 命令。如需了解如何从您的应用调用这些命令,请参阅客户端库的文档。

任务 Redis 命令
在数据缓存中创建一个条目,
并为该条目设置到期时间
SETNX
MSETNX
从缓存中检索数据 GET
MGET
替换现有的缓存值 SET
MSET
递增或递减缓存数值 INCR
INCRBY
DECR
DECRBY
从缓存中删除条目 DEL
UNLINK
支持与缓存进行并发交互 请参阅有关 Redis 事务的详细信息。

测试更新

当您在本地测试应用时,请考虑运行 Redis 的本地实例以避免与生产数据交互(Memorystore 不提供模拟器)。如需在本地安装并运行 Redis,请按照 Redis 文档中的说明进行操作。请注意,目前无法在 Windows 上本地运行 Redis。

部署应用

一旦您的应用能够在本地开发服务器上无错误地正常运行,请执行以下操作:

  1. 在 App Engine 上测试应用

  2. 如果应用无错误地正常运行,请使用流量拆分功能为更新后的应用缓慢增加流量。请先仔细监控应用是否存在任何数据库问题,然后再将更多流量路由到更新后的应用。