Redis 伺服器安裝完成後,需要進行測試和組態以確保其正常運作並符合專案需求。連線測試可以使用 redis-cli 工具,透過 ping 命令驗證伺服器狀態,並執行 setget 等基本操作。組態方面,可以透過命令列引數或修改 redis.conf 檔案調整伺服器設定,例如設定密碼、繫結本地主機等。此外,Redis 支援 Lua 指令碼編寫,可透過 EVAL 命令執行 Lua 指令碼,並使用 redis.call()redis.pcall() 與 Redis 互動,SCRIPT 命令則用於管理指令碼。理解 Redis 的資料結構對於有效運用 Redis 至關重要,常用的資料結構包括字串、雜湊、列表、集合和有序集合等,各有其適用場景和操作指令。

Redis 伺服器測試與組態

在前面的章節中,我們已經成功安裝了 Redis 伺服器。現在,我們將對其進行測試並調整組態,以確保其安全性和效能。

測試 Redis 伺服器

要測試 Redis 伺服器,我們需要使用 Redis 使用者端工具 redis-cli 連線到伺服器。

$ redis-cli

此命令將連線到本地主機上的 Redis 伺服器例項。成功連線後,您應該會看到類別似以下的提示符號:

127.0.0.1:6379>

驗證伺服器狀態

首先,我們可以使用 ping 命令來檢查伺服器是否正常運作:

127.0.0.1:6379> ping

如果伺服器正常運作,您將收到 PONG 的回應。

執行簡單的鍵值操作

接下來,我們可以執行一個簡單的鍵值設定操作:

127.0.0.1:6379> set keycheck "It's working now!"

此命令將設定一個名為 keycheck 的鍵,其值為 "It's working now!"。如果操作成功,您將收到 OK 的回應。

檢索鍵值

我們可以使用 get 命令來檢索剛剛設定的鍵值:

127.0.0.1:6379> get keycheck

如果一切正常,您應該能夠檢索到剛剛儲存的值:

"It's working now!"

結束測試

完成測試後,可以使用 exit 命令離開 redis-cli

127.0.0.1:6379> exit

Redis 組態

在前面的章節中,我們瞭解瞭如何使用預設的 Redis 設定。現在,我們將探討如何修改 Redis 組態。

透過命令列引陣列態 Redis

Redis 允許透過命令列引數來組態伺服器。以下是一個範例,展示如何啟動另一個 Redis 伺服器程式,並將其組態為從屬伺服器:

$ sudo ./redis-server --port 6380 --slaveof 127.0.0.1 6379

請注意,透過命令列傳遞的引數與 redis.conf 檔案中的組態選項相同,只是關鍵字前面加上了 --

在執行時修改 Redis 組態

Redis 提供了 CONFIG SETCONFIG GET 命令,允許在執行時修改某些組態選項,而無需重新啟動伺服器。

例如,要修改儲存資料的策略,可以使用以下命令:

CONFIG SET SAVE "900 1 300 10"

這將設定 Redis 在 900 秒內至少有 1 次變更或在 300 秒內至少有 10 次變更時儲存資料。

取得目前組態

要取得目前的組態,可以使用 CONFIG GET 命令:

CONFIG GET *

此命令將列出所有支援的組態引數及其目前值。

驗證資料永續性

為了驗證 Redis 是否將資料持久化到磁碟,我們可以重新啟動 Redis 伺服器並檢查資料是否仍然可用。

$ sudo systemctl restart redis
$ redis-cli
127.0.0.1:6379> get keycheck

如果資料持久化成功,您應該仍然能夠檢索到之前儲存的值。

安全性組態

為了確保 Redis 伺服器的安全性,我們需要設定密碼並將其繫結到本地主機。

編輯 Redis 組態檔案

開啟 Redis 組態檔案:

$ sudo nano /etc/redis/redis.conf

新增以下行以設定密碼:

requirepass foobared

儲存並重新啟動 Redis 服務:

$ sudo systemctl restart redis.service

使用密碼連線 Redis

現在,您需要使用密碼連線到 Redis:

$ redis-cli -a foobared

Redis 指令碼編寫

自 Redis 2.6 版本起,Redis 支援使用 Lua 程式語言進行伺服器端指令碼編寫。這使得我們可以在 Redis 內部執行多種操作,從而簡化程式碼並提高效能。

為什麼使用 Redis 指令碼編寫?

使用 Lua 指令碼編寫有兩個主要優點:

  1. 效能改進:透過減少 Redis 與應用程式伺服器之間的往返次數來提高效能。
  2. 原子性:Redis 保證指令碼以原子方式執行,即在指令碼執行期間不會執行其他指令碼或 Redis 命令。

如何使用 Redis 指令碼編寫?

Redis 使用 EVAL 命令來執行 Lua 指令碼。以下是一個簡單的範例:

EVAL 'local val="Hello Compose" return val' 0

此命令執行一個 Lua 指令碼,該指令碼設定一個區域性變數 val 並傳回其值。

鍵和引數

在 Lua 指令碼中,可以使用 KEYS 表來存取鍵,使用 ARGV 表來存取引數。以下是一個範例:

EVAL "return ARGV[1]..' '..KEYS[1]" 1 name:first "Hello"

此指令碼傳回引數與鍵名的串聯結果。

-- 以下是一個簡單的Lua指令碼範例,用於示範如何在Redis中使用Lua指令碼。
local key = KEYS[1]
local value = ARGV[1]
redis.call('SET', key, value)
return redis.call('GET', key)

內容解密:

此 Lua 指令碼首先從 KEYS 表中取得第一個鍵名,並從 ARGV 表中取得第一個引數值。然後,它使用 redis.call 函式將該值設定給指定的鍵。最後,它檢索並傳回該鍵的值。

Redis 指令碼呼叫與 Lua 直譯器

在 Redis 中,使用 Lua 指令碼可以有效地減少應用程式與 Redis 之間的多餘往返請求次數。對於涉及多個鍵的操作或依賴前一次回應的多次操作,使用 Lua 指令碼是最佳選擇。此外,Lua 指令碼還能實作原子寫入操作,但需要注意的是,執行 Lua 指令碼會阻塞其他操作,因此應避免在指令碼中執行耗時的操作。

使用 Lua 直譯器呼叫 Redis 指令碼

Redis 提供了兩種呼叫 Redis 命令的函式:redis.call()redis.pcall()。這兩個函式的主要區別在於處理錯誤的方式不同。

redis.call() 和 redis.pcall() 的區別

  • redis.call():當 Redis 命令執行出錯時,該函式會直接傳回錯誤,終止指令碼的執行。
  • redis.pcall():當 Redis 命令執行出錯時,該函式會捕捉錯誤,並傳回一個包含錯誤訊息的 Lua 表。
-- 使用 redis.call() 呼叫 Redis 命令
local result = redis.call('GET', 'mykey')

-- 使用 redis.pcall() 呼叫 Redis 命令
local result = redis.pcall('GET', 'nonexistentkey')
if type(result) == 'table' and result.err then
    -- 處理錯誤
    print('Error: ' .. result.err)
end

內容解密:

在上述程式碼中,我們展示瞭如何使用 redis.call()redis.pcall() 呼叫 Redis 命令。redis.call() 用於簡單的命令呼叫,而 redis.pcall() 則允許我們捕捉並處理錯誤。

Redis SCRIPT 命令

Redis 提供了 SCRIPT 命令來控制指令碼子系統。以下是一些常用的 SCRIPT 命令:

  • SCRIPT LOAD script:將指令碼載入到 Redis 指令碼快取中。
  • SCRIPT EXISTS sha1:檢查給定的 SHA1 是否存在於指令碼快取中。
  • SCRIPT FLUSH:清空指令碼快取。
  • SCRIPT KILL:終止當前正在執行的指令碼。
# 載入 Lua 指令碼到 Redis
redis-cli SCRIPT LOAD "$(cat /path/to/your/script.lua)"

# 檢查指令碼是否存在
redis-cli SCRIPT EXISTS "$(sha1sum /path/to/your/script.lua | cut -d' ' -f1)"

內容解密:

這裡展示瞭如何使用 SCRIPT LOAD 將 Lua 指令碼載入到 Redis,以及如何使用 SCRIPT EXISTS 檢查指令碼是否存在。這些命令對於管理和維護 Redis 中的 Lua 指令碼至關重要。

Redis 資料結構詳解

在設定好 Redis 環境後,我們可以開始深入瞭解 Redis 的資料結構。Redis 是一種鍵值資料函式庫,選擇合適的資料型別對於實作所需的功能至關重要。本章將詳細介紹 Redis 的各種資料結構及其應用場景。

Redis 字串

Redis 字串是最基本的資料型別。它不僅可以用於儲存普通的文字資料,還支援二進位資料。Redis 字串的最大容量可達 512 MB。

特點

  • 二進位安全:可以儲存任意型別的資料。
  • 通用資料型別:當資料不適合其他 Redis 資料型別時,可以使用字串。
  • 可序列化資料:任何型別的資料都可以序列化成字串儲存。

使用案例

  • 靜態網頁內容:儲存靜態網頁內容,加快存取速度。
  • 快取:快取頻繁存取的資料,減少對後端資料函式庫的負載。
  • 計數器:儲存統計資料,如每日使用者存取量。
# 設定一個新的字串鍵或更新現有的鍵
redis-cli SET otp:use_10001 4532 EX 60

內容解密:

在上述範例中,我們使用 SET 命令建立了一個新的 OTP(一次性密碼),並設定其有效期為 60 秒。這展示瞭如何利用 Redis 字串儲存臨時資料,並利用其過期機制自動刪除無效資料。

其他 Redis 資料結構

除了字串,Redis 還提供了多種其他資料結構,包括雜湊(Hashes)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)、HyperLogLog、位陣列(Bit Arrays)和流(Streams)。每種資料結構都有其特定的應用場景和優勢。

使用 Mermaid 圖表展示 Redis 資料結構

  graph LR;
    A[Redis 資料結構] --> B[字串];
    A --> C[雜湊];
    A --> D[列表];
    A --> E[集合];
    A --> F[有序集合];
    A --> G[HyperLogLog];
    A --> H[位陣列];
    A --> I[流];

圖表翻譯: 此圖示展示了 Redis 支援的多種資料結構,包括字串、雜湊、列表、集合、有序集合、HyperLogLog、位陣列和流。每種資料結構都有其特定的用途和優勢,適用於不同的應用場景。

Redis 字串與雜湊資料結構詳解

Redis 提供了多種資料結構,其中最常用的是字串(Strings)和雜湊(Hashes)。本章將探討這兩種資料結構的使用方法、指令總結以及實際應用案例。

Redis 字串(Strings)

Redis 的字串是一種二進位制安全的資料結構,可以儲存任何型別的資料,如文字、圖片或序列化的物件。字串是 Redis 中最基本的資料型別。

使用範例

> SET company "Hybrowlabs"
OK
> GET company
"Hybrowlabs"
> STRLEN company
(integer) 10
> BITCOUNT company
(integer) 41

在上述範例中,我們使用 SET 指令設定了一個名為 company 的鍵,其值為 "Hybrowlabs"。接著,使用 GET 指令取得該鍵的值。STRLEN 指令用於計算字串的長度,而 BITCOUNT 則計算字串中被設為 1 的位元數量。

計數器操作

Redis 的字串支援計數器操作,如 INCRINCRBYDECRDECRBY。這些指令可以對儲存數值型別的字串進行增減操作。

> SET counter 100
OK
> INCR counter
(integer) 101
> INCRBY counter 10
(integer) 111
> DECR counter
(integer) 110
> DECRBY counter 10
(integer) 100

#### 內容解密:

在這個範例中,我們首先設定了一個名為 counter 的鍵,其初始值為 100。接著,我們使用 INCR 指令將其值增加 1,變為 101。使用 INCRBY 指令將其值增加 10,變為 111。然後,使用 DECR 指令將其值減少 1,變為 110。最後,使用 DECRBY 指令將其值減少 10,回到初始值 100。這些計數器操作在需要進行數值增減的場景中非常有用,例如統計網站的存取量。

OTP(一次性密碼)範例

Redis 的過期機制非常適合用於儲存一次性密碼(OTP)。以下是一個使用 Redis 儲存 OTP 的範例:

> SET otp:user_10001 "4532" EX 60
OK
> TTL otp:user_10001
(integer) 50
> GET otp:user_10001
"4532"
> TTL otp:user_10001
(integer) -2
> GET otp:user_10001
(nil)

#### 內容解密:

在這個範例中,我們使用 SET 指令設定了一個名為 otp:user_10001 的鍵,其值為 "4532",並設定其過期時間為 60 秒。使用 TTL 指令查詢該鍵的剩餘存活時間,當鍵未過期時,傳回剩餘秒數。當鍵過期後,使用 TTL 查詢將傳回 -2,表示該鍵已不存在。使用 GET 指令嘗試取得該鍵的值時,將傳回 (nil),表示該鍵已過期並被自動刪除。這種機制非常適合用於儲存一次性密碼,因為它能夠自動清除過期的密碼,避免無謂的資料儲存。

Redis 雜湊(Hashes)

Redis 的雜湊是一種鍵值對的集合,類別似於 JSON 物件或 Python 的字典。雜湊非常適合用於儲存物件的屬性。

使用範例

假設我們要儲存一個部落格作者的資訊,可以使用雜湊來實作:

{
    "lastvisit": "April 05, 2020 10:47:00",
    "name": "Suyog Kale",
    "points": 54210,
    "rank": 1,
    "blogposts": 45,
    "reviews": 50,
    "followers": 5609
}

在 Redis 中,我們可以使用 HSETHGETALL 指令來儲存和取得這個物件:

> HSET blogger:10001 lastvisit "April 05, 2020 10:47:00" name "Suyog Kale" points 54210 rank 1 blogposts 45 reviews 50 followers 5609
(integer) 7
> HGETALL blogger:10001
1) "lastvisit"
2) "April 05, 2020 10:47:00"
3) "name"
4) "Suyog Kale"
5) "points"
6) "54210"
7) "rank"
8) "1"
9) "blogposts"
10) "45"
11) "reviews"
12) "50"
13) "followers"
14) "5609"

#### 內容解密:

在這個範例中,我們使用 HSET 指令設定了一個名為 blogger:10001 的雜湊鍵,並一次性設定了多個欄位及其對應的值。使用 HGETALL 指令可以取得該雜湊鍵中所有的欄位和值。這種方式非常適合用於儲存結構化的物件資料,如使用者的詳細資訊或商品的屬性。

部分欄位操作

如果只需要取得或更新雜湊中的部分欄位,可以使用 HMGETHSET 指令:

> HMGET blogger:10001 name points blogposts
1) "Suyog Kale"
2) "54210"
3) "45"
> HSET blogger:10001 lastvisit "April 05, 2020 11:47:00" blogposts 48
(integer) 0

#### 內容解密:

在這個範例中,我們使用 HMGET 指令取得了 blogger:10001 中的部分欄位,包括 namepointsblogposts。接著,使用 HSET 指令更新了 lastvisitblogposts 的值。當更新已存在的欄位時,HSET 傳回 0,表示更新操作成功。這種靈活性使得雜湊非常適合用於需要頻繁更新部分屬性的場景。

自增操作

對於數值型別的欄位,可以使用 HINCRBY 等指令進行自增或自減操作:

> HINCRBY blogger:10001 points 100
(integer) 54310

#### 內容解密:

在這個範例中,我們使用 HINCRBY 將欄位名為 points 的值增加 100。這使得我們可以方便地對數值型別的欄位進行原子性的增減操作,這對於需要進行評分、計數等操作的場景非常有用。

Redis 字串與雜湊的操作指令彙總

以下是 Redis 中字串和雜湊相關的操作指令:

字串操作指令

指令 描述
SET 設定鍵的值
GET 取得鍵的值
STRLEN 取得字串的長度
BITCOUNT 統計字串中被設為1的位元數量
INCR 將鍵的值增加1
INCRBY 將鍵的值增加指定的數值
DECR 將鍵的值減少1
DECRBY 將鍵的值減少指定的數值

#### 圖表翻譯:

此圖表展示了 Redis 中常用的字串操作指令及其功能描述,包括如何設定和取得值、計算字串長度、以及進行計數器操作等。

  graph LR;
    A[字串操作] --> B[SET - 設定鍵的值];
    A --> C[GET - 取得鍵的值];
    A --> D[STRLEN - 取得字串長度];
    A --> E[BITCOUNT - 統計位元數量];
    A --> F[INCR - 值增加1];
    A --> G[INCRBY - 增加指定數值];
    A --> H[DECR - 值減少1];
    A --> I[DECRBY - 減少指定數值];

圖表翻譯:

此圖表呈現了 Redis 字串操作的程式與過程,包括設定、取得、計算長度、統計位元數量,以及進行計數器操作等步驟,每一步驟對應不同的 Redis 操作命令,這些命令共同構成了 Redis 字串操作的核心功能。

雜湊操作指令

指令 描述
HSET 設定雜湊欄位的值
HGET 取得雜湊欄位的值
HGETALL 取得雜湊中所有的欄位和值
HMGET 取得雜湊中多個欄位的值
HINCRBY 將雜湊欄位的值增加指定的數值

#### 圖表翻譯:

此圖表展示了 Redis 中常用的雜湊操作指令及其功能描述,包括如何設定和取得欄位的值、以及進行自增操作等。

  graph LR;
    A[雜湊操作] --> B[HSET - 設定欄位的值];
    A --> C[HGET - 取得欄位的值];
    A --> D[HGETALL - 取得所有欄位和值];
    A --> E[HMGET - 取得多個欄位的值];
    A --> F[HINCRBY - 增加欄位的值];

圖表翻譯:

此圖表呈現了 Redis 中雜湊操作的程式與過程,包括設定欄位、取得值、取得所有欄位和值,以及進行自增操作等步驟,每一步驟對應不同的 Redis 操作命令,這些命令共同構成了 Redis 中對雜湊資料結構的操作核心,能夠有效地管理和操作結構化資料。

隨著應用程式對效能和可擴充套件性要求的提高,Redis 這類別高效能的記憶體資料函式庫將會扮演越來越重要的角色。未來,我們可以預見 Redis 將會繼續擴充套件其功能,不斷最佳化效能,以滿足日益增長的資料處理需求。同時,開發者也需要深入理解 Redis 的各種資料結構和操作指令,以便更好地利用 Redis 為應用程式提供強大的支援。

總之,掌握 Redis 的字串和雜湊資料結構及其相關操作,將有助於開發者更有效地設計和實作高效能的應用系統,從而提升使用者經驗和系統的整體效能。透過不斷實踐和最佳化,Redis 將繼續在現代應用程式開發中發揮重要作用。