node-redis使用記録

14209 ワード

redisの高速アクセス性能は印象的で、分散型ストレージですが、ローカルメモリに比べて性能は遜色ありません.
また、redisからデータにアクセスするリンクを複数回確立し、操作が完了すると閉じられ、パフォーマンスはSQLの大部分を超えています.△このような設計はある程度redis性能の浪費であるが...
redisのnodejsバージョンAPIは、ほとんどのコマンドをサポートしており、プロジェクトに関連する記録は以下の通りです.
redisのデータ型によって区別されます.
0、node-redisのクライアント側接続を確立する
 1 // redis   
 2 var redis = require('redis');
 3 var client = redis.createClient('6379', '127.0.0.1');
 4 
 5 // redis     
 6 client.on("error", function(error) {
 7     console.log(error);
 8 });
 9 // redis    (reids.conf     ,      )
10 // client.auth("foobared");

私が使用しているNodejs V 0.10には、node-reids APIが付属しており、npmインストールは不要です.
1、setのアクセス
 1 client.set('key001', 'AAA', function (err, response) {
 2     if (err) {
 3         console.log("err:", err);
 4     } else {
 5         console.log(response);
 6         client.get('key001', function (err, res) {
 7             if (err) {
 8                 console.log("err:", err);
 9             } else {
10                 console.log(res);
11                 client.end();
12             }
13         });
14     }
15 });

実行結果:
> node redistest.jsOKAAA
 
2、hashアクセス
hash setの設定値と抽出データには、1つのkeyと複数のkeyの2つの方法があります.
※個々のキーの値を設定し、値を取る際に特定のfiledで指定したキーの値を取得する.
 1 client.hset('filed002', 'key001', 'wherethersisadoor', function (err, res) {
 2     if (err) {
 3         console.log(err);
 4     } else {
 5         console.log('res:', res);
 6         client.hget('filed002', 'key001', function (err, getRslt) {
 7             if (err) {
 8                 console.log(err);
 9             } else {
10                 console.log('getRslt:', getRslt);
11                 client.end();
12             }
13         });
14     }
15 });

実行結果は次のとおりです.
> node redistest.jsres: 1getRslt: wherethersisadoor
注意:hgetメソッドは、指定したfieldの下で指定したkeyが見つからない場合、空の文字やundefinedではなくコールバック関数nullに渡されます.
 
※複数のキーの値を設定し、値を取るときに指定fieldで指定した1つまたは複数のキーの値を取得する
 1 var qe = {a: 2, b:3, c:4};
 2 client.hmset('field003', qe, function(err, response) {
 3     console.log("err:", err);
 4     console.log("response:", response);
 5     client.hmget('field003', ['a', 'c'], function (err, res) {
 6         console.log(err);
 7         console.log(res);
 8         client.end();
 9     });
10 });

実行結果は次のとおりです.
> node redistest.jserr: nullresponse: OKnull[ '2', '4' ]
hmsetメソッドの設定値はJSON形式のデータであってもよいが、redisにおけるkeyの値は文字列形式で記憶されており、JSONデータ層数が1層を超えると値が'[object Object]'となる場合がある.
hmgetメソッドの戻り値は配列であり、要素の順序はパラメータのkey配列の順序に対応し、パラメータ配列にfield内に存在しないkeyがある場合、戻り結果配列の対応位置はnullになります.つまり、値が取れるかどうかにかかわらず、結果配列のメタ位置は常にパラメータのkey配列の要素位置に対応します.
hashのすべてのkeyを取得する方法はclient.keys(fieldname, callback); hash中のkeyの数が多い場合、この方法は時間がかかる可能性があることに注意してください. 
 
3、sorted sets秩序集合
整列集合はredisの興味深いデータ構造であり、集合中の要素は整列しており、ソートの根拠は要素に対応するscoreであり、整列集合に要素を加える際には、データの値と対応するscoreを同時に設定する必要があり、データの整列集合中の記憶位置はscoreに基づいて決定される.
scoreのタイプは浮動小数点数に限定され、2つの異なる要素が同じscoreを有する場合、両者の位置は文字列サイズの昇順に並べられる.
秩序セットの各要素は一意に制限され、1つの秩序セットに同じ値でscoreが異なる2つの要素を設定すると、設定された要素のscoreのみが更新される点に注意してください.
 1 var vals = [];
 2 for (var score = 0; score < 4; score++) {
 3     for (var val = 10; val < 14; val++) {
 4         vals.push(score);
 5         vals.push(val);
 6     }
 7 }
 8 
 9 client.zadd('004', vals, function(err, res) {
10     console.log(err);
11     console.log(res);
12     client.zrange('004', 0, -1, function(err, resp) {
13         console.log(err);
14         console.log('range result:', resp);
15         client.zcount('004', -Infinity, Infinity, function(err, respo) {
16             console.log(err);
17             console.log("len:", respo);
18             client.end();
19         });
20     });
21 });

実行結果は次のとおりです.
> node redistest.jsnull4nullrange result: [ '10', '11', '12', '13' ]nulllen: 4
zaddメソッドは配列を設定値のパラメータとして受信し,配列中のデータ順序は[score 1,key 1,score 2,key 2,...]である.で行ないます.
パラメータ配列にはもともとscoreの異なる4つの値がありますが、scoreに対応する要素値が同じであるため、最終セットには1つの値しか存在しません.
zrangeメソッドは、開始位置と終了位置を含む指定された下付き範囲のすべてのkey値を取得します.
zcountメソッドは,指定集合指定範囲内の要素個数を取得し,−Infinity,Infinityに設定すると配列長を取得できる.
 
redisのカーソル設計思想はSQLのカーソルに似ており、node-redis APIではscanメソッドをカーソルとして使用し、異なるデータ構造に対応し、hscanやzscanなどの方法がある.
1 client.zscan('004', 0, 'COUNT', '1', function(err, res) {
2     console.log(err);
3     console.log(res);
4     console.log(res[1].length);
5     client.end();
6 });

実行結果は次のとおりです.
> node redistest.jsnull[ '0', [ '10', '3', '11', '3', '12', '3', '13', '3' ] ]8
結果が配列であることを返します.配列の最初の要素はカーソルの戻り値であり、現在の読み取り位置を示し、この値をパラメータとしてscanメソッドを再呼び出し、前回終了した位置からセットの読み取りを続行します.
配列の2番目の要素はカーソルで読み込まれた内容で、配列内の要素フォーマットは[key 1,score 1,key 2,score 2...]です.COUNT'パラメータの役割はscanメソッドの読み取り数を限定することであり,ここでは役割を果たすが,原因は不明であり,調査を継続する必要がある.
 
4、listsリスト
リスト内の要素の順序は挿入順序であり、要素に一意性の制限はありません.
 1 client.del("003", function(err, respo) {
 2     client.rpush("003", [1, 2, 3, 4, 5], function(err, res) {
 3         console.log(err);
 4         console.log(res);
 5         client.lrange('003', 0, -1, function(err, resp) {
 6             console.log(err);
 7             console.log("resp:", resp);
 8             client.end();
 9         });
10     });
11 });

実行結果は次のとおりです.
> node redistest.jsnull5nullresp: [ '1', '2', '3', '4', '5' ]
sort法を用いてソート後の結果を得ることができる.
Listのpushメソッドには左右2つのバージョンがあり,lpushとrpushは,listの頭部と尾から要素を挿入することをそれぞれ表す.
 
まとめて、redisの大規模なデータに対して、単一のデータ型は常に業務の需要を実現することができなくて、異なるデータ型の組み合わせを通じて、迅速にデータを記憶する基礎の上で、迅速なインデックスはデータをマッチングして検索することができます.実際の使用では,hash集合に大量のデータを格納し,hash集合のkeyを秩序集合に格納し,keyの数字部分をscoreとして抽出し,秩序集合で特定の位置のkeyを取り出し,keyに基づいてhash集合から値をとる.
redisに触れる時間は長くありません.これは効率的なストレージツールで、SQLとは全く異なり、拡張プログラムの機能面で試してみることができるところがたくさんあります.後でプログラムを設計するときは、redis要素を考慮することができます.