我正在为项目使用.NET C#。
我有一个我希望缓存的产品列表,因为它们在公司范围内使用。如果产品从缓存中退出,我已经知道如何锁定缓存并根据各种权限/博客站点上的模式重建它。
在我的页面/用户控件等中,我可能会获取对缓存的引用,如下所示:
var myCacheInstance = cachedProducts
但是,我可能也想做这样的事情:
myCacheInstance.Add(new product(...));
这也将更新缓存,因为它是同一个对象。
我有2个查询。
答案 0 :(得分:1)
1)如果我有对缓存对象的引用,则保证 在变量的生命周期内保留在缓存中吗?
如果我正确解释这个问题:答案是否。
cache.Add("key", new object()); // ADD KEY
var obj = cache["key"]; // GET REFERENCE TO CACHED OBJECT
cache.Remove("key"); // REMOVE OBJECT FROM CACHE
obj.DoSomething(..); //PERFECTLY VALID, STILL WORK ..
2)在上面概述的scanario中,我该如何确保 诚信?我只打算在这个例子中添加,但是假设, 我也在更新和删除对象?
可以添加bool
属性,例如:
public bool IsValid
{
get; private set;
}
删除对象时,此属性从类设置为false
。举个例子,如果它真的适合你的需要可以告诉我们只有你。
答案 1 :(得分:1)
不要传递对缓存的引用!
使用对象作为缓存,如果客户希望缓存的项目返回缓存项目的新列表,或者只读集合。 如果要将项添加到缓存,请在缓存对象上使用方法,并在该方法中锁定缓存并添加项。与删除相同。
问题1:如果您传递参考文献,则无法保证任何内容。 问题2:使用对象缓存所有项目,如上所述。
public class Cache
{
private List<Item> cachedItems = new List<Item>();
public void Add(Item item)
{
lock(cachedItems)
{
cachedItems.Add(item);
}
}
}
答案 2 :(得分:0)
你好,为了确保完整性,你必须添加密钥
Cache.Add("YourKey", yourValue)
在这里你可以找到所有操作的助手
http://johnnycoder.com/blog/2008/12/10/c-cache-helper-class/
对于持续时间或超时,您可以使用此格式,其中指定absoluteExpiration
public Object Add (string key, Object value, CacheDependency dependencies,
DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority
priority, CacheItemRemovedCallback onRemoveCallback)