2010-01-23 11 views
5

मैं बस memcached पर स्विचिंग शुरू कर रहा हूँ और वर्तमान में memcached के साथ परीक्षण पर।क्या मेमकैच के लिए linq ऑब्जेक्ट को क्रमबद्ध करने के लिए वैसे भी है?

2 वस्तु रही है, इसलिए मैं एक वस्तु बना लिया है और [Serializable] उस पर (उदाहरण के लिए, इस Object1 कॉल) रखा, अन्य वस्तु Linq dbml (Object2) का उपयोग कर बनाई गई है ..

मैं List<Object1> memcached करने की कोशिश की, यह सिर्फ ठीक है, आकर्षण की तरह, यहाँ सबकुछ कैश है और ठीक से लोड किया गया है।

लेकिन फिर, मैं लिंक ऑब्जेक्ट पर जाता हूं, अब मैं memcached List<Object2> में जोड़ने की कोशिश करता हूं यह काम नहीं करता है, यह बिल्कुल memcached में नहीं जोड़ा गया था। कोई कुंजी जोड़ा नहीं गया

मैं आगे बढ़ता हूं और सीरियलाइजेशन मोड को यूनिडायरेक्शनल में बदलता हूं, फिर से जोड़ता हूं, फिर भी कोई आशा नहीं करता हूं।

क्या यह काम करने के लिए वैसे भी है?

यहाँ, साधारण परीक्षण मैं सिर्फ लिखा है codeplex से MemcachedProvider का उपयोग कर प्रदर्शित करने के लिए:

public ActionResult Test() 
{ 
    var returnObj = DistCache.Get<List<Post>>("testKey"); 
    if (returnObj == null) 
    { 
     DataContext _db = new DataContext(); 
     returnObj = _db.Posts.ToList(); 
     DistCache.Add("testKey", returnObj, new TimeSpan(29, 0, 0, 0)); 
     _db.Dispose(); 
    } 

    return Content(returnObj.First().TITLE); 
} 

इस Memcached से है, कोई स्टोर बुलाया गया था:

> NOT FOUND _x_testKey 
>532 END 
<528 get _x_testKey 
> NOT FOUND _x_testKey 
>528 END 
<516 get _x_testKey 
> NOT FOUND _x_testKey 
>516 END 

और मेरे एसक्यूएल प्रोफाइलर में, इसे 3 टेस्ट टाइम के लिए 3 क्वेरी कहा जाता है => यह साबित हुआ कि मेमकैड से वापस बुलाया गया ऑब्जेक्ट शून्य है, फिर यह क्वेरी करता है।

+0

यह सवाल (1) कुछ कोड नमूने (2) क्या गलत हो रहा है स्पष्ट व्याख्या से फायदा हो सकता है बिल्कुल और (3) आप .NET से memcached का उपयोग कैसे कर रहे हैं। कई .NET wrappers हैं और वे सभी इस संबंध में समान व्यवहार नहीं कर सकते हैं। –

+0

मैंने आपको जो कुछ भी जोड़ा है उसे जोड़ा। कोडरप्लेक्स से MemcachedProvider का उपयोग कर wraper im है। ऑब्जेक्ट 1 सफलतापूर्वक जोड़ा गया था लेकिन किसी भी तरह linq ऑब्जेक्ट नहीं था। – DucDigital

+0

अतिरिक्त जानकारी मदद करता है, लेकिन मुझे कोई समस्या नहीं दिखाई देती है। क्या आपने ऐड() कॉल डीबग किया है? यह देखने के लिए कि क्या MemcachedProvider भी इस अनुरोध के लिए memcached को कुछ भी भेज रहा है, एक टीसीपी प्रॉक्सी या Wireshark का उपयोग करने के बारे में क्या? –

उत्तर

2

ऐसा लगता है कि डिफ़ॉल्ट कार्यान्वयन (DefaultTranscoder) BinaryFormatter का उपयोग करना है; "unidirectional" सामान एक अलग serializer (DataContractSerializer) के लिए एक निर्देश है, और [Serializable] जोड़ें।

(नोट: मैं एक memo to myself जोड़ दिया है memcached के लिए एक Protobuf शुद्ध ट्रांसकोडर लिखने की कोशिश करने के लिए; कि शांत होगा और मुक्त करने के लिए इस का सबसे ठीक होगा)

मैं परीक्षण नहीं किया, लेकिन कुछ ही विकल्प खुद को प्रस्तुत करते:

  1. एक अलग ट्रांसकोडर कार्यान्वयन कि [DataContract] पता लगाता है और DataContractSerializer का उपयोग करता है लिखते हैं, और इस ट्रांसकोडर
  2. एक आंशिक वर्ग के माध्यम से अपने प्रकार के [Serializable] जोड़ने हुक (मैं आश्वस्त हूँ नहीं इस LINQ फ़ील्ड प्रकार serializable नहीं होने के कारण काम करेंगे)
  3. एक आंशिक वर्ग DataContractSerializer
  4. 3 की तरह का उपयोग करता है में एक ISerializable कार्यान्वयन जोड़ने के लिए, लेकिन Protobuf शुद्ध है, जो एक का उपयोग कर: के साथ काम करता "दिशाहीन", और ख: तेजी से और छोटे से DataContractSerializer
  5. एक serializable डीटीओ लिखने और करने के लिए अपने प्रकार के नक्शे कि

पिछले सरल है लेकिन अधिक काम जोड़ सकते है।

मुझे पहले तीसरे विकल्प को देखने का लुत्फ उठाना होगा, क्योंकि पहले प्रदाता को पुनर्निर्माण करना शामिल है; चौथा विकल्प भी निश्चित रूप से परीक्षण करने के लिए मेरी चीजों की सूची पर होगा।


मैं अक्रमांकन के दौरान एक अलग वस्तु लौटने डीसीएस की वजह से 3 के साथ संघर्ष किया,; मैंने इसके बजाए प्रोटोबफ-नेट पर स्विच किया, इसलिए यहां एक संस्करण है जो आपके मौजूदा [DataContract] प्रकार में partial class जोड़ने से दिखाता है जो इसे BinaryFormatter के साथ काम करता है। वास्तव में, मुझे लगता है (सबूत के साथ) यह भी कर देगा यह बहुत कुशल (कच्चे [Serializable] की तुलना में), भी:

using System; 
using System.IO; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Formatters.Binary; 
using ProtoBuf; 

/* DBML generated */ 
namespace My.Object.Model 
{ 
    [DataContract] 
    public partial class MyType 
    { 
     [DataMember(Order = 1)] 
     public int Id { get; set; } 

     [DataMember(Order = 2)] 
     public string Name { get; set; } 
    } 
} 
/* Your extra class file */ 
namespace My.Object.Model 
{ 
    // this adds **extra** code into the existing MyType 
    [Serializable] 
    public partial class MyType : ISerializable { 
     public MyType() {} 
     void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { 
      Serializer.Serialize(info, this); 
     } 
     protected MyType(SerializationInfo info, StreamingContext context) { 
      Serializer.Merge(info, this); 
     } 
    } 
} 
/* quick test via BinaryFormatter */ 
namespace My.App 
{ 
    using My.Object.Model; 
    static class Program 
    { 
     static void Main() 
     { 
      BinaryFormatter bf = new BinaryFormatter(); 
      MyType obj = new MyType { Id = 123, Name = "abc" }, clone; 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       bf.Serialize(ms, obj); 
       ms.Position = 0; 
       clone = (MyType)bf.Deserialize(ms); 
      } 
      Console.WriteLine(clone.Id); 
      Console.WriteLine(clone.Name); 
     } 
    } 
} 
+0

मैंने आपकी समस्या पर कुछ टिप्पणी जोड़ा, क्या आप जांच सकते हैं? – DucDigital

संबंधित मुद्दे

 संबंधित मुद्दे