2012-10-09 81 views
3

我在C#中使用Redis Servicestack。目前,我存儲數據的方式如下:ServiceStack Redis C#緩慢檢索數據

var listTypedRedis = db.As<MyObject>(); 

foreach (var obj in myObjects) 
{ 
     listTypedRedis.AddItemToList(listTypedRedis.Lists["urn:list"], obj); 
} 

我成功地存儲了約6000條記錄。我在檢索記錄時遇到問題,因爲它看起來比SQL慢。

接過Redis的138ms,拿了SQL 105ms

我檢索數據的方法如下:

return (db.As<MyObject>().Lists["urn:list"].GetAll()); 

有上面我的代碼有問題嗎?是因爲反序列化導致它變得如此慢?謝謝!

回答

1

每當處理遠程數據存儲時,都應考慮在可能的情況下使用批處理方法。例如在ServiceStack.Redis中,您可以使用AddRangeToList將多個項目添加到列表中。

Redis 中的每項操作都會使網絡調用儘可能地進行優化。 RedisClient有許多批處理操作,它也支持PipeliningTransactions這兩個都是pipelined (redis docs),並允許您以更少的套接字寫入批處理多個操作。

+0

非常感謝您的回答。 AddRangeToList只接受列表類型。列表中有批處理方法嗎? – slee

+1

最終,redis中的所有內容都以字節(RedisNativeClient)存儲,字符串存儲在Utf8(RedisClient)中,而POCO類型只是在存儲爲TPoco - > JSON/string - > bytes(RedisTypedClient)之前序列化爲JSON。如果你想要一個類型化的API,你需要使用一個類型化的客戶端,例如查看'RedisClientList .AddRange' https://github.com/ServiceStack/ServiceStack.Redis/blob/master/src/ServiceStack.Redis/Generic/RedisClientList.Generic.cs#L176 – mythz

+0

明白了。再次感謝。目前,我在本地做所有事情,所以我想我不會看到太大的區別,如果我批量或不批改,對不對?另外,當我查看這個[link](https://github.com/ServiceStack/ServiceStack.Redis#speed)時,它看起來需要132.0076ms才能獲得3203條記錄,SQL需要更少的時間才能獲得很多記錄/對象。任何想法爲什麼? – slee