首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【攻略】如何在云开发中使用 Redis?

【攻略】如何在云开发中使用 Redis?

原创
作者头像
Booker Zhao
发布2020-03-03 15:46:52
1.9K0
发布2020-03-03 15:46:52
举报

默认情况下,云开发的函数部署在公共网络中,只可以访问公网。如果开发者需要访问腾讯云的 Redis、TencentDB、CVM、Kafka 等资源,需要建立私有网络来确保数据安全及连接安全

本文会演示如何在云开发的函数中使用 Redis,如需访问其他数据库资源,也可以参考本文的思路。

Redis 介绍及应用场景

Redis 是一个开源的 In-MemoryNoSQL数据库,可以用作数据库、缓存和消息中间件。 支持多种类型的数据结构,如字符串(strings)、散列(hashes)、列表(lists)和集合(sets)

常见的应用场景有:

  1. 会话缓存: Redis 不仅在内存中存储,读写速度较快,还提供了持久化方案来提供一致性
  2. 页面缓存:可以作为 PHP 或者是 Node.js 服务端渲染结果的缓存
  3. 消息队列: Redis 支持列表且支持 Pub/Sub,可以作为消息队列来使用
  4. 排行榜/计数:Redis 在内存中,因此它在递增和递减方面做得非常出色,另外,Redis 也支持集合和排序集合数据结构,比较适合排行榜的场景

私有网络介绍

私有网络(Virtual Private Cloud,VPC)是基于腾讯云构建的专属云上网络空间,为您在腾讯云上的资源提供网络服务,不同私有网络间完全逻辑隔离。您可以自定义网络环境、路由表、安全策略等;同时,私有网络支持多种方式连接 Internet、连接其他 VPC、连接您的本地数据中心,助力您轻松部署云上网络。

相比于用户共享资源池的基础网络,在私有网络中用户可以自由定义网段划分、IP 地址和路由策略;安全方面可提供网络 ACL 及安全组的访问控制,灵活性和安全性更高

20191206114303.png
20191206114303.png

私有网络有三个核心组成成分:私有网络网段、子网和路由表

一个私有网络由至少一个子网组成,子网的 CIDR(无类别域间路由) 必须在私有网络的 CIDR 内。

子网用于管理弹性云服务器网络平面的一个网络,可以提供 IP 地址管理、DNS 等服务。私有网络中的所有云资源(如云服务器、云数据库等)都必须部署在子网内。

私有网络具有 地域(Region) 属性(如广州),而子网具有 可用区(Zone) 属性(如广州一区),一个私有网络下的子网可以属于该地域下不同可用区,同一私有网络下各个子网内资源无论是否在同一可用区内,均默认内网互通

路由表由多条路由策略组成,用于控制私有网络内子网的出流量走向。每个子网仅且只能关联一个路由表,一个路由表可以关联多个子网。您可以为不同流量走向的子网创建多个路由表

新建私有网络

在腾讯云控制台的私有网络中可以免费创建私有网络,由于私有网络具有地域(Region)属性,我们需要在函数所在的地域来新建私有网络。

这里我们选择华东地区(上海)地域,如果您已经在该地域建立了私有网络,可以跳过这一步

20191206102827.png
20191206102827.png

创建私有网络时需要初始化一个子网,这里我们选择建一个在上海二区可用区的子网

20191206103504.png
20191206103504.png

将云函数加入私有网络

创建私有网络和子网之后,我们需要配置函数的网络模式,将函数加入到华东地区(上海)地域的私有网络中

在腾讯云的云开发控制台中,找到需要配置的云函数,点击编辑进入配置界面

20191205144942.png
20191205144942.png

在函数配置界面中,修改网络配置为华东地区(上海)地域的虚拟网络和子网。

20191206104719.png
20191206104719.png

购买 Redis 并加入同一个私有网络

接下来我们在腾讯云的云数据库控制台中,找到上海地域,新建一个 Redis 实例

20191206102732.png
20191206102732.png

这里为了方便演示,我们选择了一个内存为 256 MB 的单副本实例,您也可以根据具体的需求和场景来选择合适的套餐。

TIPS 在生产环境中,为了保证可靠性和高可用,建议不要选择选择单副本,最好选择多副本或者 Redis 集群;另外如果只在 CVM 等单机部署了 Redis,也需要做好容灾和备份

注意网络类型需要选择私有网络,同时选择刚才建好的私有网络和子网

20191206103751.png
20191206103751.png

云函数中连接 Redis

购买 Redis 之后,很快就会创建 Redis 的实例,创建成功之后,在网络下我们可以看到 Redis 实例的 ip,我们需要在云函数中连接这个实例

20191206105019.png
20191206105019.png

在云函数中安装 Redis 客户端库

为了连接和操作 Redis 实例,我们需要一个 Redis 客户端,这里我们使用社区开源的 ioredis 作为 Redis 客户端库作为示例:

20191206132609.png
20191206132609.png

首先,在云函数目录中的 package.json 中新增依赖 ioredis 依赖,设置完之后记得在开发者工具中选择 上传并部署(云端安装依赖)

{
  "name": "redis-demo",
  "dependencies": {
    "wx-server-sdk": "latest",
    "ioredis": "4.14.1"
  }
}

云函数中连接和操作 Redis

接下来,在云函数中编写代码来连接和操作 Redis,这里需要提供 Redis 实例的 ip、端口和密码等信息

TIPS 建议在 main 函数外面新建 Redis 客户端实例,这样在函数实例被复用时不会重复连接 Redis ,性能更好

在 main 函数中可通过 redis.get、redis.set 等方法读取和写入数据,具体可以查看 ioredis 的 API 文档

const Redis = require('ioredis');
// 建议在 main 函数外面新建 Redis 客户端实例
// 这样在函数实例被复用时不会重复连接 Redis
const redis = new Redis({
  port: 6379, // Redis port
  host: 'YOUR_REDIS_IP', // Redis host
  family: 4, // 4 (IPv4) or 6 (IPv6)
  password: 'YOUR_PASSWORD',
  db: 0,
});

// 云函数入口函数
exports.main = async (event, context) => {
  // TODO 可以使用 redis.get、redis.set 等方法来操作 Redis
};

示例:云函数中使用 Redis 作为缓存

我们现在来实际演示下一下如何在云函数中使用 Redis 作为缓存

我们需要新建一个名为 redis-demo 的云函数 ,该函数的主要实现是:

  • 连接部署在同一个私有网络的 Redis
  • 在用户请求云函数时,会首先用用户的 openid 作为 key 来从 Redis 中查询是否有缓存
  • 如果有缓存则直接返回
  • 没有缓存,则会执行一个函数来拿到结果,我们这里模拟了一个耗时 2s 的操作来返回一个随机数作为示例,拿到结果之后,会缓存在 Redis 中并返回

示例函数代码

// 云函数入口文件
const cloud = require('wx-server-sdk');
const Redis = require('ioredis');

cloud.init();

const redis = new Redis({
  port: 6379, // Redis port
  host: 'YOUR_REDIS_IP', // Redis host
  family: 4, // 4 (IPv4) or 6 (IPv6)
  password: 'YOUR_PASSWORD',
  db: 0,
});

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext();
  const cacheKey = wxContext.OPENID;

  const cache = await redis.get(cacheKey);

  if (!cache) {
    const result = await new Promise((resolve, reject) => {
      // 模拟一个耗时 2s 的任务,返回了一个随机数
      setTimeout(() => resolve(Math.random()), 2000);
    });

    // 缓存一小时
    redis.set(cacheKey, result, 'EX', 3600);
    return result;
  } else {
    return cache;
  }
};

编写完代码之后,我们需要上传并部署 redis-demo 函数,然后尝试在小程序中调用这个云函数来测试一下效果:

20191206105847.png
20191206105847.png

我们可以看到,由于使用了 Redis 作为缓存,在多次的调用云函数请求中,在 300 ms 左右都可以获取到函数的结果,函数返回的结果正是我们缓存的随机数,符合预期的效果。

总结

如果有需要访问云开发之外的腾讯云资源,可以选择使用私有网络这种网络模式,将云开发资源如函数和其他资源放在同一个私有网络即可,私有网络相比基础网络更加安全和灵活。本文虽然只演示了在函数中使用腾讯云的 Redis 资源,如果需要访问腾讯云的其他的数据库资源,思路也是一样的,只需要将函数和数据库资源放在同一个私有网络,就可以在函数中访问。

通过私有网络还可以实现对公网访问服务、实现和腾讯云之外的 IDC 互联等功能,关于这部分的介绍,我们后续进行讲解。


关于我

binggg(Booker Zhao) @腾讯

- 先后就职于迅雷、腾讯等,个人开源项目有 mrn.js 等
- 创办了迅雷内部组件仓库 XNPM ,参与几个迅雷前端开源项目的开发
- 热衷于优化和提效,是一个奉行“懒惰使人进步”的懒人工程师

社交资料

微信公众号 binggg_net, 欢迎关注

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Redis 介绍及应用场景
  • 私有网络介绍
  • 新建私有网络
  • 将云函数加入私有网络
  • 购买 Redis 并加入同一个私有网络
  • 云函数中连接 Redis
    • 在云函数中安装 Redis 客户端库
      • 云函数中连接和操作 Redis
      • 示例:云函数中使用 Redis 作为缓存
        • 示例函数代码
        • 总结
        • 关于我
          • 社交资料
          相关产品与服务
          云数据库 Redis
          腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档