在Heroku雲端平台使用Redis記憶體資料庫(一):Redis CLI基本命令

上傳到Heroku雲端平台的程式碼,將被佈署到不同的虛擬機(dyno)執行,如此不僅能分擔工作負荷,也可避免任一機器故障造成整個網站掛點。每個虛擬機都有獨立的記憶體區域和檔案系統,由dyno manager(虛擬機管理員)管控。

Heroku Dyno(虛擬機)

Heroku的虛擬機每一天至少會被重置(cycle,原意是「循環」)一次,這樣做可以避免某些程式沒有適切地釋放資源(如:記憶體)而阻礙系統效能,一旦「虛擬機管理員」察覺某個虛擬機當掉了,它將立即重置該虛擬機。這個重置作業是自動執行的、無法取消,使用者和程式設計人員都不會察覺到(因為同時間仍有多個虛擬機在運作),程式設計師也不用煩惱管理系統平台的瑣事。

每一次重置,不僅是記憶體內容,就連之前建立、寫入磁碟的檔案,例如:.csv, .pickle或者SQLite的資料檔,都會被清空。所以Heroku的檔案系統被稱為ephemeral(臨存的),這樣的設計是為了便於擴展(scale out)佈署虛擬機,應付大規模的連線要求。

但是這種設計也會帶來問題。如果你在程式中宣告全域變數,並且動態地變更其值,就像《超圖解Python程式設計入門》第13章,程式建立一個users(使用者)全域變數,並在其中儲存多筆LINE用戶的ID和悄悄話,上傳到Heroku後執行並在LINE中輸入悄悄話,之後讀取的結果可能會是這樣:剛剛儲存的悄悄話消失了!再輸入一次並讀取…居然讀到最初輸入的悄悄話。

這是因為你的程式隨時都可能在不同的虛擬機執行,所以無法確保全域變數資料的一致性。

認識Redis記憶體資料庫

若想要在Heroku平台保存檔案資料,或者暫存程式之間共享的資料或執行狀態,可以採用資料庫系統,例如Redis或Memcached,這兩者都是以記憶體為儲存媒介的NoSQL型資料庫,NoSQL代表它不採用SQL語言操作,由於資料保存在記憶體,因此存取效率高。

Redis和採用SQL語言操作的MySQL資料庫(一款知名的開源關聯式資料庫系統)的主要差異:

  Redis MySQL
資料儲存格式 鍵值對(key-value pair) 關聯式資料表(relational table)
主要的資料儲存媒介 記憶體 磁碟
資料操作方式 專屬指令 SQL語言

附帶一提,MySQL資料庫具備Memory engine(記憶體引擎),可以建立存於記憶體的資料表。

Heroku平台推薦使用Redis,它的功能比Memcached強大,例如,Redis支援把資料寫入磁碟,可在重置電腦之後取回先前儲存的資料。Redis是開放原始碼專案,原意是Remote Dictionary Server(遠端字典型伺服器),最初由Salvatore Sanfilippo著手開發,現在由Redis Labs資助,可在官網的Download頁面下載原始碼,並在macOS和Linux平台上編譯安裝,或者執行底下的apt命令安裝:

sudo apt-get install redis-server

Microsoft Open Tech group(微軟開放科技群組)維護了Windows版,但已3年沒有更新了。

Heroku有提供免費、25MB記憶體空間的雲端Redis資料庫服務,但申請時需要填寫信用卡號碼,所以本文採用另一個有提供免費試用方案(30MB記憶體空間)的線上Redis資料庫平台:Redis Labs

Redis資料庫應用案例

Twitter、微博、Snapchat、GitHub…等知名網站都有採用Redis,而且通常都是把Redis應用在快取(Cache,暫存常用的資料),如Twitter官方部落格的“The Infrastructure Behind Twitter: Scale”這篇文章說明。

我們仍需要傳統使用磁碟來儲存與管理大量數據,還有支援交易(transacton)以及可靠的資料庫,例如:甲轉帳100元給乙,乙的戶頭增加100元,而甲的戶頭扣除100元,「交易」用於確認這些步驟都執行成功。相較於可靠度,Redis更重視效能;Redis官網的“Redis + MySQL = Fast, Economic Scaling”這篇文章提到,在MySQL和網站伺服器之間佈署Redis,將能縮減系統的回應延遲時間。

用Redis當作資料庫的快娶

Redis不僅減少了存取硬碟資料的次數和時間,也降低處理器執行查詢的運算次數,因為之前的查詢結果已被暫存下來了。

申請與設置Redis Labs資料庫

請先在Redis Labs首頁輸入你的e-mail,再按下“GET STARTED FREE”(免費試用),日後請按下首頁右上角的LOGIN(登入),再輸入你的e-mail和密碼即可登入。

Redis Labs首頁

登入之後,將進入如下圖的Databases(資料庫)頁面,如果不是這個頁面,請從右上角選單選擇Databases選項。

新增資料庫

按下「+」鈕,將進入如下的新增資料庫設定頁面。請填寫資料庫名稱,其餘選項使用預設值即可。

自訂資料庫名稱

按下“Activate”(啟用)鈕,可以在View Database(檢視資料庫)頁面看到資料庫的名稱、密碼和連線位址(Endpoint)。

View Database(檢視資料庫)頁面

Redis的前端工具和程式將會用到主機位址、埠號和密碼。

安裝Redis CLI工具

CLI代表Command Line Interface(命令行介面),Redia CLI工具會連同Redis伺服器軟體一併安裝,也可以單獨安裝。個別安裝Redis CLI需要使用npm,npm是Node.js程式(在電腦系統運作的JavaScript執行環境)的套件管理工具(相當於Python的pip),它會隨著Node.js一併安裝,可以在Node.js官網下載。

在命令行或終端機執行這個命令安裝Redis CLI工具:npm install -g redis-cli

安裝Redis CLI工具

透過Redis CLI操作Redis Labs資料庫

Redis CLI工具安裝完畢後,即可執行底下的命令連接Redis Labs線上資料庫:

rdcli -h 資料庫主機位址 -a 密碼 -p 埠號

假設連線主機位址是redis-1984.redislabs.com、密碼是6789、埠號是1984,連線命令如下:

連線到Redis Labs資料庫

如果命令輸入正確,就會出現目前連線的主機和命令提示字元,否則會出現「連線嘗試失敗」的錯誤訊息。

設定與讀取Redis資料的基本命令

Redis採用字典結構以「鍵–值」的型式儲存資料,最基本的資料類型是字串,它可以是文字或二進制資料(如:編碼後的圖檔),資料的鍵名和數值最大可達512MB。

設定和讀取資料的指令分別是SET和GET,假設要把”一定要努力!”字串設定給變數”words”,一般程式語言的寫法是:

words = "一定要努力!"

Redis CLI則用SET命令寫成:

SET命令

如果字串資料包含空格,就必須要用引號包圍。讀取鍵值用GET命令

GET命令

MSET和MGET(M代表“Multiple”,多個)命令分別可設定或者讀取多個鍵值,例如,底下的命令將設定foo和bar兩個鍵:

STRLEN(代表”String Length”,字串長度)命令可傳回字串長度,由於Redis字串值採用Unicode (UTF-8) 編碼,一個中文字大多佔3位元組,所以words內含的字串長度為18位元組。

STRLEN命令

EXISTS命令:判斷某個鍵是否存在,若存在則傳回整數1,否則傳回整數0。

EXISTS命令

DEL(代表”delete”,刪除)命令:刪除一個或多個鍵。這個命令將刪除foo和bar:

DEL命令

Redis儲存的鍵值都是字串類型;用TYPE命令可取得資料的類型:

TYPE命令

INCR(代表“increase”,增加)命令會將鍵值加1,並傳回整數類型值,但是原有的鍵值仍是字串類型。

INCR命令

DECR(代表“decrease”,減少)命令會將鍵值減1;另有INCRBY(代表“increase by”,增加指定數值)DECRBY(代表“decrease by”,減少指定數值)命令。

基本的Redis CLI命令先介紹到這邊,完整的Redis命令表列和說明,請參閱官網的Commands單元

Posts created 470

2 thoughts on “在Heroku雲端平台使用Redis記憶體資料庫(一):Redis CLI基本命令

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top