引用缓存对象

时间:2012-08-21 11:47:26

标签: c# .net caching

我正在为项目使用.NET C#。

我有一个我希望缓存的产品列表,因为它们在公司范围内使用。如果产品从缓存中退出,我已经知道如何锁定缓存并根据各种权限/博客站点上的模式重建它。

在我的页面/用户控件等中,我可能会获取对缓存的引用,如下所示:

var myCacheInstance = cachedProducts

但是,我可能也想做这样的事情:

myCacheInstance.Add(new product(...));

这也将更新缓存,因为它是同一个对象。

我有2个查询。

  1. 如果我有一个对缓存对象的引用,它是否保证在变量的生命周期内保留在缓存中?
  2. 在上面概述的scanario中,我该如何确保完整性?我只打算在这个实例中添加,但是假设我也在更新和删除对象?

3 个答案:

答案 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)