Predis
GitHub概要
predis/predis
A flexible and feature-complete Redis/Valkey client for PHP.
スター7,727
ウォッチ208
フォーク993
作成日:2009年11月7日
言語:PHP
ライセンス:MIT License
トピックス
phppredisredisredis-clusterredis-sentinel
スター履歴
データ取得日時: 2025/10/22 08:07
キャッシュライブラリ
Predis
概要
PredisはPHP用のRedisクライアントライブラリで、RedisサーバーとValkey等のRESP(Redis Serialization Protocol)対応のkey-valueストアとの通信を可能にする柔軟で機能豊富なライブラリです。
詳細
Predis(プレディス)は純粋にPHPで書かれたRedisクライアントライブラリで、追加のC拡張を必要としません。TCP/IP(TLS/SSL暗号化含む)やUNIXドメインソケット経由での接続をサポートし、遅延接続と永続化接続の両方に対応しています。Redisの広範囲な機能をサポートしており、トランザクション、パイプライニング、クラスタリング、Pub/Sub、SCANコマンド群(SCAN、SSCAN、ZSCAN、HSCAN)の抽象化、カスタムコマンドの定義などが可能です。Laravelフレームワークでも標準サポートされており、PhpRedis拡張がインストールされていない環境でのフォールバック選択肢として利用されています。Composerによるパッケージ管理に対応し、PSR-4標準に準拠したオートローディングを提供しています。共有ホスティング環境やDockerコンテナ環境など、C拡張のインストールが困難な環境で特に重宝されています。
メリット・デメリット
メリット
- 純粋なPHP実装: C拡張不要で、どのPHP環境でも利用可能
- 豊富な接続オプション: TCP/IP、TLS/SSL、UNIXソケット対応
- Laravel統合: Laravelでの標準サポートと簡単な設定
- 高度なRedis機能: クラスタリング、パイプライニング、トランザクション対応
- カスタマイズ性: カスタムコマンドと接続クラスの定義が可能
- SCAN抽象化: PHPイテレーターベースのSCANコマンド群サポート
- Composer対応: 標準的なPHPパッケージ管理との統合
デメリット
- パフォーマンス: PhpRedis(C拡張)と比較して処理速度が劣る
- メモリ使用量: 純粋なPHP実装のため、メモリ消費量が多い傾向
- 大量処理時の制約: 高頻度・大容量のRedis操作には不向き
- デバッグの複雑さ: 内部実装がPHPのため、低レベルなデバッグが困難
- 型安全性: 動的型付けによる実行時エラーの可能性
主要リンク
書き方の例
基本接続
<?php
require 'vendor/autoload.php';
use Predis\Client as PredisClient;
// 基本接続
$redis = new PredisClient();
// 設定による接続
$redis = new PredisClient([
'scheme' => 'tcp',
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'database' => 0,
]);
// 接続確認
echo $redis->ping(); // PONG
基本的なキー・バリュー操作
// 文字列の設定と取得
$redis->set('user:1:name', 'John Doe');
$name = $redis->get('user:1:name');
echo $name; // John Doe
// 期限付きでキーを設定
$redis->setex('session:abc123', 3600, 'session_data');
// キーの存在確認
if ($redis->exists('user:1:name')) {
echo "キーが存在します";
}
// キーの削除
$redis->del('user:1:name');
リスト操作
// リストに要素を追加
$redis->lpush('notifications', 'message1');
$redis->rpush('notifications', 'message2');
$redis->lpush('notifications', 'message3');
// リストの内容を取得
$messages = $redis->lrange('notifications', 0, -1);
print_r($messages); // ['message3', 'message1', 'message2']
// リストから要素を取得
$latest = $redis->lpop('notifications');
echo $latest; // message3
ハッシュ操作
// ハッシュフィールドの設定
$redis->hset('user:1', 'name', 'Alice');
$redis->hset('user:1', 'email', '[email protected]');
$redis->hset('user:1', 'age', 30);
// 複数フィールドを一度に設定
$redis->hmset('user:2', [
'name' => 'Bob',
'email' => '[email protected]',
'age' => 25
]);
// ハッシュフィールドの取得
$name = $redis->hget('user:1', 'name');
$userData = $redis->hgetall('user:1');
print_r($userData);
パイプライニング
// パイプラインで複数コマンドを効率的に実行
$pipe = $redis->pipeline();
$pipe->set('key1', 'value1');
$pipe->set('key2', 'value2');
$pipe->set('key3', 'value3');
$pipe->get('key1');
$pipe->get('key2');
$results = $pipe->execute();
print_r($results); // [OK, OK, OK, 'value1', 'value2']
Pub/Sub
// Publisher
$redis->publish('notifications', 'Hello, subscribers!');
// Subscriber
$pubsub = $redis->pubSubLoop();
$pubsub->subscribe('notifications');
foreach ($pubsub as $message) {
switch ($message->kind) {
case 'subscribe':
echo "Subscribed to {$message->channel}\n";
break;
case 'message':
echo "Received: {$message->payload}\n";
break;
}
}
Laravel統合例
// config/database.php での設定
'redis' => [
'client' => env('REDIS_CLIENT', 'predis'),
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
],
'default' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_DB', '0'),
],
],
// Laravelでの使用例
use Illuminate\Support\Facades\Redis;
// 基本操作
Redis::set('user:1:name', 'John');
$name = Redis::get('user:1:name');
// キャッシュとしての使用
Cache::store('redis')->put('key', 'value', 3600);
$value = Cache::store('redis')->get('key');