回顧一下-Day [11] Azure Cache for Redis-Chatbot 搜尋資料時間優化
我們想要利用Azure Cache for Redis緩存口罩公開資料,避免多餘的查詢動作,因此必須在我們部署Line Webhook的Azure Functions上操作Azure Cache for Redis。
由於Redis Cache與Line官方帳號都有一些重要參數會在程式中使用到,為了方便管理我們在Azure Functions專案中新增config.ts檔案,將Line官方帳號的cannelSecret, channelAccessToken與Redis Cache的REDISCACHEHOSTNAME,REDISCACHEKEY 寫入。忘記在哪裡取得的朋友可參考-Day [8] Azure Functions-使用 LINE Messaging API與Day [14] Azure Cache for Redis-本機執行&測試
config.ts:
export const LINE = {
channelSecret: "<YOUR_CHANNEL_SECRET>",
channelAccessToken: "<YOUR_CHANNEL_ACCESS_TOKEN>"
};
export const REDIS = {
REDISCACHEHOSTNAME: '<YOUR_AZURE_REDIS_REDISCACHEHOSTNAME>',
REDISCACHEKEY: '<YOUR_AZURE_REDIS_REDISCACHEKEY>'
}
接下來為了能使用Azure Cache for Redis來儲存,搜尋口罩公開資料的快取資料,我們在專案中新增一支RedisCache.ts程式,其中redis.createClient所需的參數可由上述的config.ts取得。
昨天我們已經練習過如何在local透過簡單的Node.js操作Azure Cache for Redis,現在我們要在Azure Functions的環境中操作可如法炮製,新增2支function以滿足緩存資料與取得資料的需求:setMask(),getMask()
這邊要注意的是原本透過公開資料端點取得的資料為JSON物件格式(可參考-Day [10] Azure Functions-Line Chatbot實作(二)),但Redis Cache存入的資料需為字串,因此需要透過JSON.stringify(), JSON.parse() 語法來處以轉換格式的問題。
RedisCache.ts:
const redis = require("redis");
const bluebird = require("bluebird");
import { REDIS } from '../config'
bluebird.promisifyAll(redis.RedisClient.prototype);
bluebird.promisifyAll(redis.Multi.prototype);
const cacheConnection = redis.createClient(6380, REDIS.REDISCACHEHOSTNAME,
{ auth_pass: REDIS.REDISCACHEKEY, tls: { servername: REDIS.REDISCACHEHOSTNAME } });
export const setMask = async (key: string ,maskSnapshot: any) => {
console.log("\nCache command: SET Message");
await cacheConnection.setAsync(key, JSON.stringify(maskSnapshot));
}
export const getMask = async (key: string) => {
console.log("\nCache command: GET Message");
const masCache = await cacheConnection.getAsync(key)
return JSON.parse(masCache)
}
準備好上面的程式後,明天我們將繼續完成Line Cahtbot的資料緩存服務!