Redis(Remote Dictionary Server)是由 Salvatore Sanfilippo 開發的開源、高效能、基於記憶體的鍵值儲存系統,常被歸類為 NoSQL 資料庫。它支援豐富的資料結構,包括字串、雜湊、列表、集合、有序集合等,這使其遠超傳統鍵值存儲的功能。
鍵值存儲的本質在於:將資料存入後,透過鍵名即可快速檢索。Redis 將所有資料保存在記憶體中,讀寫速度極快,常用於快取、會話儲存、即時分析、排行榜、計數器等場景。
雖然 Redis 功能強大,但創作者曾指出它不適合完全替代關係型資料庫(RDBMS),主要因為在事務操作與主從同步機制上尚不成熟。以下是 Redis 的典型應用場景:
Redis 在 Linux 上安裝非常簡單,以下以 2.8.19 版本為例(實際使用請替換為最新穩定版):
$ wget https://download.redis.io/releases/redis-2.8.19.tar.gz
$ tar xzf redis-2.8.19.tar.gz
$ cd redis-2.8.19
$ make
編譯完成後,可執行檔位於 src 目錄下,包含 redis-server(服務端)與 redis-cli(客戶端)。啟動服務:
$ src/redis-server
Windows 版本官方不再直接維護,建議使用 Docker 或 WSL 運行 Linux 版本,或下載社群移植版(如 Microsoft 維護的分支)。
Predis 是 PHP 社群廣泛使用的 Redis 客戶端,支援自動載入與彈性配置。
$ git clone git://github.com/nrk/predis.git
<?php
require "predis/autoload.php";
Predis\Autoloader::register();
try {
// 本地連接(預設 127.0.0.1:6379)
$redis = new Predis\Client();
// 遠程連接範例(如虛擬機環境)
/* $redis = new Predis\Client([
"scheme" => "tcp",
"host" => "192.168.1.100",
"port" => 6379
]); */
} catch (Exception $e) {
die("連接失敗: " . $e->getMessage());
}
echo "Redis 連接成功!";
| 類型 | 說明 | 典型指令 |
|---|---|---|
| String | 二進位安全字串,最基礎類型 | SET, GET, INCR |
| List | 雙向鏈表,支援頭尾插入刪除 | LPUSH, RPUSH, LPOP, LRANGE |
| Hash | 欄位-值映射表,適合物件儲存 | HSET, HGET, HGETALL, HMSET |
| Set | 無序不重複字串集合 | SADD, SREM, SISMEMBER, SMEMBERS |
| Sorted Set | 帶分數的有序不重複集合 | ZADD, ZRANGE, ZSCORE, ZRANK |
<?php
// 基礎 SET/GET/EXISTS
$redis->set('message', 'Hello World');
$value = $redis->get('message'); // "Hello World"
$exists = $redis->exists('message'); // true
// 原子性計數器
$redis->set('counter', 0);
$redis->incr('counter'); // 1
$redis->incr('counter'); // 2
$redis->decr('counter'); // 1
// 指定步長增減
$redis->incrby('counter', 15); // 16
$redis->decrby('counter', 10); // 6
<?php
$redis->rpush('languages', 'french'); // [french]
$redis->rpush('languages', 'arabic'); // [french, arabic]
$redis->lpush('languages', 'english'); // [english, french, arabic]
$redis->lpush('languages', 'swedish'); // [swedish, english, french, arabic]
$redis->lpop('languages'); // 移除 swedish
$redis->rpop('languages'); // 移除 arabic
$redis->llen('languages'); // 2
$redis->lrange('languages', 0, -1); // 取得所有元素
$redis->lrange('languages', 0, 1); // 取得前兩個
<?php
$key = 'user:linus';
$redis->hset($key, 'age', 44);
$redis->hset($key, 'country', 'finland');
$redis->hset($key, 'occupation', 'software engineer');
// 批量設定
$redis->hmset($key, [
'age' => 44,
'country' => 'finland',
'occupation' => 'software engineer',
'reknown' => 'linux kernel'
]);
// 讀取單一欄位
$age = $redis->hget($key, 'age'); // 44
// 遞增數值欄位
$redis->hincrby($key, 'age', 1); // 45
// 取得所有欄位
$data = $redis->hgetall($key);
<?php
$key = 'countries';
$redis->sadd($key, 'china');
$redis->sadd($key, ['england', 'france', 'germany']);
$redis->sadd($key, 'china'); // 自動去重,被忽略
$redis->srem($key, ['england', 'china']);
$redis->sismember($key, 'england'); // false
$members = $redis->smembers($key); // ['france', 'germany']
Redis 將資料存放在記憶體中,透過過期機制避免佔用過多資源。常用指令:
<?php
$key = 'session:user_123';
$redis->expire($key, 3600); // 1 小時後過期
$redis->expireat($key, time() + 3600); // 同上
sleep(600); // 模擬經過 10 分鐘
$ttl = $redis->ttl($key); // 3000 秒(50 分鐘)
$redis->persist($key); // 永久保存
Redis 以其極致的效能、豐富的資料結構、支援主從複制與高可用架構,已成為現代應用架構中不可或缺的基礎設施。Facebook、Twitter、Instagram 等大型平台均大規模採用 Redis 替代 Memcached。開源社群持續貢獻補丁,功能日益完善(如 Redis 6.0 引入 ACL、執行緒 I/O、Redis 7.0 支援函數與模組 API 等)。
掌握 Redis 基礎操作與資料結構特性,能幫助開發者設計出高效能、可擴展的系統架構。