0

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

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

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

var myCacheInstance = cachedProducts

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

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

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

我有 2 个查询。

  1. 如果我有对缓存对象的引用,它是否保证在我的变量的生命周期内保持在缓存中?
  2. 在上面概述的扫描中,我如何确保完整性?我只打算在这种情况下添加,但假设我也在更新和删除对象?
4

3 回答 3

1

1)如果我有对缓存对象的引用,它是否保证在我的变量的生命周期内保持在缓存中?

如果我正确解释这个问题:responce is no

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. 举个例子,如果它真的符合您的需要,只能告诉我们您。

于 2012-08-21T11:50:46.020 回答
1

不要传递对缓存的引用!

使用对象作为缓存,如果客户端希望缓存项返回缓存项的新列表或只读集合。如果要将项目添加到缓存中,请使用缓存对象上的方法并在该方法中锁定缓存并添加项目。与删除相同。

问题 1:如果您传递参考资料,您无法保证任何事情。问题 2:如上所述,使用一个对象来缓存您的所有项目。

public class Cache
{
  private List<Item> cachedItems = new List<Item>();

  public void Add(Item item)
  {
   lock(cachedItems)
   {
    cachedItems.Add(item);
   }
  }
}
于 2012-08-21T11:54:53.213 回答
0

你好为了保证完整性,必须加key

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) 
于 2012-08-21T11:54:38.113 回答