Redis 客户端 for PHP: Predis 和 PhpRedis
Redis 是一种高性能的内存键值存储数据库。要从 PHP 与 Redis 交互,主要有两种方式:纯 PHP 库 Predis 和原生扩展 PhpRedis。本文将详细介绍这两种工具,包括它们的安装、基本命令以及实际使用示例。
1. Predis – 纯 PHP Redis 客户端
Predis 是一个完全用 PHP 编写的库,无需安装额外扩展。它非常适合那些无法编译 C 扩展的环境。
通过 Composer 安装
composer require predis/predis基本连接与示例
require 'vendor/autoload.php';
use Predis\\Client;
// 默认连接 (localhost:6379)$redis = new Client();
// 或者显式指定参数$redis = new Client([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379, 'password' => 'secret', // 如果设置了密码]);
// 操作简单字符串$redis->set('user:1:name', '阿列克谢');echo $redis->get('user:1:name'); // 阿列克谢
// 操作列表$redis->rpush('queue:tasks', 'task1', 'task2', 'task3');$task = $redis->lpop('queue:tasks'); // task1
// 操作哈希$redis->hset('user:1', 'email', 'alex@example.com');$redis->hset('user:1', 'age', 30);$userData = $redis->hgetall('user:1');// ['email' => 'alex@example.com', 'age' => '30']带 TTL(生存时间)的缓存
// 保存数据 1 小时 (3600 秒)$redis->setex('weather:spb', 3600, '{"temp": 15, "humidity": 70}');
// 检查键是否存在if ($redis->exists('weather:spb')) { echo $redis->get('weather:spb');} else { // 请求外部 API 并保存 $data = json_encode(['temp' => 15, 'humidity' => 70]); $redis->setex('weather:spb', 3600, $data);}任务队列(列表)
// 将任务添加到队列$redis->rpush('email:queue', json_encode([ 'to' => 'user@example.com', 'subject' => '欢迎', 'body' => '欢迎您!']));
// Worker:获取任务(阻塞模式)while (true) { $taskRaw = $redis->blpop('email:queue', 5); // 超时 5 秒 if ($taskRaw) { $task = json_decode($taskRaw[1], true); sendEmail($task['to'], $task['subject'], $task['body']); }}2. PhpRedis – 原生 C 扩展
PhpRedis 是一个用 C 编写的 PHP 扩展。由于开销极小,它的运行速度远快于 Predis。需要通过 PECL 安装或编译。
安装
# 通过 PECL(推荐)pecl install redis
# 或手动安装 (Linux)git clone https://github.com/phpredis/phpredis.gitcd phpredisphpize./configuremake && make install# 在 php.ini 中添加 extension=redis.so使用示例
// 连接$redis = new Redis();$redis->connect('127.0.0.1', 6379);$redis->auth('password'); // 如果设置了密码
// Set / Get$redis->set('counter', 1);$redis->incr('counter');echo $redis->get('counter'); // 2
// 操作集合$redis->sadd('users:online', 'user1', 'user2', 'user3');$onlineCount = $redis->scard('users:online'); // 3$isOnline = $redis->sismember('users:online', 'user2'); // true
// Pub/Sub(发布者)$redis->publish('channel:news', '新消息!');
// Pub/Sub(订阅者 – 独立脚本)$redis->subscribe(['channel:news'], function ($redis, $channel, $message) { echo "从 $channel 收到: $message";});缓存复杂结构
// 缓存 SQL 查询结果$cacheKey = 'articles:l