我尝试使用Memcached在我们的应用程序中实现缓存,我能够为服务器设置密钥和值,但是当我试图获取值时,它总是返回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 :(得分: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 )