Predis

PHPキャッシュライブラリRedisクライアントNoSQL

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

スター履歴

predis/predis Star History
データ取得日時: 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');