2016-03-23 228 views
2

我想在我們的應用程序中使用Memcached實現緩存,我能夠設置鍵和值到服務器,但是當我試圖獲取值時它總是返回一個null 。以下是我的示例代碼片段。MEMCACHED get方法總是返回null

//memcached configuration in my web config 
<enyim.com> 
    <memcached protocol="Binary"> 
    <servers> 
     <add address="127.0.0.1" port="11211"/> 
    </servers> 
    <socketPool minPoolSize="10" maxPoolSize="100" 
        connectionTimeout="00:10:00" deadTimeout="00:05:00"/> 

    </memcached> 
</enyim.com> 
<configSections> 
    <sectionGroup name="enyim.com"> 
     <section name="memcached" 
      type="Enyim.Caching.Configuration.MemcachedClientSection, 
      Enyim.Caching"/> 
    </sectionGroup> 
</configSections> 





//Get method in my controller 
public object GetSalesOrder() 
{ 
     using (Enyim.Caching.MemcachedClient mc = new Enyim.Caching.MemcachedClient()) 
     { 
      mc.FlushAll(); 
      var salesOrders = salesOrderListService.GetSalesOrders(); 
      byte[] val; 
      val = S.Serializer.objectToByteArray(salesOrders); 
      mc.Store(Enyim.Caching.Memcached.StoreMode.Set, "salesOrderList", val); 
      byte[] data = mc.Get<byte[]>("salesOrderList"); 
      var returnObj = S.Serializer.ByteArrayToObject<List<Model.SalesOrderList>>((byte[])val); 

      return returnObj; 
     }    
    } 


//Model 

[Serializable] 
[ResourceType("SalesOrderList")] 
public class SalesOrderList 
{ 
    public int Id { get; set; } 
    public string Code{ get; set; } 
    public string CustomerName{ get; set; } 
    public DateTime OrderDate { get; set; } 
    public DateTime ShipDate { get; set; } 
} 

//Serializer class 
public class Serializer 
    { 
     public static byte[] objectToByteArray<T>(T obj) 
     { 
      System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 

      using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) 
      { 
       formatter.Serialize(ms, obj); 
       return ms.ToArray(); 
      } 
     } 

     public static Object ByteArrayToObject<T>(byte[] arrBytes) 
     { 
      using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) 
      { 
       System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
       ms.Write(arrBytes, 0, arrBytes.Length); 
       ms.Seek(0, System.IO.SeekOrigin.Begin); 

       object obj = (Object)formatter.Deserialize(ms); 

       return obj; 
      } 
     } 
    } 

我錯過了什麼嗎?

回答

0

我在代碼中看到錯誤的一件事是您沒有緩存鍵來存儲或檢索您的數據。我在代碼中的做法如下:

// create cachekey for storing and retrieving 
var cacheKey = Guid.NewGuid().ToString(); 
// store for an hour 
// memcachedClient.Store(StoreMode.Set, SanitizeCacheKey(cacheKey), value, validFor) 
mc.Store(StoreMode.Set, cacheKey , val, new TimeSpan(0, 1, 0, 0)); 

AccessCache.Get<byte[]>(cacheKey)