你的位置:首页 > 数据库

[数据库]ServiceStack.Redis 数据操作


简单的字符串类型数据写. 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<Poco>(); 7    var list = new List<Poco>(); 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, 返回了一个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   }