predis は、PHP が Redis に接続するための操作ライブラリです。完全に PHP で書かれており、多くの名前空間とクロージャーを使用するため、PHP5.3 以降のみをサポートします。そのため、測定されたパフォーマンスは平均で 25,000 回の読み取りと書き込みです。毎秒 c に変更されると思います。 この言語で書かれた PHP は、拡張後 (たとえば、C を使用して phpredis https://github.com/owlient/phpredis を拡張する) にパフォーマンスが大幅に向上します。
セッション データを Redis に保存するのも非常に簡単です: session.save_handler = redis session.save_path = “tcp://127.0.0.1:6379”
以下はいくつかの操作の概要であり、継続的に更新されます。
- //autoload を使用して関連ライブラリをロードします。ここでの焦点は $file;
- spl_autoload_register(function($class) {
- $file = __DIR__.'/lib/Predis/'.$class.' を要求することです。 php ';
- if (file_exists($file)) {
- require $file;
- return true;
- }
- });
-
- //接続 IP、ポート、および対応するデータベースを構成します
- $server = array(
- 'host' => '127.0.0.1',
- 'port' => 6379,
- 'database' = > ; 15
- );
- $redis = new Client($server);
-
- //通常の set/get 操作
- $redis->set('library', 'predis');
- $retval = $redis- > ;get('library');
- echo $retval; //'predis' を表示
-
- //setex 保存時間制限を設定します
- $redis->setex('str', 10, 'bar');ストレージの有効期間が 10 秒であることを示します
-
- //setnx/msetnx は add 操作と同等であり、既存の値を上書きしません
- $redis->setnx('foo',12); //true
- $redis ->setnx( 'foo',34); //false
-
- //set の変形である getset 操作、結果は置換前の値を返します
- $redis->getset('foo',56);/ /returns 34
-
- // incrby/incr/decrby/decr 値を増減します
- $redis->incr('foo') //foo は 57
- $redis->incrby('foo',2) ); //foo は 59
-
- //exists は特定の値が存在するかどうかを検出します
- $redis->exists('foo');//true
-
- //del は削除します
- $redis->del('foo ');//true
-
- //型の検出、文字列は文字列を返し、リストはリストを返し、セットテーブルはset/zsetを返し、ハッシュテーブルはハッシュを返します
- $redis->type('foo');//ではありません存在し、なしを返します
- $redis ->set('str','test');
- $redis->type('str'); //文字列、文字列を返します
-
- //既存の文字列に接続を追加します
- $redis-> ;append('str','_123'); //蓄積された文字列長 8 を返します、今回は str は 'test_123' です
-
- //setrange 部分置換操作
- $redis->setrange(' str', 0,'abc'); //Return 3、パラメータ 2 が 0 の場合、set 操作と同等
- $redis->setrange('str',2,'cd');//Return 4、つまり、文字の後の 2 番目の Replace から開始すると、'str' は 'abcd' になります
-
- //取得操作の substr 部分
- $redis->substr('str',0,2);// 0番目から始まり0番目までの2文字、合計3個を取得するという意味です return 'abc'
-
- //strlen 文字列の長さを取得します
- $redis->strlen('str'); //Return 4
-
- / /setbit/getbit ビットの保存と取得
- $redis->setbit('binary',31,1); // ビッグエンディアンまたはスモールエンディアンの問題があることを示します。問題はありません。getbit では問題ありません。
- $redis-> ;getbit('binary',31); //return 1
-
- //keys は * 記号と ? 記号をサポートします。 Character)
- $redis->set('foo1',123);
- $redis->set('foo2',456);
- $redis->keys('foo*'); // を返します。 foo1 と foo2 の配列
- $redis->keys('f?o?' ); //上記と同じ
-
- //randomkey はランダムにキーを返します
- $redis->randomkey(); //返される場合もあります'foo1' または 'foo2'、または redis に存在するその他のキー
-
- //rename /renamenx キーの名前を変更します。違いは、renamenx では既存のキーへの変更が許可されていないことです
- $redis->rename('str' ,'str2'); //もともと 'str' という名前のキーを 'str2' に変更します
-
- //expire はキーと値の適時性を設定し、ttl は残りの有効期間を取得し、persist は永続ストレージにリセットされます
- $redis- >expire('foo', 1); //有効期間を 1 秒に設定します
- $redis->ttl('foo'); //有効期間の値 1s を返します
- $redis->expire(' foo'); //期限切れ動作をキャンセルします
-
- //dbsize 現在の Redis データベース内のレコードの総数を返します
- $redis->dbsize();
-
- /*
- Queue オペレーション
- */
-
- // rpush/rpushx 順序付きリスト操作、キューから要素を挿入します
- //lpush/lpushx rpush/rpushx の違いは挿入です。上記と同じようにキューの先頭に移動します。「x」は既存のキーのみを操作することを意味します
- $ redis->rpush('fooList', 'bar1'); //長さ 1 のリストを返します
- $redis->lpush('fooList', 'bar0'); //リストの長さ 2 を返します
- $redis->rpushx('fooList', 'bar2'); //3 を返します。rpushx は既存のキューでのみ機能します。加算、それ以外の場合は 0 を返します
- //llen は現在のリストの長さを返します
- $redis->llen(' fooList');//3
-
- //lrange はキュー内の範囲の要素を返します
- $redis->lrange( 'fooList',0,1); //返される配列には、次の合計 2 つの要素が含まれます。 0 番目から 1 番目まで
- $redis->lrange('fooList',0,-1); // 0 番目から最後のものを返すことは、redis では負の数値がよく使用されることに注意してください。以下同様
-
- //lindexは指定されたシーケンス位置のリスト要素を返します
- $redis->lindex('fooList',1); //Return 'bar1'
-
- //lset の指定された位置の値を変更しますthe queue
- $redis->lset('fooList',1,'123');//位置 1 の要素を変更し、true を返します
-
- / /lrem キューの左から指定された数の文字を削除します
- $redis->lrem('fooList',1,'_'); //キュー (存在する場合) の左から 1 文字 '_' を削除します (右から -1 を使用します)
-
- //lpop/ rpop はスタック構造と同様に左端または右端の要素をポップ (および削除) します
- $redis->lpop('fooList'); //'bar0'
- $redis- >rpop('fooList'); //' bar2'
-
- //ltrim キューの変更、左からいくつかの要素を保持し、残りを削除
- $redis->ltrim('fooList', 0,1) //左から0番目から1番目の要素を保持する
-
- //rpoplpush は、あるキューから要素をポップし、別のキューにプッシュします
- $redis->rpush('list1','ab0');
- $redis-> ;rpush('list1','ab1');
- $redis->rpush('list2','ab2');
- $redis->rpush('list2','ab3');
- $redis->rpoplpush('list1','list2');//結果 list1 =>array('ab0'),list2 =>array('ab1','ab2','ab3')
- $ redis->rpoplpush('list2','list2');//同じキューにも適用され、最後の要素を先頭に移動 list2 =>array('ab3','ab1','ab2')
-
- //linsert はキューの途中で指定された要素の前または後に要素を挿入します
- $redis->linsert('list2', 'before','ab1','123') //要素 'ab1 の前を示します' Insert '123'
- $redis->linsert('list2', 'after','ab1','456') //要素 'ab1' の後に '456' を挿入することを示します
-
- //blpop/brpop のブロックそして、キューが空でなくなるまで待ってから、左端または右端の要素をポップアウトします (この関数は、PHP 以外では非常に便利であると言えます)
- //brpoplpush もブロックして操作を待ちます。結果は次と同じです。 rpoplpush
- $redis ->blpop('list3',10); //list3 が空の場合、空でない場合は最初の要素がポップされるまで待機します
-
- /**
- テーブル操作の設定
- */
-
- / /sadd は要素を追加し、true を返し、false を繰り返し返します
- $redis->sadd('set1','ab');
- $redis->sadd('set1','cd');
- $ redis->sadd('set1','ef');
-
- //srem 指定された要素を削除します
- $redis->srem('set1','cd') //「cd」要素を削除します
-
- //spop 最初の要素をポップします
- $redis->spop('set1');
-
- //smove 現在のセットテーブルの指定された要素を別のセットテーブルに移動します
- $redis->sadd('set2' ,'123');
- $redis->smove('set1','set2','ab');//'set1' の 'ab' を 'set2' に移動し、true または false を返します
-
- // scard は現在のセットテーブルを返します 要素の数
- $redis->scard('set2');//2
-
- //sismember 要素が現在のテーブルに属しているかどうかを判断します
- $redis->sismember('set2' ,'123'); //true または false
-
- //smembers は現在のテーブルのすべての要素を返します
- $redis->smembers('set2'); //array('123','ab');
-
- //sinter/sunion/sdiff は、テーブル内の要素の交差/和集合/補数を 2 つ返します
- $redis->sadd('set1','ab');
- $redis->sinter('set2' ,'set1'); //配列 ('ab') を返します
-
- //sinterstore/sunionstore/sdiffstore 2 つのテーブルの交差/和集合/補要素を 3 番目のテーブルにコピーします
- $redis->set('foo) ',0);
- $ redis->sinterstore('foo','set1'); //これは、'set1' の内容を 'foo' にコピーし、'foo' を set テーブルに変換することと同等です
- $ redis->sinterstore ('foo',array('set1','set2')); //'set1' と 'set2' の同じ要素を 'foo' テーブルにコピーし、'foo' の元の内容を上書きします。 '
-
- // srandmember はテーブル内のランダムな要素を返します
- $redis->srandmember('set1');
-
- /**
- オーダーセットテーブルオペレーション
- */
-
- //sadd は要素を追加し、シリアル番号を設定します、 true を返し、繰り返し false を返します
- $ redis->zadd('zset1',1,'ab');
- $redis->zadd('zset1',2,'cd');
- $redis-> ;zadd('zset1',3, 'ef');
-
- //zincrby は、指定された要素のインデックス値を増減し、要素の順序を変更します
- $redis->zincrby('zset1',10, 'ab');//11 を返します
-
- // zrem は指定された要素を削除します
- $redis->zrem('zset1','ef'); //true または false
-
- //zrange は、テーブル内の指定された範囲を位置順に並べます
- $redis->zrange( 'zset1',0,1); //位置 0 と 1 の間の要素を返します (2 つ)
- $redis->zrange('zset1', 0,-1); //位置 0 と最後の要素を返します 1 つの要素の間の要素 (すべての要素に相当)
-
- //zrevrange 上記と同様に、テーブル内の指定された範囲の要素を逆順に返します
- $redis->zrevrange('zset1',0,-1); //要素の順序は zrange
- と逆です
- //zrangebyscore/zrevrangebyscore はテーブル内の指定されたインデックス間隔の要素を順序/降順で返します
- $redis->zadd('zset1',3,'ef');
- $redis->zadd('zset1',5,'gh');
- $redis->zrangebyscore('zset1', 2,9); //インデックス値 2 ~ 9 gh' の間の要素を返します
- //パラメータ形式
- $redis->zrangebyscore('zset1',2,9,'withscores) '); //インデックス値 2 ~ 9 の間の要素を返し、インデックス値を含む array(array(' ef',3),array('gh',5))
- $redis->zrangebyscore('zset1 ',2,9,array('withscores' =>true,'limit'=>array(1 , 2))); //インデックス値 2 ~ 9 の間の要素を返します。 true はインデックス値を含むことを意味し、'limit'=>array(1, 2) は最大 2 つの項目を返すことを意味し、結果は array(array('ef',3),array('gh',5)) になります。
-
- //zunionstore/zinterstore 複数のテーブルの結合/交差を別のテーブルに格納します
- $redis-> zset3',array('zset1','zset2','zset0')); 'zset1'、'zset2'、'zset0' を 'zset3' に結合
- //その他のパラメータ
- $redis->zunionstore('zset3',array('zset1','zset2'),array('weights' => array(5,0)));//weights パラメータは和集合を表す重みを表します 最終値が 5 より大きい要素は最初にランク付けされ、0 より大きい要素は最後にランク付けされます
- $redis-> ;zunionstore('zset3',array('zset1','zset2'),array('aggregate' => 'max' ));//'aggregate' => は、結合後の同じ要素は大きい値または小さい値を取ります
-
- //zcount はインデックス範囲内の要素の数をカウントします
- $redis ->zcount('zset1',3,5);//2
- $redis- >zcount('zset1','(3',5)); //'(3' はインデックス値が 3 であることを意味します。5 の間 (3 は含まない) を示すために '(5' を使用することもできます)上限は 5 ですが、5 は含まれません
-
-
- //zcard は要素の数をカウントします
- $redis->zcard('zset1');//4
-
- //zscore 要素のインデックスをクエリします🎜$redis->zscore('zset1','ef');//3
-
- //zremrangebyscore インデックス範囲内の要素を削除します
- $redis->zremrangebyscore('zset1',0,2); //削除0 ~ 2 ('ab'、'cd') のインデックスを持つ要素の場合、削除された要素の数 2 を返します
-
- //zrank/zrevrank はテーブルの順序/降順で要素の位置を返します (インデックスではありません)
- $redis-> ;zrank('zset1','ef');//最初の要素であるため 0 を返します; zrevrank は 1 (最後の要素) を返します
-
- //zremrangebyrank は、指定された位置範囲の要素を削除しますtable
- $redis- >zremrangebyrank('zset1',0,10); //位置 0 ~ 10 の要素を削除し、削除された要素の数 2 を返します
-
- /**
- ハッシュテーブル操作
- */
-
- //hset /hget ハッシュ テーブルのデータにアクセス
- $redis->hset('hash1','key1','v1'); //キー 'key1' と値 'v1' を持つ要素をハッシュ 1 テーブルに保存します
- $redis-> ; hset('hash1','key2','v2');
- $redis->hget('hash1','key1'); // テーブル 'hash1' のキー 'key1' の値を取得して返します。 ' v1'
-
- //hexists 指定されたキーがハッシュテーブルに存在するかどうかを返します
- $redis->hexists ('hash1','key1'); //true または false
-
- //hdel で指定されたキーを削除しますハッシュ テーブル要素
- $redis->hdel('hash1','key2'); //true または false
-
- //hlen はハッシュ テーブル要素の数を返します
- $redis->hlen('hash1') ; //1
-
- //hsetnx は要素を追加しますが、繰り返すことはできません
- $redis->hsetnx('hash1','key1','v2') //false
- $redis->hsetnx(' hash1','key2 ','v2'); //true
-
- //hmset/hmget ハッシュ テーブルの複数の要素にアクセスします
- $redis->hmset('hash1',array('key3'=>') v3',' key4'=>'v4'));
- $redis->hmget('hash1',array('key3','key4')); //対応する値を返します array('v3') ,'v4' )
-
- //hincrby は指定されたキーを蓄積します
- $redis->hincrby('hash1','key5',3); //3 を返します
- $redis->hincrby('hash1',' key5', 10); //Return 13
-
- //hkeys ハッシュテーブル内のすべてのキーを返します
- $redis->hkeys('hash1') //Return array('key1','key2','key3); ',' key4','key5')
-
- //hvals ハッシュテーブル内のすべての値を返します
- $redis->hvals('hash1') //Return array('v1','v2', 'v3',' v4',13)
-
- //hgetall はハッシュ テーブル要素全体を返します
- $redis->hgetall('hash1') //array('key1'=>'v1',' を返します) key2'=>' v2','key3'=>v3','key4'=>'v4','key5'=>13)
- /**
- 並べ替え操作
- */
- / /sort ソート
- $redis ->rpush('tab',3);
- $redis->rpush('tab',2);
- $redis->rpush('tab',17);
- $ redis->sort( 'tab'); //配列(2,3,17)を返します
- //パラメータを使用できます、array('sort' => 'desc','limit' => 配列(1, 2))
- $redis->sort('tab',array('sort' => 'desc')) //降順に並べて、array(17,3,2)を返します
- $ redis->sort('tab ',array('limit' => array(1, 2))); //連続した位置にある 1 の 2 つの要素を返します (ここでの 2 は位置ではなく数値を指します)、 return array(3,17 )
- $redis->sort('tab',array('limit' => array('alpha' => true))); // 最初の文字でソートして return array( 17,2,3), 17 の最初の文字が '1' なので、1 位になります
- $redis->sort('tab',array('limit' => array('store' => 'owned'))); // 永続的なソートを表し、要素の数を返します
- $redis->sort('tab',array('limit' => array('get' => 'pre_*') ))); //ワイルドカードが使用されます '*' フィルター要素は 'pre_' で始まる要素のみを返すことを意味します
-
- /**
- redis 管理操作
- */
-
- //select は操作するデータベースを指定します
- $redis-> select('mydb'); / /mydb として指定し、存在しない場合は作成します
-
- //flushdb 現在のライブラリをクリアします
- $redis->flushdb();
-
- //move の要素を移動します現在のライブラリを他のライブラリに移動
- $redis->set('foo ', 'bar');
- $redis->move('foo', 'mydb2') //'mydb2' ライブラリが存在する場合
-
- //info はサービスのステータス情報を表示します
- $redis->info( ; //サーバーをクリアします
-
- //サーバーのデータをディスクに同期的に保存します
- $redis->save();
- //サーバーのデータをディスクに保存します非同期的に
- $redis->bgsave();
- //??
- $redis->gt;bgrewriteaof();
- //ディスクが最後に更新された時刻を返します
- $redis->lastsave();
-
- //複数の Key-Value を設定/取得します
- $mkv = array(
- 'usr: 0001' => '最初のユーザー',
- 'usr:0002' => '2 番目のユーザー',
- 'usr:0003' = > '3 番目のユーザー'
- );
- $redis->mset($mkv ); //複数のキーに対応するストレージ値
- $retval = $redis->mget(array_keys($mkv)) / /複数のキーに対応する値を取得
- print_r($retval);
-
- //バッチ操作
- $replies = $redis->pipeline(function($pipe) {
- $pipe->ping();
- $pipe->flushdb();
- $pipe->incrby('counter', 10); //インクリメント操作
- $pipe->incrby('counter', 30);
- $pipe->exists ('カウンター');
- $pipe->get('カウンター');
- $pipe->mget('does_not_exist', 'counter');
- });
- print_r($replies);
-
- //CAS,事务性操作
-
- function zpop($client, $zsetKey) {
- $element = null;
- $options = array(
- 'cas' => true , // CAS 操作をサポートして初期化します
- 'watch' => $zsetKey, // 変更を検出するために監視する必要があるキー
- 'retry' => 3, // 中止されたトランザクションの再試行回数
- ; // クライアントは例外で救済します。
- );
-
- $txReply = $client->multiExec($options, function($tx)
- use ($zsetKey, &$element) {
- @list($ element) = $tx->zrange($zsetKey, 0, 0);
- if (isset($element)) {
- $tx->multi(); // CAS では、MULTI を明示的に呼び出す必要があります。 .
- $tx->zrem($zsetKey, $element);
- }
- });
- return $element;
- }
- $zpopped = zpop($redis, 'zset');
- echo isset($zpopped) ? "ZPOPed $zpopped" : "ZPOP には何もありません!", "n";
-
- //对存取的キー加前缀,如: 'nrk:'
- $redis->getProfile()->setPreprocessor(new KeyPrefixPreprocessor('nrk:'));
-
- // 分散形式で保存されるいくつかの方法
- $multiple_servers = array(
- array(
- 'host' => '127.0.0.1',
- 'port' => 6379,
- 'データベース' => 15,
- 'エイリアス' => '最初',
- ),
- 'ホスト' => '127.0.0.1',
- 'ポート' => 6380,
- 'データベース' => 15,
- 'エイリアス' => 'セカンド',
- ),
- );
-
- PredistributionIDistributionStrategy;
-
- class NaiveDistributionStrategy は IDistributionStrategy {
- private $_nodes, $_nodesCount;
-
- public function __constructまたは( ) {
- $this->_nodes = array();
- $this->_nodesCount = 0;
- }
-
- public function add($node, $weight = null) {
- $this->_nodes[] = $node;
- $this->_nodesCount++;
- }
-
- public function Remove($node) {
- $this->_nodes = array_filter($this->_nodes, function($n) use($node) ) {
- return $n !== $node;
- });
- $this->_nodesCount = count($this->_nodes);
- }
-
- public function get($key) {
- $count = $this->_nodesCount;
- if ($count === 0) {
- throw new RuntimeException('接続なし');
- }
- return $this->_nodes[$count > 1? abs(crc32($key) % $count) : 0];
- }
-
- public functiongenerateKey($value) {
- return crc32($value);
- }
- }
-
- //構成键分布戦略略
- $options = array(
- 'key_distribution' => new NaiveDistributionStrategy(),
- );
-
- $redis = new PredisClient($multiple_servers, $options);
-
- for ($i = 0; $i set("key:$ i", str_pad($i, 4, '0', 0));
- $redis->get("key:$i");
- }
-
- $server1 = $redis->getClientFor('first ')->info();
- $server2 = $redis->getClientFor('second')->info();
-
- printf("サーバー '%s' には %d 個のキーがありますが、サーバー '%s ' には %d 個のキーがあります。n",
- 'first', $server1['db15']['keys'], 'first', $server2['db15']['keys']
- );
-
复制代コード
|