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

PHP Redis 操作完整指南:核心命令、數據結構與最佳實踐

     編輯:PHP 相關知識

Redis 是高性能鍵值存儲,支援 String、List、Set、Sorted Set、Hash 等豐富數據結構,且提供原子操作、持久化(RDB/AOF)、主從複製、哨兵/集群高可用。PHP 通過 phpredis 擴展(C 實現,效能極高)與其交互。本文系統整理核心 API 並給出生產級用法建議。

連接與基礎配置

$redis = new Redis();
// 短連接
$redis->connect('127.0.0.1', 6379, 2.5); // host, port, timeout(秒)
// 長連接(FPM/CLI 長運行進程推薦)
$redis->pconnect('127.0.0.1', 6379, 2.5, 'persistent_id');
// 認證
$redis->auth('password');
// 選庫
$redis->select(0);
// 連接池建議:配合 php-fpm 進程模型,每進程持有一個 pconnect 連接

String(字符串)核心操作

命令說明示例
set設置鍵值$redis->set('key', 'val'); $redis->setex('key', 3600, 'val'); // 帶 TTL
get獲取值$val = $redis->get('key');
setnx僅不存在時設置(分佈式鎖基礎)$lock = $redis->setnx('lock:key', 1);
incr/decr原子自增/減$redis->incr('counter'); $redis->incrBy('counter', 10);
mset/mget批量設置/獲取$redis->mset(['k1'=>'v1','k2'=>'v2']); $vals = $redis->mget(['k1','k2']);
getSet原子獲取舊值並設置新值$old = $redis->getSet('key', 'newVal');

List(列表)核心操作

  • 推入/彈出:lPush/rPush、lPop/rPop、blPop/brPop(阻塞版,適合隊列消費者)。
  • 範圍讀取:lRange('key', 0, -1) 獲取全部,lIndex 獲取單元素。
  • 修剪:lTrim('key', 0, 99) 保留前 100 元素,實現固定長度隊列。
  • 插入/刪除:lInsert、lRem、lSet。

Set(集合)與 Sorted Set(有序集合)

類型核心命令典型場景
SetsAdd/sRem/sIsMember/sMembers/sInter/sUnion/sDiff/sPop/sRandMember標籤系統、共同好友、抽獎去重
Sorted SetzAdd/zRange/zRevRange/zScore/zIncrBy/zRem/zCount/zRank排行榜、延遲隊列(score=timestamp)、速率限制

Hash(哈希表)

適合存儲對象結構(如用戶信息),比序列化 String 更靈活、節省內存:

$redis->hSet('user:1001', ['name'=>'Tom','age'=>25,'city'=>'BJ']);
$redis->hGet('user:1001', 'name'); // Tom
$redis->hGetAll('user:1001'); // 全字段
$redis->hIncrBy('user:1001', 'login_count', 1); // 原子增長

通用鍵管理

  • exists('key')、del('key1','key2')、expire('key', 3600)、ttl('key')、persist('key')(移除過期時間)。
  • keys('pattern') **生產禁用**(阻塞單線程),改用 scan 迭代器:for ($it=NULL; $arr=$redis->scan($it, 'prefix:*', 100);) { ... }。

事務與 Lua 腳本

// 事務(樂觀鎖 WATCH)
$redis->watch('key');
$val = $redis->get('key');
$redis->multi();
$redis->set('key', $val + 1);
$redis->exec(); // 若 key 被外部修改,exec 返回 false,需重試

// Lua 腳本(原子性更強,推薦替代事務)
$lua = "local v = redis.call('GET', KEYS[1]) if v then return redis.call('SET', KEYS[1], v+ARGV[1]) else return redis.call('SET', KEYS[1], ARGV[1]) end";
$redis->eval($lua, 1, 'counter', 1);

生產環境最佳實踐清單

  1. 連接復用:FPM 用 pconnect,Swoole/Workerman 用連接池;避免頻繁 connect/close。
  2. Key 設計規範:business:module:id:field,如 order:info:10001:status,設定統一前綴便於維護。
  3. 序列化選擇:簡單值用 String,對象用 Hash 或 JSON(json_encode),避免 PHP serialize(跨語言不兼容、安全風險)。
  4. 大 Key 拆分:超大 Hash/List/Set 拆分為多個小 Key,防止阻塞、內存碎片、遷移困難。
  5. 監控告警:關注 used_memory、connected_clients、keyspace_hits/misses、slowlog、replication lag。
  6. 熔斷降級:Redis 不可用時快速失效,返回默認值/走 DB,避免雪崩。

熟練掌握 Redis 數據結構與 PHP 操作 API,能讓你的應用在高併發、實時計數、分佈式鎖、緩存穿透防護等場景游刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved