03.03 「攻略」如何在雲開發中使用 Redis?

默認情況下,雲開發的函數部署在公共網絡中,只可以訪問公網。如果開發者需要訪問騰訊雲的

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 及安全組的訪問控制,靈活性和安全性更高

「攻略」如何在雲開發中使用 Redis?

私有網絡有三個核心組成成分:私有網絡網段、子網和路由表

一個私有網絡由至少一個子網組成,子網的 https://cloud.tencent.com/document/product/215/18509#2 必須在私有網絡的 CIDR 內。

子網用於管理彈性雲服務器網絡平面的一個網絡,可以提供 IP 地址管理、DNS 等服務。私有網絡中的所有云資源(如雲服務器、雲數據庫等)都必須部署在子網內。

私有網絡具有 https://cloud.tencent.com/document/product/215/20057#.E5.9C.B0.E5.9F.9F.EF.BC.88region.EF.BC.89 屬性(如廣州),而子網具有 https://cloud.tencent.com/document/product/215/20057#.E5.8F.AF.E7.94.A8.E5.8C.BA.EF.BC.88zone.EF.BC.89 屬性(如廣州一區),一個私有網絡下的子網可以屬於該地域下不同可用區,同一私有網絡下各個子網內資源無論是否在同一可用區內,均默認內網互通

路由表由多條路由策略組成,用於控制私有網絡內子網的出流量走向。每個子網僅且只能關聯一個路由表,一個路由表可以關聯多個子網。您可以為不同流量走向的子網創建多個路由表

新建私有網絡

在騰訊雲控制檯的私有網絡中可以免費創建私有網絡,由於私有網絡具有地域(Region)屬性,我們需要在函數所在的地域來新建私有網絡。

這裡我們選擇華東地區(上海)地域,如果您已經在該地域建立了私有網絡,可以跳過這一步

「攻略」如何在雲開發中使用 Redis?

創建私有網絡時需要初始化一個子網,這裡我們選擇建一個在上海二區可用區的子網

「攻略」如何在雲開發中使用 Redis?

將雲函數加入私有網絡

創建私有網絡和子網之後,我們需要配置函數的網絡模式,將函數加入到華東地區(上海)地域的私有網絡中

在騰訊雲的雲開發控制檯中,找到需要配置的雲函數,點擊編輯進入配置界面

「攻略」如何在雲開發中使用 Redis?

在函數配置界面中,修改網絡配置為華東地區(上海)地域的虛擬網絡和子網。

「攻略」如何在雲開發中使用 Redis?

購買 Redis 並加入同一個私有網絡

接下來我們在騰訊雲的雲數據庫控制檯中,找到上海地域,新建一個 Redis 實例

「攻略」如何在雲開發中使用 Redis?

這裡為了方便演示,我們選擇了一個內存為 256 MB 的單副本實例,您也可以根據具體的需求和場景來選擇合適的套餐。

TIPS

在生產環境中,為了保證可靠性和高可用,建議不要選擇選擇單副本,最好選擇多副本或者 Redis 集群;另外如果只在 CVM 等單機部署了 Redis,也需要做好容災和備份

注意網絡類型需要選擇私有網絡,同時選擇剛才建好的私有網絡和子網

「攻略」如何在雲開發中使用 Redis?

雲函數中連接 Redis

購買 Redis 之後,很快就會創建 Redis 的實例,創建成功之後,在網絡下我們可以看到 Redis 實例的 ip,我們需要在雲函數中連接這個實例

「攻略」如何在雲開發中使用 Redis?

在雲函數中安裝 Redis 客戶端庫

為了連接和操作 Redis 實例,我們需要一個 Redis 客戶端,這裡我們使用社區開源的 https://github.com/luin/ioredis 作為 Redis 客戶端庫作為示例:

「攻略」如何在雲開發中使用 Redis?

首先,在雲函數目錄中的 package.json 中新增依賴 ioredis 依賴,設置完之後記得在開發者工具中選擇

上傳並部署(雲端安裝依賴)

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


雲函數中連接和操作 Redis

接下來,在雲函數中編寫代碼來連接和操作 Redis,這裡需要提供 Redis 實例的 ip、端口和密碼等信息

TIPS

建議在 main 函數外面新建 Redis 客戶端實例,這樣在函數實例被複用時不會重複連接 Redis ,性能更好

在 main 函數中可通過 redis.get、redis.set 等方法讀取和寫入數據,具體可以查看 ioredis 的 API 文檔

<code>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
};/<code>


示例:雲函數中使用 Redis 作為緩存

我們現在來實際演示下一下如何在雲函數中使用 Redis 作為緩存

我們需要新建一個名為 redis-demo 的雲函數 ,該函數的主要實現是:

  • 連接部署在同一個私有網絡的 Redis
  • 在用戶請求雲函數時,會首先用用戶的 openid 作為 key 來從 Redis 中查詢是否有緩存
  • 如果有緩存則直接返回
  • 沒有緩存,則會執行一個函數來拿到結果,我們這裡模擬了一個耗時 2s 的操作來返回一個隨機數作為示例,拿到結果之後,會緩存在 Redis 中並返回

示例函數代碼


<code>// 雲函數入口文件
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;
}
};/<code>

編寫完代碼之後,我們需要上傳並部署 redis-demo 函數,然後嘗試在小程序中調用這個雲函數來測試一下效果:

「攻略」如何在雲開發中使用 Redis?

我們可以看到,由於使用了 Redis 作為緩存,在多次的調用雲函數請求中,在 300 ms 左右都可以獲取到函數的結果,函數返回的結果正是我們緩存的隨機數,符合預期的效果。

總結

如果有需要訪問雲開發之外的騰訊雲資源,可以選擇使用私有網絡這種網絡模式,將雲開發資源如函數和其他資源放在同一個私有網絡即可,私有網絡相比基礎網絡更加安全和靈活。本文雖然只演示了在函數中使用騰訊雲的 Redis 資源,如果需要訪問騰訊雲的其他的數據庫資源,思路也是一樣的,只需要將函數和數據庫資源放在同一個私有網絡,就可以在函數中訪問。

通過私有網絡還可以實現對公網訪問服務、實現和騰訊雲之外的 IDC 互聯等功能,關於這部分的介紹,我們後續進行講解。



關於我


<code>    binggg(Booker Zhao) @騰訊/<code> 
<code>    - 先後就職於迅雷、騰訊等,個人開源項目有 mrn.js 等
- 創辦了迅雷內部組件倉庫 XNPM ,參與幾個迅雷前端開源項目的開發
- 熱衷於優化和提效,是一個奉行“懶惰使人進步”的懶人工程師/<code>

社交資料


  • GitHub: https://github.com/binggg
  • 簡書: https://www.jianshu.com/u/60f22559b79f
  • 掘金: https://juejin.im/user/58d31f130ce4630057edb3ba
  • ️‍️ 微博: https://weibo.com/being99
  • 思否: https://segmentfault.com/u/binggg
  • 博客園: https://www.cnblogs.com/binggg/
  • 開源中國: https://my.oschina.net/u/4217267
  • 極術社區: https://aijishu.com/u/binggg
  • 今日頭條: https://www.toutiao.com/c/user/102306299647
  • CSDN: https://blog.csdn.net/weixin_42541867


分享到:


相關文章: