ホームページ >バックエンド開発 >PHPチュートリアル >php・redisの操作を詳しく解説
phpredis は redis の php の拡張機能であり、非常に効率的で、メモリレベルのモジュールのビジネス関係を作成するのに非常に便利です。
ダウンロードアドレスは次のとおりです:
https://github.com/owlient/phpredis (redis 2.0.4 をサポート)
Redis::__construct コンストラクター
$redis = new Redis();
接続、オープンリンク Redis サービス
パラメータ
ホスト: 文字列、サービスアドレス
ポート: int、ポート番号
タイムアウト: float、リンク期間 (オプション、デフォルトは 0、リンク時間に制限なし)
注: 時間もありますredis.confでは、デフォルトは300です
pconnect、popenは自動的にリンクを閉じません
上記を参照してください
setOptionでredisモードを設定します
getOptionでredis設定モードを表示します
ping to接続ステータスの表示
KEY 関連の操作
DEL
指定されたキーを削除します。
キーが存在しない場合、コマンドは無視されます。
時間計算量:
O(N)、N は削除されるキーの数です。
単一の文字列型キーを削除する場合の時間計算量は O(1) です。
単一のリスト、セット、順序付きセット、またはハッシュ テーブル タイプのキーを削除すると、時間計算量は O(M) になります。M は上記のデータ構造内の要素の数です。
戻り値:
削除されたキーの数。
#
1: 単一のキーを削除します
$ redis-& gt; set ('myname', 'ikodota');私の名前').'
;'; # 戻り値: ikodota
$redis->del('myname');# TRUE(1) を返す
var_dump($redis->get('myname') ); # bool(false) を返す
# ケース 2: 存在しないキーを削除する
if(!$redis->exists('fake_key')) # 存在しない
var_dump($redis->del( 'fake_key')); # Return int(0)
# ケース 3: 複数のキーを同時に削除する
$array_mset=array('first_key'=>'first_val',
'second_key'=>'first_val' ,
'third_key '=>'third_val');
$redis->mset($array_mset); #MSET を使用して複数の値を一度に保存する
$array_mget=array('first_key','first_key','third_key' ) ;
var_dump($redis->mget($array_mget)); #複数の値を一度に返す //array(3) { [0]=> string(9) "first_val" [1]=> string(10) "first_val" [2]=> string(9) "third_val" }
$redis->del($array_mget); #複数のキーを同時に削除
var_dump($redis->) ;mget( $array_mget)); #Return array(3) { [0]=> bool(false) [2]=>
KEYS
KEYS pattern
指定されたパターンに一致するキーを検索します。
キー *データベース内のすべてのキーを押します。
キー h?llo は hello、hello、hxllo などをヒットします。
キー h*llo は hllo や heeeeeello などをヒットします。
KEYS h[ae]llo は hello と hello をヒットしますが、hello ではありません。
特殊記号は "" で区切られます
時間計算量:
O(N)、N はデータベース内のキーの数です。
戻り値:
指定されたパターンに一致するキーのリスト。
警告: KEYS は非常に高速ですが、大規模なデータベースで使用すると依然としてパフォーマンスの問題が発生する可能性があります。データ セットから特定のキーを見つける必要がある場合は、Set を使用することをお勧めします。
//KEYS
#$redis->FLUSHALL();
$array_mset_keys=array('one'=>'1',
「2」=>」 2',
'three '=>'3',
'four'=>'4'); #MSET を使用して複数の値を一度に保存します
var_dump($ redis->keys('*o*')); //array(3) { [0]=> string(4) "2" [2] => string(3) "1" }
var_dump($redis->keys('t??')); //array(1) { [0]=> 2 つ" }
var_dump($redis->keys('t[w]*')); //array(1) { [0]=> string(3) "2 つ" }
print_r($redis- >keys ('*')); //Array ( [0] => 4 [1] => 3 [2] => 2 [3] => 1 )
RANDOMKEY
現在のデータベースからキーをランダムに返します (削除ではありません)。
時間計算量:
O(1)
戻り値:
データベースが空でない場合、キーを返します。
データベースが空の場合は、nil を返します。
//RANDOMKEY
$redis->FLUSHALL()
# ケース 1: データベースが空ではない
$array_mset_randomkey=array('fru)それ' =>'リンゴ' ,
print_r($ redis->keys('*')); # データベース内のすべてのキーを表示して、RANDOMKEY がキーを削除しないことを証明します//Array ( [0] => food [1] => ; ドリンク [2] => フルーツ )
# ケース 2: データベースが空です
$redis->flushdb() # 現在のデータベース内のすべてのキーを削除します
var_dump($redis->randomkey() ); //bool(false)
TTL
TTL キー
指定されたキーの残りの有効期間 (秒単位) を返します。
時間計算量:
O(1)
戻り値:
キーの残りの生存時間 (秒単位)。
キーが存在しない場合、または生存時間が設定されていない場合は、-1を返します。
//TTL
# ケース 1: TTL でキー
$redis->flushdb();
//$redis->set('name','ikodota'); # キーを設定します
$redis->expire('name',30); #生存時間を 30 秒に設定します //return (integer) 1
echo $redis->get('name') //return ikodota
echo $ redis->ttl('name'); //(integer) 25
//echo $redis->ttl('name'); # 30 秒経過、名前は期限切れ //(integer) -1
var_dump($redis->get('name')); # 期限切れのキーは削除されます
# ケース 2: TTL なしのキー
$redis->set( 'site' ,'wikipedia.org');//OK
var_dump($redis->ttl('site'));//int(-1)
# ケース 3: 存在しないキー
$ redis-> ;EXISTS('not_exists_key');//int(0)
var_dump($redis->TTL('not_exists_key'));//int(-1)
EXISTS
EXISTS キー
チェック指定されたキーが存在する場合。
時間計算量:
O(1)
戻り値:
キーが存在する場合は 1 を返し、それ以外の場合は 0 を返します。
//存在する
echo '< br> br>'; ($redis->exists('db')); # キーが存在します //bool(true)
$redis->del('db'); # キーを削除します //int(1)
var_dump($redis) - >存在する( 'db'))#キーは存在しませんof 0) 指定されたデータベース db に移動します。
現在のデータベース (ソース データベース) と指定されたデータベース (ターゲット データベース) に同じ名前の指定されたキーがある場合、またはそのキーが現在のデータベースに存在しない場合、MOVE は効果がありません。
したがって、この機能を使用して MOVE をロック プリミティブとして使用することもできます。
時間計算量:
O(1)
戻り値:
移動が成功した場合は 1 を返し、失敗した場合は 0 を返します。
//MOVE
echo '
MOVE
'
# ケース 1: キーが現在のデータベースに存在します
$redis-> ;SELECT( 0 ); # redis はデフォルトでデータベース 0 を使用します。明確にするために、ここでも明示的に指定します。 //OK
$redis->SET('song',"秘密基地 - ゾーン") //OK
var_dump ($redis->MOVE('song',1)); # 曲をデータベースに移動します1 //bool(true)
# ケース 2: キーが存在しない場合
$redis->SELECT(1);
var_dump ($redis->EXISTS('fake_key'));//bool ( false);
var_dump($redis->MOVE('fake_key', 0)); # 存在しないキーをデータベース 1 からデータベース 0 に移動しようとしましたが失敗しました) //bool(false)
$redis ->SELECT(0); # データベース 0 を使用します
var_dump($redis->EXISTS('fake_key')) # fake_key が存在しないことを確認します //bool(false)
# ケース 3: ソース データベースとターゲット データベースが同じキーを持つ場合
$redis->SELECT(0); # データベース 0 を使用
$redis->SET('favorite_fruit',"banana");
$redis->SELECT(1); # データベース 1 を使用します
$redis->SET('favorite_fruit',"apple"); # データベース 0 を使用します、そして favourite_fruit をデータベース 1 に移動しようとしました
var_dump($redis->MOVE('favorite_fruit',1)); # 2 つのデータベースは同じキーを持っているため、MOVE は失敗しました //return bool(false)
echo $redis ->GET('favorite_fruit'); # データベース 0 の favourite_fruit は変更されていません //return バナナ
$redis->SELECT(1);
echo $redis->GET('favorite_fruit'); # データベース 1 の favourite_fruit も //return apple
RENAME
RENAME key newkey
キーの名前を newkey に変更します。
keyとnewkeyが同じ場合、またはkeyが存在しない場合はエラーを返します。
newkey がすでに存在する場合、RENAME コマンドは古い値を上書きします。
時間計算量:
O(1)
戻り値:
名前の変更が成功すると OK を返し、失敗するとエラーを返します。
//RENAME
echo '
RENAME
'
# ケース 1: キーが存在し、newkey が存在しない
$redis-&g t;セット( 'メッセージ',"hello world");
var_dump($redis->RENAME('message','greeting')); //bool(true)
var_dump($redis->EXISTS('message' ) ; 、エラーを返します、php は false を返します
var_dump($redis->RENAME('fake_key','never_exists')) //bool(false)
# ケース 3: newkey がすでに存在する場合、RENAME古いものを上書きします newkey
$redis->SET('pc',"lenovo");
$redis->SET('personal_computer',"dell");
var_dump($redis->RENAME( 'pc','personal_computer')); //bool(true)
var_dump($redis->GET('pc')) //(nil) bool(false)
var_dump($redis->GET('pc'); ('personal_computer') ;
newkey が存在しない場合に限り、キーを newkey に変更します。
エラー状況は RENAME と同じです (キーが存在しない場合はエラーが報告されます)。
時間計算量:
O(1)
戻り値:
変更が成功すると 1 が返されます。
newkey がすでに存在する場合は、0 を返します。
//RENAMENX
echo '
RENAMENX
' # ケース 1: newkey が存在しません。成功
$redis-> SET ('player',"MPlyaer");
$redis->EXISTS('best_player'); //int(0)
var_dump('player','best_player'); / / bool(true)
# ケース 2: newkey が存在する場合に失敗
$redis->SET('animal', "bear");
$redis->SET('favorite_animal', "butterfly") ;
var_dump($redis->RENAMENX('animal', 'favorite_animal')) // bool(false)
var_dump($redis->get('animal')); (4) "クマ"
var_dump($redis->get('favorite_animal')) //string(9) "蝶"
タイプ
タイプキー
キーに格納されている値の型を返します。
時間計算量:
O(1)
戻り値:
none(キーが存在しない) int(0)
string(string) int(1)
list(list) int(3)
set(set) )int(2)
zset(注文セット)int(4)
hash(hash table)int(5)
//タイプ
$ redis-> flushall() ;
echo '
TYPE
'
var_dump($redis->TYPE('fake_key'))
$redis->SET('weather',"sunny"); # 文字列を構築する
var_dump($redis->TYPE('weather'));//string / int(1)
$redis - >SADD('pat',"dog"); # セットを構築する
var_dump($redis->TYPE('pat')) //set /int(2)
$redis-> ('book_list',"scala でのプログラミング"); # リストを作成する
var_dump($redis->TYPE('book_list'));//list / int(3)
$redis->ZADD ( 'pats',1,'cat'); # zset (ソートされたセット) を構築します // int(1)
$redis->ZADD('pats',2,'dog'); ZADD('pats',3,'pig');
var_dump($redis->zRange('pats',0,-1)); // array(3) { [0]=> ) "猫" [1]=> 文字列(3) "犬" [2]=> 文字列(3) "豚" }
var_dump($redis->TYPE('pats')); / int(4)
$redis->HSET('website','google','www.g.cn'); # 新しいドメイン
var_dump($redis->HGET('website' , 'google')); //string(8) "www.g.cn"
var_dump($redis->TYPE('website')); //ハッシュ /int(5)
EXPIRE
EXPIRE キー秒数
指定されたキーの生存時間を設定します。
キーの有効期限が切れると、キーは自動的に削除されます。
Redis では、生存期間を持つキーは「揮発性」と呼ばれます。
2.1.3 より前の Redis バージョンでは、既存の有効期間を上書きできません。
バージョン 2.1.3 以降、キーの生存時間は PERSIST コマンドで更新または削除できます。 (詳細については、http://redis.io/topics/expire を参照してください)。
時間計算量:
O(1)
戻り値:
設定が成功した場合は 1 を返します。
キーが存在しない場合、またはキーの生存時間を設定できない場合 (たとえば、キーの生存時間を 2.1.3 未満に更新しようとした場合)、0 が返されます。
//EXPIRE
$redis->select(7)
//$redis->flushdb();
echo '
EXPIRE
';
$redis->SET('cache_page',"www.cnblogs.com/ikodota");
$redis->EXPIRE('cache_page', 30); # 30 後に期限切れになるように設定します秒
sleep(6);
echo $redis->TTL('cache_page').'
'; # 指定されたキーの残りの生存時間を確認する // (整数) 24
$redis- > EXPIRE('cache_page', 3000); # 生存時間、3000 秒
echo $redis->TTL('cache_page').'//(integer); 2996
EXPIREAT
EXPIREAT キータイムスタンプ
Like EXPIRE は、キーの生存期間を設定するために使用されます。
違いは、EXPIREAT コマンドで受け入れられる時間パラメータが UNIX タイムスタンプ (unix タイムスタンプ) であることです。
時間計算量:
O(1)
戻り値:
生存時間の設定が成功すると 1 が返されます。
キーが存在しない場合、または生存時間を設定できない場合は0を返します。 ... ;
echo $redis->EXPIREAT('cache','1355292000'); # このキーは 2012.12.12 に期限切れになります
echo ($redis->TTL('cache')) / /return 124345085
OBJECT
OBJECT サブコマンド [arguments [arguments]]
OBJECT コマンド内部から特定のキーの Redis オブジェクトを参照することを許可します。
通常、スペースを節約するためにキーに特別なエンコーディングが使用されている状況をデバッグしたり理解したりするために使用されます。
Redis をキャッシュ プログラムとして使用する場合、OBJECT コマンドの情報を通じて主要なエビクション ポリシーを決定することもできます。
OBJECT コマンドには複数のサブコマンドがあります:
OBJECT REFCOUNT
OBJECT ENCODING
OBJECT IDLETIME
オブジェクトはさまざまな方法でエンコードできます:
文字列は raw (一般的な文字列) または int としてエンコードできます (64 ビット数値を表すために文字列を使用すると、スペースを節約できます)。
リストは ziplist または linkedlist としてエンコードできます。 ziplist は、小さなリストのスペースを節約するために作成された特別な表現です。
セットは intset または hashtable としてエンコードできます。 intset は、数値のみを格納する小さなセットの特別な表現です。
ハッシュ テーブルは zipmap または hashtable としてエンコードできます。 zipmap は、小さなハッシュ テーブルの特別な表現です。
並べ替えられたコレクションは、ジップリストまたはスキップリスト形式にエンコードできます。 ziplist は小さい順序付けされたコレクションを表すために使用され、skiplist は任意のサイズの順序付けされたコレクションを表すために使用されます。
Redis がスペースを節約するエンコーディングを使用できないようにする操作 (要素が 1 つだけのセットを 100 万要素のセットに拡張するなど) を行う場合、特別にエンコードされた型は一般的な型に自動的に変換されます。
時間計算量:
O(1)
戻り値:
REFCOUNT および IDLETIME は数値を返します。
ENCODING は、対応するエンコーディング タイプを返します。
//OBJECT
$redis->select(8);
echo '
OBJECT
'; redis->SET( 'game',"WOW"); #文字列を設定します
$redis->OBJECT('REFCOUNT','game'); #参照は 1 つだけです
//sleep(5); ;OBJECT('IDLETIME','game'); # しばらく待ちます。 。 。次に、アイドル時間を確認します //(整数) 10
//echo $redis->GET('game'); #ゲームを抽出してアクティブにします // WOW を返します
//echo $redis-> ;OBJECT( 'IDLETIME','game'); # アイドルではなくなりました //(integer) 0
var_dump($redis->OBJECT('ENCODING','game')); # 文字列エンコード方法/ /string(3) " raw"
$redis->SET('phone',15820123123); # 大きな数値も文字列としてエンコードされます
var_dump($redis->OBJECT('ENCODING','phone' )); //string(3) ) "raw"
$redis->SET('age',20); # 短い数値は int としてエンコードされます
var_dump('ENCODING','age ')); 3) "int"
PERSIST
PERSIST キー
与えられたキー。
時間計算量:
O(1)
戻り値:
生存時間が正常に削除された場合、1 が返されます。
キーが存在しない場合、またはキーに生存時間が設定されていない場合は、0 が返されます。が返されます。
//PERSIST
echo '
PERSIST
'
$redis->SET('time_to_say _さようなら',"886... " );
$redis->EXPIRE('time_to_say_goodbye', 300);
sleep(3);
echo $redis->TTL('time_to_say_goodbye'); # (int) 297
echo '
' ;
$redis->PERSIST('time_to_say_goodbye'); #生存時間を削除します
echo $redis->TTL('time_to_say_goodbye') #削除に成功しました
SORT
SORT キー [BY パターン] [LIMIT オフセット数] [GET パターン [GET パターン ...]] [ASC | DESC] [ALPHA] [STORE 先]
並べ替え、ページングなど
パラメータ
array(
'by' => 'some_pattern_*',
'limit' => array(0, 1),
'get' => 'some_other_pattern_ * ' またはパターンの配列、
'sort' => 'asc' または 'desc'、
'alpha' => TRUE、
'store' => 'external-key'
)
を返すか保存します指定されたリスト、セット、または順序付きセットのキー内の並べ替えられた要素。
デフォルトでは、並べ替えは数値をオブジェクトとして受け取り、値は倍精度浮動小数点数として解釈されて比較されます。
SORT の一般的な使用法
SORT を使用する最も簡単な方法は、SORT キーです。
today_cost が数値を格納するリストであると仮定すると、SORT コマンドはデフォルトでリスト値の昇順 (小さい値から大きい値へ) の並べ替え結果を返します。
# データを 1 つずつリストに追加します
$redis->LPUSH('today_cost', 30);$redis->LPUSH('today_cost', 1.5);
$redis->LPUSH('today_cost', 10);
# ソート
var_dump( $redis->SORT('today_cost')); //array(4) { [0]=> 文字列(3) "1.5" [1]=> 文字列(1) "8" [2]= > string(2) "10" [3]=> string(2) "30" }
データセットに文字列値が格納されている場合は、ALPHA Sort by を使用して変更できます。修飾子。
# データを 1 つずつリストに追加します
$redis->LPUSH('website', "www.reddit.com")
$redis->LPUSH('website'); , "www.slashdot.com");
$redis->LPUSH('website', "www.infoq.com")
# デフォルトの並べ替え
var_dump($redis->SORT('website'); ;//配列(3) { [0]=> 文字列(13) "www.infoq.com" [1]=> 文字列(16) "www.slashdot.com" 14) "www.reddit.com" }
# 文字で並べ替え ALPHA=true
var_dump($redis->SORT('website', array('ALPHA'=>TRUE))); //array (3) { [0]=> 文字列(13) "www.infoq.com" [1]=> 文字列(14) "www.reddit.com" [2]=> 文字列(16) !LC_COLLATE 環境変数を正しく設定すると、Redis は UTF-8 エンコーディングを認識できます。
並べ替え後に返される要素の数は、LIMIT 修飾子によって制限できます。
LIMIT 修飾子は、オフセットとカウントの 2 つのパラメータを受け入れます。
offset はスキップされる要素の数を指定し、count は offset で指定された要素をスキップした後に返されるオブジェクトの数を指定します。
次の例は、並べ替えられた結果の最初の 5 つのオブジェクトを返します (オフセット 0 は要素がスキップされないことを意味します)。
# データを 1 つずつリストに追加します
$redis->LPUSH('rank', 30) //(integer) 1
$redis->LPUSH('rank' , 56); //(整数) 2
$redis->LPUSH('ランク', 42) 3
$redis->LPUSH('ランク', 22); ) 4
$redis->LPUSH('ランク', 0); //(整数) 5
$redis->LPUSH('ランク', 11); 6
$redis-> LPUSH('ランク', 32); //(整数) 7
$redis->LPUSH('ランク', 67) //(整数) 8
$redis->LPUSH('ランク', 50); ; //(整数) 9
$redis->LPUSH('ランク', 44) //(整数) 10
$redis->LPUSH('ランク', 55);
# 並べ替え
$redis_sort_option=array('LIMIT'=>array(0,5));
var_dump($redis->SORT('rank',$redis_sort_option)); # 上位 5 つの要素を返す / / 配列(5) { [0]=> 文字列(1) "0" [1]=> 文字列(2) "22" = > ; string(2) "30" [4]=> string(2) "32" }
修飾子は組み合わせて使用できます。次の例では、最初の 5 つのオブジェクトを降順 (最大から最小) で返します。
$redis_sort_option=array(
'LIMIT'=>array(0,5),
var_dump($redis->SORT(' ランク',$redis_sort_option)); //配列(5) { [0]=> 文字列(2) "67" [1]=> 文字列(2) "55" [3]=> string(2) "50" [4]=> string(2) "44" }
外部キーを重みとして使用したい場合があります。デフォルトの比較方法の代わりに要素を比較します。
ユーザーデータが次のとおりであると仮定します:
id name level
----------------------------- - -
1 admin 9999
2 huangz 10
59230 jack 3
222 hacker 9999
idデータはuser_idというキー名でリストに保存されます。
名前データは user_name_{id} というキー名のリストに格納されます。
レベルデータは user_level_{id} のキーに格納されます。
# まずデータベースに使用するデータを追加します
# admin
$redis->LPUSH('user_id', 1);//(integer) 1
$redis- > ;SET('user_name_1', 'admin');
$redis->SET('user_level_1',9999);
# huangz
$redis->LPUSH('user_id', 2);//(整数) 2
$redis->SET('user_name_2', 'huangz');
$redis->SET('user_level_2', 10);
# ジャック
$redis->LPUSH('user_id', 59230);//(integer) 3
$redis->SET('user_name_59230','jack');
$redis->SET('user_level_59230', 3);
# ハッカー
$redis->LPUSH('user_id', 222); //(整数) 4
$redis->SET('user_name_222', 'hacker');
$redis->SET('user_level_222', 9999);
如果希望按レベル从大到小排序user_id、次のコマンドを使用できます:
$redis_sort_option=array('BY'=> 'user_level_*',
'SORT'=>'DESC'
);
var_dump($redis->SORT('user_id',$redis_sort_option)); //配列(4) { [0]=>文字列(3) "222" [1]=>文字列(1) "1" [2]=>文字列(1) "2" [3]=> string(5) "59230" }
#-------------------------------------
#1) "222" # ハッカー
# 2) "1" # admin
#3) "2" # huangz
#4) "59230" # jack
ただし有時只是返相应的IDがないもの用、可能性ありさらに望ましい排序後、ID 对应の用户名を返します。これより友好的な点、GET选项を使用してこれを実現できます:
$redis_sort_option=array( 'BY'=>'ユーザーレベル_ *',
'SORT'=>'DESC',
'GET'=>'user_name_*'
);
var_dump($redis->SORT('user_id', $redis_sort_option)); //配列(4) { [0]=> string(6) "ハッカー" [1]=>文字列(5) "管理者" [2]=> string(6) "huangz" [3]=> string(4) "ジャック" }
#1) "ハッカー"
#2) "管理者"
#3) "huangz"
#4) "ジャック"
できる
たとえば、ユーザー名を取得するだけでなく、ユーザーの暗号もリストアップする場合は、次のコマンドを使用できます。
# 先追加いくつかの测试データセット
$redis->SET('user_password_222', "Hey,im in");
$redis->SET('user_password_1', "a_long_long_password");
$redis->SET('user_password_2', "誰も知りません");
$redis->SET('user_password_59230', "jack201022");
# 取得名とパスワード
$redis_sort_option=array('BY'=>'user_level_*',
'SORT'=>'DESC',
'GET'=>array('user_name _*'、 'user_password_*')
);
var_dump($redis->SORT('user_id',$redis_sort_option));//array(8) { [0]=> string(6) "ハッカー" [1]=> string(9) "やあ、入ってる" [2]=>文字列(5) "管理者" [3]=> string(20) "a_long_long_password" [4]=> string(6) "huangz" [5]=> string(11) "誰も知らない" [6]=> string(4) "ジャック" [7]=> string(10) "jack201022" }
#----------------------------------------------
# 1) "hacker" # 用户名
#2) "hey,im in" # 密码
#3) "jack"
#4) "jack201022"
#5) "huangz"
#6) "nobodyknows"
# 7) "admin"
#8) "a_long_long_password"
# 注意GET 操作は有効です、GET user_name_* GET user_password_* および GET user_password_* GET user_name_* が返されます結果の位置が異なります
# 获取名とパスワード 注意GET操作は有順序です
$redis_sort_option=array('BY'=>'user_level_*',
'SORT'=>'DESC '、
'GET'=>array('user_password_*','user_name_*')
);
var_dump($redis->SORT('user_id',$redis_sort_option));// array(8) { [0] => 文字列(9) "こんにちは" [1]=> 文字列(6) "ハッカー" [2]=> 文字列(20) "a_long_long_password" admin" [4]=>string(11) "nobodyknows" [5]=>string(6) "huangz" [6]=>string(10) "jack201022" [7]=>string(4) ) "jack" }
GET には、ソートされたオブジェクトの現在の要素を取得するために使用される特別なルールもあります (ここでの例は user_id です)。 たとえば、User_id をレベル別にソートするだけでなく、ID、名前、パスワードもリストしたい場合は、次のコマンドを使用できます。 & gt; ' user_level_*',
'SORT'=>'DESC',
'GET'=>array('#','user_password_*','user_name_*')
); -&g t;SORT ('user_id',$redis_sort_option));//array(12) { [0]=> string(3) "222" [1]=> " [2]= > 文字列(6) "ハッカー" [3]=> 文字列(1) "1" [4]=> 文字列(20) "a_long_long_password" [5]=> 文字列(5) "管理者" [6 ]=> 文字列(1) "2" => 文字列(11) "誰も知らない" [8]=> 文字列( 5) "59230" [10]=> 文字列(10) "jack201022" [11]=> 文字列(4) "ジャック" }
#-------------- ----- --------------------------------------
#1 ) "222" # ID
#2) "hacker" # 名前
#3) "Hey,im in" # パスワード
#4) "1"
#5) "admin"
#6) "a_long_long_password"
# 7) "2"
#8) "huangz"
#9) "nobodyknows"
#10) "59230"
#11) "jack"
#12) "jack201022"
ソートなしでオブジェクトのみを取得する
BY 修飾子は存在しないキーを重みとして扱うことができ、SORT がソート操作をスキップできるようにします。
このメソッドは、ソートのオーバーヘッドを発生させずに外部オブジェクトを取得したい場合に使用されます。
# fake_key が存在しないことを確認する
$redis->EXISTS('fake_key');//(integer) 0
# fake_key を使用するBYパラメータとして使用されます、ソートされず、GET 名と GET パスワードのみ
$redis_sort_option=array('BY'=>'fake_key',
'SORT'=>'DESC',
'GET'=>array('#', 'user_name_*', 'user_password_*')
);
var_dump($redis->SORT('user_id',$redis_sort_option));//array(12) { [0]=> string(3) 222" [1] => 文字列(6) "ハッカー" [2]=> 文字列(9) "やあ、入ってる" [3]=> 文字列(5) "59230" [4]=>;文字列(4) "ジャック" [5]=> 文字列(10) "ジャック201022" [6]=> 文字列(6) "huangz" [8]= > 文字列(11) "誰も知らない" [9]=> 文字列(1) "10"=> 文字列(5) "admin" [11]=> 文字列(20) "a_long_long_password" }
#-- ------------------------------------------- -----
#1) "222 " " 2"
#8) "huangz"
#9) "nobodyknows"
#10) "1"
#11) "admin"
#12) "a_long_long_password"
並べ替え結果を保存する
デフォルトでは、SORT 操作は単に並べ替えられた結果を返します。並べ替えられた結果を保存したい場合は、STORE オプションのパラメータとしてキーを指定できます。 、並べ替えられた結果はリストの形式でこのキーに保存されます。 (指定したキーが既に存在する場合は上書きされます。)
$redis->EXISTS('user_info_sorted_by_level'); # 确保指定キー無し //(整数) 0
$redis_sort_option=array('BY'=>'user_level_*',
'GET'=>array('#','user_name_*','user_password_*) '),
'STORE'=>'user_info_sorted_by_level'
);
var_dump($redis->SORT('user_id',$redis_sort_option)); //int(12)
var_dump($redis->LRANGE('user_info_sorted_by_level', 0 ,11)); # 查看排序結果 //array(12) { [0]=>文字列(5) "59230" [1]=> string(4) "ジャック" [2]=>文字列(10) "jack201022" [3]=>文字列(1) "2" [4]=> string(6) "huangz" [5]=> string(11) "誰も知らない" [6]=>文字列(3) "222" [7]=> string(6) "ハッカー" [8]=> string(9) "やあ、入ってる" [9]=>文字列(1) "1" [10]=>文字列(5) "管理者" [11]=> string(20) "a_long_long_password" }
#-------------------------------------- -------------------------
#1) "59230"
#2) "jack"
#3) "jack201022"
# 4) 「2」
#5) 「huangz」
#6) 「誰も知らない」
#7) 「222」
#8) 「ハッカー」
#9) 「やあ、入ってる」
#10) 「1」
#11) "admin"
#12) "a_long_long_password"
一つの興味深い使用法は、将SORT结果保存、使用EXPIREは结果集設置生存時間です间,この样結果集就成了
このように、SORT 操作を頻繁に調整する必要はなく、結果が収集されるまでに 1 回 SORT 操作を再調整する必要がある場合があります。ゲートウェイは、複数のクライアントが同時に SORT 操作を実行し、結果として保存されることを回避するために、具体的には SETNX コマンドを使用します。
は、SORT コマンド内で GET および BY 操作を実行するために、ペール希テーブル固有のメソッドを使用できます。各ユーザーとしての役割シーケンス番号
# シーケンス番号は哈希表の形式でシリアル哈希フィールド内に存在します。
222=>' 502342349',
59230=>'2435829758'
);
$redis->HMSET('serial',$redis_hash_testdata_array);
# 私はシリアル内のサイズよりも排列user_id として機能することを希望します
$redis_sort_option=array('BY'=>'*->serial');
var_dump($redis->SORT('user_id', $redis_sort_option)); //配列(4) { [0]=>文字列(3) "222" [1]=>文字列(5) "59230" [2]=>文字列(1) "2" [3]=> string(1) "1" }
#-------------------------------------- --
#1) "222"
#2) "59230"
#3) "2"
#4) "1"
記号「->」
これに加えて、哈希テーブルの関連する文字 (キー名) とインデックス フィールド (ハッシュ フィールド) を分割するために使用されます。他のデータ構造(列表、集合、集合集合)には何の違いもありません。 M は返される要素数です。
戻り値:
SORT コマンドを使用して GET 選択でデータを取得するだけで順序付けは行われず、時間 O(N) になります。
文字列(String)
SET
SET キー値
文字列値をキーに関連付けます。
如果key已经持有他の値、SET は古い値を上書きします。
時間計算量: O(1) 戻り値: SET は失敗できないため、常に OK (TRUE) を返します。
# ケース 1: 文字列型キーを設定する
$redis->SET('apple', 'www.apple.com') #OK //bool(true)
$redis- >GET('apple');//"www.apple.com"
# ケース 2: 非文字列型キーを設定する
$redis->LPUSH('greet_list', "hello"); #Createリスト #(integer) 1 //int(1)
$redis->TYPE('greet_list');#list //int(3)
$redis->SET ('greet_list', "よおおおおおおおお"); # リストの型をオーバーライド #OK //bool(true)
$redis->TYPE('greet_list');#string //int(1)
SETNX
SETNX キーの値
キーが存在しない場合にのみ、キーの値を value に設定します。
指定されたキーがすでに存在する場合、SETNX は何もアクションを実行しません。
SETNX は「SET if Not eXists」(存在しない場合は SET)の略称です。
時間計算量:
O(1)
戻り値:
設定が成功すると 1 が返されます。
設定は失敗し、0 を返します。
//SETNX
echo '
SETNX
'
$redis->EXISTS('job'); # ジョブは存在しません //bool ( false);
$redis->SETNX('job', "programmer"); # ジョブが正常に設定されました //bool(true)
$redis->SETNX('job', "code-farmer"); # ジョブの設定に失敗しました //bool(false)
echo $redis->GET('job'); # 対象外 //"programmer"
デザインパターン: SETNX ロックに使用
SETNX はロック プリミティブとして使用できます。たとえば、キーワード (キー) foo をロックするには、クライアントは次のメソッドを試行できます:
SETNX lock.foo <現在の Unix 時間 + ロック タイムアウト + 1>
SETNX が 1 を返した場合、それはクライアントを意味します。ロックが取得されており、キーによって設定された UNIX 時刻がロックの有効期限が切れる時刻を指定します。その後、クライアントは DEL lock.foo を介してロックを解放できます。
SETNX が 0 を返した場合、キーが他のクライアントによってロックされていることを意味します。ロックが非ブロッキング (非ブロッキング ロック) の場合は、呼び出しを返すか、ロックが正常に取得されるか再試行タイムアウト (タイムアウト) になるまで再試行ループに入るかを選択できます。
デッドロックの処理
上記のロック アルゴリズムには問題があります。クライアントの障害、クラッシュ、その他の理由によりロックを解放する方法がない場合はどうすればよいでしょうか?
この状況は検出によって発見できますか?? ロックされたキーには UNIX タイムスタンプが保存されているため、キー値のタイムスタンプが現在のタイムスタンプより小さい場合、ロックが有効ではなくなったことを意味します。
ただし、複数のクライアントがロックの有効期限が切れているかどうかを同時に検出し、ロックを解除しようとすると、デッドロックされたキーを単純に削除してから SETNX を使用してロックすることはできません。これは、すでに競合状態が発生するためです。 C1 と C2 は lock.foo を読み取り、タイムスタンプを確認します。SETNX は両方とも C3 によってロックされているため 0 を返しますが、ロック後に C3 がクラッシュしました。
C1 は DEL コマンドを lock.foo に送信します。
C1 は SETNX を lock.foo に送信し、成功します。
C2 は DEL コマンドを lock.foo に送信します。
C2 は SETNX を lock.foo に送信し、成功します。
エラー: 競合状態により、C1 と C2 の両方がロックを取得しました。
幸いなことに、次のアルゴリズムにより上記の問題を回避できます。スマート C4 クライアントが何をするかを見てみましょう:
C4 は SETNX コマンドを lock.foo に送信します。
クラッシュした C3 はまだ lock.foo をロックしているため、Redis は C4 に 0 を返します。
C4 は、lock.foo のロックの有効期限が切れているかどうかを確認するために、lock.foo に GET コマンドを送信します。そうでない場合は、しばらくスリープして、後でもう一度試してください。
一方、lock.foo の UNIX タイムスタンプが現在のタイムスタンプよりも古い場合、C4 は次のコマンドを実行します:
GETSET lock.foo <現在の Unix タイムスタンプ + ロック タイムアウト + 1>
GETSET の役割により、C4 は GETSET の戻り値をチェックして、lock.foo に格納されている古い値がまだ有効期限タイムスタンプであるかどうかを判断できます。そうであれば、C4 はロックを取得します。
C5 などの他のクライアントが GETSET 操作を実行し、C4 よりも早くロックを取得した場合、C4 の GETSET 操作は期限切れになっていないタイムスタンプ (C5 によって設定されたタイムスタンプ) を返します。 C4 は最初のステップからやり直す必要がありました。
C4 の GETSET 操作によってキーが変更されたとしても、将来には影響しないことに注意してください。
(何か問題がありますか? C4 は確かに再試行できますが、C5 はどうですか? ロックの有効期限は C4 によって変更されています。 ?? 翻訳注釈)
‐ ‐ ‐ ‐‐‐‐ 警告
このロック アルゴリズムはより堅牢です。クライアント障害の状況は単純ではなく非常に複雑であるため、ロックを取得するクライアントは、DEL などのコマンドの実行により誤ってロックが解除されないように、常に有効期限をチェックする必要があります。これはクラッシュとして発生しましたが、クライアント上の特定の操作が原因で長時間ブロックされ、その後 DEL コマンドが実行されようとしました (ただし、この時点ではロックは別のクライアントの手に渡っていました)。
SETEX
SETEX キーの秒の値
値の値をキーに関連付け、キーの生存時間を秒 (秒単位) に設定します。
キーが既に存在する場合、SETEX コマンドは古い値を上書きします。
このコマンドは、次の 2 つのコマンドに似ています:
$redis->SET('key', 'value');
$redis->EXPIRE('key','seconds'); # Set Lifetime
違いは、SETEX がアトミック操作であることです。このコマンドは、Redis をキャッシュとして使用する場合、値の関連付けと生存時間の設定の 2 つのアクションが同時に完了します。
時間計算量:
O(1)
戻り値:
設定が成功した場合は OK を返します。
秒パラメータが不正な場合、エラーが返されます。
# ケース 1: キーが存在しない
$redis->SETEX('cache_user_id', 60,10086);//bool(true)
echo $redis->GET ( 'cache_user_id'); # 値 // "10086"
sleep(4);
echo $redis->TTL('cache_user_id') # 残りの生存時間 //int(56)
# Case 2 : キーはすでに存在しており、キーは上書きされます
$redis->SET('cd', "timeless"); //bool(true);
$redis->SETEX('cd', 3000,"さようなら、私の愛 "); //bool(true);
echo $redis->GET('cd');//「さようなら、私の愛」
SETRANGE
SETRANGE キー オフセット値
value パラメーターを使用して、指定されたキーに格納されている文字列値をオフセット オフセットから上書き (上書き) します。
存在しないキーは空文字列として扱われます。
SETRANGE コマンドは、指定されたキーに元々格納されている文字列の長さがオフセットより小さい場合 (たとえば、文字列が 5 文字のみである場合)、文字列が指定されたオフセットに値を設定するのに十分な長さであることを確認します。長いですが、設定されたオフセットは 10)、元の文字とオフセットの間のスペースはゼロ ビット (ゼロバイト、「x00」) で埋められます。
Redis 文字列は 512 メガバイトに制限されているため、使用できる最大オフセットは 2^29-1 (536870911) であることに注意してください。これより多くのスペースを使用する必要がある場合は、複数のキーを使用する必要があります。
時間計算量:
小さい (小さい) 文字列の場合、償却計算量は O(1) です。 (どの文字列が「小さい」かについては、APPEND コマンドを参照してください)
それ以外の場合は O(M)、M は値パラメーターの長さです。
戻り値:
SETRANGE によって変更された後の文字列の長さ。
警告
非常に長い文字列を生成する場合、Redis はメモリ領域を割り当てる必要があり、この操作によりサーバーがブロックされる場合があります。 2010 Macbook Pro では、オフセットを 536870911 (512MB メモリ割り当て) に設定すると、約 300 ミリ秒かかります。オフセットを 134217728 (128MB メモリ割り当て) に設定すると、約 80 ミリ秒かかります。 30 ミリ秒、オフセットを 8388608 (8MB メモリ割り当て) に設定します。これには約 8 ミリ秒かかります。 最初のメモリ割り当てが成功し、同じキーに対して SETRANGE 操作が再度呼び出された場合は、再メモリする必要がないことに注意してください。
モード
SETRANGE および GETRANGE コマンドにより、Redis 文字列を O(1) ランダム アクセス時間の線形配列として使用できます。これは、実際の多くの使用例でデータを保存するための非常に高速かつ効率的な方法です。
# ケース 1: 空でない文字列 SETRANGE
$redis->SET('greeting', "hello world");
$redis->SETRANGE('greeting', 6) , "Redis"); //int(11)
$redis->GET('greeting');//"hello Redis"
# ケース 2: 空の文字列/存在しないキーを SETRANGE する
$redis ->EXISTS('empty_string');//bool(false)
$redis->SETRANGE('empty_string', 5 ,"Redis!") # 存在しないキーには SETRANGE を使用します //int (11)
var_dump($redis->GET('empty_string')); # 空白は "x00" で埋められます #"x00x00x00x00x00Redis!" //return string(11) "Redis!"
MSET
MSET キー値 [キー値 ...]
1 つ以上のキーと値のペアを同時に設定します。
同じ名前のキーが見つかった場合、MSET は古い値を新しい値で上書きします。同じ名前のキーを上書きしたくない場合は、MSETNX コマンドを使用してください。
MSET はアトミックな操作です。指定されたすべてのキーが同時に設定され、一部のキーが更新され、他の指定されたキーは変更されません。
時間計算量:
O(N)、N は設定するキーの数です。
戻り値:
常に OK を返します (MSET は失敗しないため)
#MSET
echo '
MSET
';レディス-> select(0);
$redis->flushdb();
$array_mset=array('日付'=>'2012.3.5',
'時間'=>'9.09a.m.',
'天気'= >'sunny'
);
$redis->MSET($array_mset) //bool(true)
var_dump($redis->KEYS('*')); # -値のペアが挿入されます //array(3) { [0]=> string(4) "time" [1]=> string(7) "weather" [2]=> string(4 ) " " }
# MSET が古い値を上書きする例ですが、テスト後には上書きできません
var_dump($redis->SET('google', "google.cn")); //bool(true)
var_dump ($redis->MSET('google',"google.hk")); //bool(false)
echo $redis->GET('google'); //google.cn と redis のマニュアルの例結果が一致しません
MSETNX
MSETNX キー値 [キー値 ...]
1 つ以上のキーと値のペアを同時に設定する (かつのみ)もしキーが存在しません。
すでにキーが 1 つしか存在しない場合でも、MSETNX は受信したキー設定操作をすべて拒否します
MSETNX はアトミックであるため、異なるフィールドを表す複数の異なるキーを設定するための固有のロジックとして使用できます (固有のロジック オブジェクト)。 、すべてのフィールドがすべて設定されているか、何も設定されていません。
時間計算量:
O(N)、N は設定するキーの数です。
戻り値:
すべてのキーの設定が成功した場合、1 が返されます。
すべてのキーの設定に失敗した場合 (少なくとも 1 つのキーがすでに存在している場合)、0 が返されます。
# ケース 1: 存在しないキーの MSETNX
$array_mset=array('rmdbs'=>'MySQL',
'nosql'=> ;'MongoDB' 、
』 key-value-store'=>'redis'
);
$redis->MSETNX($array_mset);//bool(true)
# ケース 2: MSETNX 既存のキー
$array_mset= array('rmdbs'=>'Sqlite',
' language'=>'python'
);
var_dump($redis->MSETNX($array_mset)); # rmdbs キーはすでに存在します、操作は失敗しました / /bool(false)
var_dump($redis->EXISTS(' language')); # 操作はアトミックであるため、言語は設定されません bool(false)
echo $redis->GET ('rmdbs' ); # rmdbs は変更されていません //"MySQL"
$array_mset_keys=array( 'rmdbs', 'nosql', 'key-value-store')
print_r($redis->MGET ($array_mset_keys) )); //Array ( [0] => MySQL [1] => MongoDB [2] => redis )
APPEND
APPENDキーの値
キーがすでに存在し、文字列である場合、APPEND コマンドはキーの元の値に値を追加します。
キーが存在しない場合、APPEND は、SET key value を実行するのと同じように、単に指定されたキーを value に設定します。
時間計算量:
償却計算量 O(1)
戻り値:
値を追加した後のキーの文字列の長さ。
#ケース1:存在しないキーの追加を実行する
$ redis-&gt; )
$redis->APPEND('myphone',"nokia"); # SET myphone "nokia" と同等の存在しないキーを追加します //int(5) # 文字長
# ケース 2: ペア文字列 APPEND
$redis->APPEND('myphone', " - 1110");# 長さが 5 文字から 12 文字に増加します //int(12)
echo $redis->GET(' myphone'); # 文字列全体を表示 // "nokia - 1110"
GET
GET key
key に関連付けられた文字列値を返します。
キーが存在しない場合は、特別な値 nil が返されます。
key に格納されている値が文字列型ではない場合、GET は文字列値の処理にしか使用できないため、エラーが返されます。
時間計算量:
O(1)
戻り値:
キーの値。
キーが存在しない場合は、nil を返します。
//GET
var_dump($redis->GET('fake_key')); #(nil) //return bool(false)
$redis->SET('animate', "あの花"); //return bool(true)
var_dump($redis->GET('animate')); //return string(7) "あの花"
MGET
MGET key [key .. .]
指定されたキーのすべての (1 つ以上の) 値を返します。
指定されたキーが存在しない場合、特別な値 nil が返されます。したがって、コマンドが失敗することはありません。
時間計算量:
O(1)
戻り値:
指定されたキーのすべての値を含むリスト。
//MGET
echo '
MGET
'
$redis_mget_data_array=array('name'=> 「イコドータ」、「ブログ」 ' =>'cnblogs.com/ikodota');
$redis->MSET($redis_mget_data_array);#MSET を使用して複数の値を一度に保存する
$redis_mget_key_array=array('name','blog ');
var_dump($redis->MGET($redis_mget_key_array)); //array(2) { [0]=> string(7) "ikodota" [1]=> .com/ikodota " }
$redis->EXISTS('fake_key'); //bool(false)
$redis_mget_key_array=array('name','fake_key');
var_dump($redis- >MGET( $redis_mget_key_array)); # MGET にキーが存在しない場合 //array(2) { [0]=> string(7) "ikodota" [1]=>
GETRANGE
GETRANGE key start end
key の文字列値の部分文字列を返します。文字列のインターセプト範囲は、start と end の 2 つのオフセット (start と end を含む) によって決まります。 )。
負のオフセットは文字列の末尾から数えることを意味し、-1 は最後の文字を意味し、-2 は最後から 2 番目の文字を意味します。
GETRANGE は、部分文字列の範囲が実際の文字列の範囲を超えないようにすることで、範囲外のリクエストを処理します。
時間計算量:
O(N)、N は返される文字列の長さです。
複雑さは最終的に戻り値の長さによって決まりますが、既存の文字列から部分文字列を作成する操作は非常に安価であるため、長さが短い文字列の場合、この操作の複雑さは O( 1 )。
戻り値:
取得した部分文字列をインターセプトします。
注:
//GETRANGE
echo '
GETRANGE
'
$redis->SET('挨拶', "こんにちは、私の友達」) ;
echo $redis->GETRANGE('greeting', 0, 4).'
'; # 4 を含むインデックス 0 ~ 4 の文字を返します。 //"hello"
echo $redis->GETRANGE('greeting', -1 ,-5).'
'; # ラップアラウンド操作はサポートされていません //""
echo $redis->GETRANGE ( 'greeting', -3 ,-1).'
'; # 負のインデックス //"end"
echo $redis->GETRANGE('greeting', 0, -1).'
echo $redis->GETRANGE('greeting', 0, 1008611).'
' # 値の範囲は超えません実際の文字列、余分な部分は自動的に省略されます //"hello, my friends"
GETSET
GETSET key value
はキーの値を与えます値に設定されており、キーの古い値を返します。
キーは存在するが文字列型ではない場合、エラーが返されます。
時間計算量:
O(1)
戻り値:
指定されたキーの古い値を返します。
key に古い値がない場合、nil を返します。
//GETSET
echo '
GETSET
'
var_dump($redis->EXISTS('mail'));//return bool( false);
var_dump($redis->GETSET('mail','xxx@google.com')); # mail は以前に存在せず、古い値がないため、nil が返されます、 #(nil) // bool(false )
var_dump($redis->GETSET('mail','xxx@yahoo.com')); # メールが更新され、古い値が返されます //string(14) "xxx@google .com」
デザイン パターン
GETSET を INCR と組み合わせて使用すると、アトミック リセット操作を備えたカウンターを実装できます。
たとえば、イベントが発生するたびに、プロセスは mycount という名前のキーに対して INCR 操作を呼び出すことがあります。通常、アトミックな時間内で同時にカウンター値を取得し、カウンター値をリセットする必要があります。 。
この目標を達成するには、コマンド GETSET mycounter 0 を使用できます。
$redis->SELECT(2);
echo $redis->INCR('mycount').'
' #(integer) 11
if( $redis->GET('mycount')>19){
echo $redis->GETSET('mycount', 0).'
'; # 1 つのアトムで GET mycount と SET mycount 0 を完了しますオペレーション #"11"
}
echo $redis->GET('mycount'); #"0"
STRLEN
STRL ENキー
に戻る格納されているキー 文字列値の長さ。
保存されたキーが文字列値ではない場合、エラーが返されます。
複雑さ:
O(1)
戻り値:
文字列値の長さ。
キーが存在しない場合は0を返します。
$redis->SET('mykey', "Hello world");
echo $redis->STRLEN('mykey') //int(11)
echo $redis->STRLEN(' noneexisting'); # 存在しないキーの長さは 0 として扱う //int(0)
INCR
INCR key
キーに格納されている数値を 1 つ増やします。
キーが存在しない場合は、キーの初期値として 0 を使用し、INCR 演算を実行します。
値に間違った型が含まれている場合、または文字列型の値が数値として表現できない場合は、エラーを返します。
この演算の値は、64 ビットの符号付き数値表現に制限されます。