首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP Redis 擴展完整指南:高效能鍵值存儲操作詳解

     編輯:PHP 綜合知識

什麼是 phpredis?

phpredis 是 PHP 的一個高效能擴展,專為 Redis 鍵值存儲系統設計。它提供了豐富的功能,包括鏈表排序、事務處理、發布/訂閱模式等,非常適合構建高效能的內存級業務模塊。本文整理了 Redis 官方推薦的命令使用技巧,幫助開發者快速上手。

安裝與基本連接

下載地址

項目地址:https://github.com/owlient/phpredis(支援 Redis 2.0.4+)

建立連接

$redis = new Redis();

// 短連接
$redis->connect('127.0.0.1', 6379, 2.5); // host, port, timeout(秒)

// 長連接(不會主動關閉)
$redis->pconnect('127.0.0.1', 6379, 2.5);

連接狀態檢查

$redis->ping(); // 返回 +PONG 表示連接正常

核心字符串操作

方法說明範例
get(key)獲取字符串值,不存在返回 false$val = $redis->get('key');
set(key, value)寫入字符串,成功返回 true$redis->set('key', 'value');
setex(key, ttl, value)帶過期時間寫入(秒)$redis->setex('key', 3600, 'value');
setnx(key, value)僅當 key 不存在時寫入$redis->setnx('key', 'value');
delete(key1, key2...)刪除指定 key,返回刪除數量$redis->delete('key1', 'key2');
ttl(key)獲取剩餘生存時間(秒)$ttl = $redis->ttl('key');
persist(key)移除過期時間,永久保存$redis->persist('key');
mset(array)批量設定多個 key-value$redis->mset(['k1'=>'v1', 'k2'=>'v2']);

事務與管道操作

// 事務模式(原子性執行)
$redis->multi(Redis::MULTI)
    ->incr('counter')
    ->set('status', 'active')
    ->exec(); // 執行事務

// 管道模式(高效能批量發送,無原子性保證)
$redis->multi(Redis::PIPELINE)
    ->set('a', 1)
    ->set('b', 2)
    ->exec();

// 取消事務
$redis->discard();

列表操作

基本操作

$redis->lPush('list', 'value');  // 左側插入
$redis->rPush('list', 'value');  // 右側插入
$redis->lPop('list');            // 移除並返回左側元素
$redis->rPop('list');            // 移除並返回右側元素
$redis->lSize('list');           // 獲取長度
$redis->lRange('list', 0, -1);   // 獲取範圍元素(-1 表示結尾)

進階操作

// 阻塞式彈出(適合佇列消費者)
$redis->blPop('key1', 'key2', 10); // 等待 10 秒

// 元素操作
$redis->lSet('list', 0, 'newVal');     // 指定索引設值
$redis->lTrim('list', 0, 99);          // 截取保留前 100 個
$redis->lRem('list', 'val', 2);        // 刪除 2 個 'val'
$redis->lInsert('list', Redis::AFTER, 'pivot', 'newVal'); // 在 pivot 後插入

// 彈出並推入另一列表
$redis->rpoplpush('srcList', 'dstList');

集合操作

$redis->sAdd('set', 'member');        // 添加成員
$redis->sRem('set', 'member');        // 移除成員
$redis->sMove('src', 'dst', 'mem');   // 移動成員
$redis->sIsMember('set', 'mem');      // 判斷是否存在
$redis->sCard('set');                 // 獲取基數
$redis->sPop('set');                  // 隨機彈出
$redis->sRandMember('set');           // 隨機獲取(不刪除)

// 集合運算
$redis->sInter('s1', 's2');           // 交集
$redis->sUnion('s1', 's2');           // 並集
$redis->sDiff('s1', 's2');            // 差集
$redis->sInterStore('out', 's1', 's2'); // 交集存儲
$redis->sMembers('set');              // 獲取所有成員

有序集合

$redis->zAdd('zset', 10, 'member');      // 添加(score 排序)
$redis->zRange('zset', 0, -1);           // 正序獲取
$redis->zRevRange('zset', 0, -1);        // 倒序獲取
$redis->zRangeByScore('zset', 0, 100);   // 按分數範圍查詢
$redis->zRem('zset', 'member');          // 刪除成員
$redis->zIncrBy('zset', 5, 'member');    // 增加分數
$redis->zRank('zset', 'member');         // 獲取排名(正序)
$redis->zCard('zset');                   // 獲取基數
$redis->zScore('zset', 'member');        // 獲取分數

// 多集合運算
$redis->zUnion('out', ['z1', 'z2'], [1, 2], 'SUM');
$redis->zInter('out', ['z1', 'z2'], [1, 2], 'MIN');

哈希表操作

$redis->hSet('hash', 'field', 'value');      // 設定字段
$redis->hGet('hash', 'field');               // 獲取字段
$redis->hMset('hash', ['f1'=>'v1', 'f2'=>'v2']); // 批量設定
$redis->hMGet('hash', ['f1', 'f2']);         // 批量獲取
$redis->hGetAll('hash');                     // 獲取所有
$redis->hDel('hash', 'field');               // 刪除字段
$redis->hExists('hash', 'field');            // 判斷字段存在
$redis->hIncrBy('hash', 'field', 10);        // 字段增量
$redis->hKeys('hash');                       // 獲取所有字段
$redis->hVals('hash');                       // 獲取所有值
$redis->hLen('hash');                        // 獲取字段數

鍵管理與服務器命令

$redis->keys('user*');           // 模式匹配鍵
$redis->exists('key');           // 判斷鍵存在
$redis->type('key');             // 獲取類型
$redis->rename('old', 'new');    // 重命名
$redis->expire('key', 300);      // 設定過期(秒)
$redis->expireAt('key', time()+300); // 設定過期時間戳
$redis->ttl('key');              // 獲取剩餘時間
$redis->persist('key');          // 移除過期
$redis->randomKey();             // 隨機獲取一個鍵
$redis->dbSize();                // 當前資料庫鍵數
$redis->select(1);               // 切換資料庫
$redis->move('key', 1);          // 移動鍵到其他庫
$redis->flushDB();               // 清空當前庫
$redis->flushAll();              // 清空所有庫

發布/訂閱模式

// 發布者
$redis->publish('channel', 'message');

// 訂閱者(回調模式)
$redis->subscribe(['channel1', 'channel2'], function($redis, $chan, $msg) {
    echo "收到訊息: $msg 來自 $chan";
});

排序功能

$redis->sort('key', [
    'by' => 'pattern_*',      // 外部鍵排序
    'limit' => [0, 10],       // 分頁
    'get' => 'pattern_*',     // 獲取外部值
    'sort' => 'desc',         // 排序方向
    'alpha' => true,          // 字母排序
    'store' => 'result_key'   // 結果存儲
]);

位操作

$redis->setBit('key', 10, 1);   // 設定位
$redis->getBit('key', 10);      // 獲取位
$redis->bitCount('key');        // 統計 1 的數量
$redis->bitOp('AND', 'dest', 'k1', 'k2'); // 位運算

最佳實踐建議

  • 優先使用長連接(pconnect)減少連接開銷
  • 批量操作使用 MGET/MSET/管道模式
  • 合理設定過期時間,避免內存洩漏
  • 大量寫入時考慮管道模式提升效能
  • 使用 Lua 腳本保證複雜操作原子性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved