1

基本的に、指定された値でオブジェクトを設定しようとしていますが、成功したように見えても、オブジェクトを機能させることができません。これが私のjavascriptオブジェクトです。

function student(){
  var newStudent = {};
  newStudent.lessons = [1,3,4];

  return newStudent;
}

後で学生リストを取得したいときに、console.logが「未定義」と出力するので失敗しますが、オブジェクトはnullではありません。redisに挿入するための私のコード。

var student = Students.student();
//Object is not null I checked it
client.set("studentKey1", student, redis.print);
    client.get("studentKey1", function(err, reply){
        console.log(reply.lessons);
    });

2つの質問。

まず、どうすれば正しく実行できますか、またはJavascriptのリスト構造がRedisでサポートされていません。次に、studentKey1でアイテムを取得し、リストの最後にアイテムを挿入する場合、どのようにそれを達成できますか(RPUSHをどのように利用できますか)?

4

1 に答える 1

5

Javascriptオブジェクト全体を保存したいだけの場合、Redisは文字列値のみを受け入れるため、最初にそれを文字列に変換する必要があります。

client.set('studentKey1', JSON.stringify(student), redis.print);

将来、studentオブジェクトに関数がある場合、これらはシリアル化されてキャッシュに格納されないことに注意してください。キャッシュからオブジェクトを取得した後、オブジェクトを再水和する必要があります。

client.get('studentKey1', function (err, results) {
   if (err) {
       return console.log(err);
   }

   // this is just an example, you would need to create the init function
   // that takes student data and populates a new Student object correctly
   var student = new Student().init(results);
   console.log(student);
}

RPUSHを使用するには、保存したいリスト以外のデータが生徒にある場合は、生徒を複数のキーに分割する必要があります。基本的に、リストは独自のキーに保存する必要があります。これは通常、リスト名を、それが属するオブジェクトキーの末尾に追加することによって行われます。

操作構文を使用したmultiので、生徒は1回でキャッシュに追加されます。キーがまだ存在しない場合は、キーが作成されることに注意してください。

var multi = client.multi().set('studentKey1', 'store any string data');
student.lessons.forEach(function(l) {
    multi.rpush('studentKey1:lessons', l);
});
multi.exec(function (err) { if (err) console.log(err); });

次に、最後に新しいアイテムを追加するには、次のようにします。これにより、新しいアイテムがリストの最後にプッシュされます。リストの最後に新しい値をプッシュする前に、アイテムを取得する必要はありません。

client.rpush('studentKey1:lessons', JSON.stringify(newItem));
于 2012-10-05T16:02:41.073 に答える