Ich versuche, das Caching in unserer Anwendung mithilfe von Memcached zu implementieren. Ich konnte den Schlüssel und den Wert für den Server festlegen. Wenn ich jedoch versuche, den Wert abzurufen, wird immer eine Null zurückgegeben. Unten ist mein Beispielcode-Snippet.
//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;
}
}
}
Vermisse ich etwas
Eine Sache, die ich in Ihrem Code falsch sehe, ist, dass Sie keinen Cache-Schlüssel zum Speichern oder Abrufen Ihrer Daten haben. Die Art und Weise, wie ich es in meinem Code mache, ist wie folgt:
// 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 )
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen