ServiceStack.Redisデータ操作

5014 ワード

単純な文字列タイプのデータ書き込みPocoはredisでJson文字列にシーケンス化する.
 
 1    using (var redis = new RedisClient(connString))
 2     {
 3       if (redis.Db != 7)
 4          ((RedisClient)redis).ChangeDb(7);
 5  
 6       var client = redis.As();
 7        var list = new List();
 8         
 9        foreach(var key in keys)
10        {
11            list.Add(client.GetValue(key.ToString(CultureInfo.InvariantCulture)));
12        }
13 
14       return list;
15     }

 
 
Redisは速いことで有名で、以上の書き方は一番速いわけではありません.上のループでは毎回独立したRedisアクセスが行われているので,すなわちQueryが1回行われ,Responseが返される.
[req1]
     [====waiting=====]
                      [resp1]
                            [req2]
                                 [====waiting=====]
                                                  [resp2]

 
もっと速い書き方はpipeline modeを使うことです.Pipeline modeは前回のQueryの結果を待つことなく、すぐに次のQueryを送信します.Responseが戻るたびに、Responseに対して対応するCallback処理が行われる.
 
コード実装は次のとおりです.
このコードはServiceStackから抜粋する.Redisのテストクラス
 1     [Test]
 2     public void Can_call_single_operation_with_callback_3_Times_in_pipeline()
 3     {
 4         var results = new List<long>();
 5         Assert.That(Redis.GetValue(Key), Is.Null);
 6         using (var pipeline = Redis.CreatePipeline())
 7         {
 8             pipeline.QueueCommand(r => r.IncrementValue(Key), results.Add);
 9             pipeline.QueueCommand(r => r.IncrementValue(Key), results.Add);
10             pipeline.QueueCommand(r => r.IncrementValue(Key), results.Add);
11             pipeline.Flush();
12         }
13 
14         Assert.That(Redis.GetValue(Key), Is.EqualTo("3"));
15         Assert.That(results, Is.EquivalentTo(new List<long> { 1, 2, 3 }));
16     }

 
転載先:https://www.cnblogs.com/fudaming/p/5439354.html