"जस्ट" एक बहुत ही सापेक्ष शब्द है, और अधिक संदर्भ के बिना वास्तव में इसका कोई मतलब नहीं है, विशेष रूप से:ये पेलोड कितने बड़े हैं?
हालांकि, जांच में आपकी मदद करने के लिए कुछ बिंदुओं को स्पष्ट करने के लिए:
IDatabase
को लॉक करने की कोई आवश्यकता नहीं है जब तक कि वह विशुद्ध रूप से आपके अपने उद्देश्यों के लिए न हो; SE.Redis आंतरिक रूप से थ्रेड सुरक्षा से संबंधित है और इसका उद्देश्य प्रतिस्पर्धी थ्रेड्स द्वारा उपयोग किया जाना है- फिलहाल, इसके लिए आपके समय में सभी क्रमांकन कोड शामिल होंगे (
JsonConvert.SerializeObject
); यह जोड़ देगा, विशेष रूप से यदि आपकी वस्तुएँ बड़ी हैं; एक अच्छा उपाय प्राप्त करने के लिए, मैं दृढ़ता से सुझाव देता हूं कि आपको क्रमांकन और रेडिस समय अलग से batch.Execute()
विधि एक पाइपलाइन एपीआई का उपयोग करती है और कॉल के बीच प्रतिक्रियाओं की प्रतीक्षा नहीं करती है, इसलिए:जो समय आप देख रहे हैं वह नहीं है विलंबता का संचयी प्रभाव; जो केवल स्थानीय सीपीयू (क्रमबद्धता के लिए), नेटवर्क बैंडविड्थ, और सर्वर सीपीयू छोड़ता है; क्लाइंट लाइब्रेरी टूल इनमें से किसी भी चीज़ को प्रभावित नहीं कर सकते हैं- एक
StringSet
है ओवरलोड जो एकKeyValuePair<RedisKey, RedisValue>[]
. को स्वीकार करता है; आप कर सकते थे बैच के बजाय इसका उपयोग करना चुनें, लेकिन यहाँ केवल अंतर यह है कि यह varadicMSET
है एकाधिक के बजायSET
; किसी भी तरह से, आप अवधि के लिए अन्य कॉलर्स के लिए कनेक्शन को ब्लॉक कर देंगे (चूंकि बैच का उद्देश्य कमांड को सन्निहित बनाना है) - आप वास्तव में नहीं करते हैं
CreateBatch
. का उपयोग करने की आवश्यकता है यहाँ, विशेष रूप से चूंकि आप डेटाबेस को लॉक कर रहे हैं (लेकिन मेरा अभी भी सुझाव है कि आपको ऐसा करने की आवश्यकता नहीं है);CreateBatch
. का उद्देश्य आदेशों का अनुक्रम बनाना है अनुक्रमिक , लेकिन मुझे नहीं लगता कि आपको यहां इसकी आवश्यकता है; आप बस उपयोग कर सकते हैं_database.StringSetAsync
बदले में प्रत्येक आदेश के लिए, जो भी . होगा इसका लाभ यह है कि आप समानांतर में . क्रमांकन चला रहे होंगे पिछला कमांड भेजा जा रहा है - यह आपकोCreateBatch
को हटाने के अलावा किसी भी काम के बिना क्रमांकन (CPU बाउंड) और रेडिस ऑप्स (IO बाउंड) को ओवरलैप करने की अनुमति देगा। बुलाना; इसका मतलब यह भी होगा कि आप अन्य कॉल करने वालों के कनेक्शन का एकाधिकार नहीं करते हैं
इसलिए; पहला मैं जो काम करूंगा वह यह होगा कि निकालें कुछ कोड:
private static StackExchange.Redis.IDatabase _database;
static JsonSerializerSettings _redisJsonSettings = new JsonSerializerSettings {
ContractResolver = new SerializeAllContractResolver(),
ReferenceLoopHandling = ReferenceLoopHandling.Ignore };
public void SetAll<T>(Dictionary<string, T> data, int cacheTime)
{
TimeSpan expiration = new TimeSpan(0, cacheTime, 0);
var list = new List<Task<bool>>();
foreach (var item in data)
{
string serializedObject = JsonConvert.SerializeObject(
item.Value, Formatting.Indented, _redisJsonSettings);
list.Add(_database.StringSetAsync(item.Key, serializedObject, expiration));
}
Task.WhenAll(list.ToArray());
}
दूसरी चीज जो मैं करूंगा वह यह होगा कि रेडिस कार्य के लिए अलग से क्रमांकन किया जाए।
तीसरी चीज जो मैं करूंगा वह यह देखना होगा कि क्या मैं MemoryStream
को क्रमबद्ध कर सकता हूं इसके बजाय, आदर्श रूप से एक जिसे मैं फिर से उपयोग कर सकता हूं - string
. से बचने के लिए आवंटन और UTF-8 एन्कोड:
using(var ms = new MemoryStream())
{
foreach (var item in data)
{
ms.Position = 0;
ms.SetLength(0); // erase existing data
JsonConvert.SerializeObject(ms,
item.Value, Formatting.Indented, _redisJsonSettings);
list.Add(_database.StringSetAsync(item.Key, ms.ToArray(), expiration));
}
}