解決無法在 Heroku 持續儲存靜態資料問題 | 使用 Redis 記憶體資料庫

前陣子幫朋友做了一個職缺自動通知的機器人,主要是用 Python 至指定頁面爬取職缺資訊,接著比對已經排取過的資料做排除,最後透過 LINE Notify API 來發送推播通知。

我把 Python script 部署在 Heroku 上,並透過 schedule 的 add-on 來定期執行。爬取過的資料原本我是打算用靜態檔來儲存,整理成 json 格式另存。

But ...... 我發現每次執行程式後,完全沒有將資料儲存起來。後來查官方文件才知道, Heroku 的虛擬機 ( dyno ) 是 臨時硬碟 ( Ephemeral Disk ),文件中也有提到:

Heroku has an “ephemeral” hard drive, this means that you can write files to disk, but those files will not persist after the application is restarted.

於是,就打算嘗試將資料存到 Redis,Heroku 有提供免費的 Redis 資料庫服務 ( 有 25 MB ),不過這次是申請使用 Redis Labs ( 免費試用方案提供 30 MB )。

以下分享申請步驟及如何實作:

一、申請 Redis Labs

至 Redis Labs 官網,留下 Email 點選 START FREE

首頁輸入信箱
輸入完後,會請你至信箱收取認證信
送出完成畫面
至信箱點選啟動按鈕
啟動信件
填寫姓名後點選 Continue 

二、設置 Redis 資料庫

先選擇完左上方的雲端服務後,點選左下角基本方案 -> 30 MB 免費方案。


此步驟是填寫要註冊的名稱。


接著是創建資料庫,填寫資料庫名稱後,記得把連線密碼記下來。最後按 Activate。

成功啟用!記得把 Endpoint 資料庫主機位置跟 port 也記下來唷!

三、可以開始來寫程式囉

import redis module 後,把 host 設定剛剛記下來的資料庫主機位置, port 設定為主機位置後的阜號。password 也是設定上方步驟獲得的密碼。

因為 redis 是 key-value 關係,所以可以看到我塞入 key = 'key' ,value = 'hello world',最後印出 key 值為 ’key‘ 的資料。

import redis

redisHost = config['redis']['host']
redisPort = config['redis']['port']
redisPwd = config['redis']['password']
useRedis = redis.Redis (
host = redisHost,
port = redisPort,
password = redisPwd
)
useRedis.set("key", "hello, world")
print(useRedis.get("key")) 


執行此程式可以就能得到 hello world 啦!


只要搭配 Redis,就能把部署在 Heroku 的程式碼,將資料存在 Redis 中,不怕被 reset 掉囉!


如果喜歡我的文章,想隨時收到最新行銷、技術分享,歡迎按 fb 粉專讚
加入好友  或加入 LINE 官方帳號,即時接收最新文章通知

留言

這個網誌中的熱門文章

2021 年 1 月熱門電子書推薦 | 精選書籍推薦

CodeIgniter 查詢生成器 - update_batch 介紹

自創思維:人生是永遠的測試版,瞬息萬變世界的新工作態度 | 讀書心得