gpt4 book ai didi

c# - 在 asp.net 中管理缓存对象

转载 作者:行者123 更新时间:2023-11-30 16:17:22 25 4
gpt4 key购买 nike

我有一个存储在 asp.net 缓存中的产品列表,但我在刷新缓存时遇到问题。根据我们的要求,我想每 15 分钟刷新一次缓存,但我想知道,如果同时刷新缓存,如果某些用户询问产品列表,那么他应该得到错误或旧列表,还是他有等待缓存刷新。

示例代码如下

public class Product
{
public int Id{get;set;}
public string Name{get;set;}
}

我们有一个函数可以为我们提供 BLL 中的产品列表

public List<Product> Products()
{
//////some code
}

Cache.Insert("Products", Products(), null, DateTime.Now.AddMinutes(15), TimeSpan.Zero);

我想在这里再添加一种情况,假设我使用静态对象而不是缓存对象,那么如果我们在独立服务器上而不是集群上会发生什么,哪种方法最好

最佳答案

抱歉 - 这可能是天真/显而易见的,但只有一个外观类型类可以做到

if(Cache["Products"] == null)
{
Cache.Insert("Products", Products(), null, DateTime.Now.AddMinutes(15), TimeSpan.Zero);
}
return Cache["Products"];

还有一个CacheItemRemoveCallback委托(delegate),您可以使用它来重新填充过期的缓存。作为替代方案

还有

使用缓存对象而不是静态对象。显然效率更高 ( Asp.net - Caching vs Static Variable for storing a Dictionary ),您将获得所有缓存管理方法(滑动过期等)

编辑

如果担心更新时间,则考虑两个缓存对象和一个 Controller ,例如

  1. 主动缓存
  2. 备份缓存 - 这是将要更新的缓存
  3. 缓存 Controller (另一个缓存对象?)这将指示哪个对象是事件的

所以更新的过程将是

  1. 更新备份缓存
  2. 完成。支票有效
  3. 备份变为事件状态,反之亦然。该控件现在将备份缓存标记为事件

需要有一个方法可以在填充产品缓存对象时触发。我可能会使用 CacheItemRemoveCallback 委托(delegate)来启动缓存重新填充。或者在外观类型类中进行异步调用——您不希望它阻塞当前线程

我敢肯定还有很多其他的变体

编辑 2

实际上考虑到这个我会把 Controller 类做成这样

public class CacheController
{
public StateEnum Cache1State {get;set;}
public StateEnum Cache1State {get;set;}
public bool IsUpdating {get;set;}
}

状态将是事件的、备份的、更新的,也可能是非事件的和错误的。您可以在更新发生时设置 IsUpdating 标志,然后在完成后返回 false 以停止多个线程同时尝试更新 - 即竞争条件。该类只是一个总的原则,可以/应该根据需要进行修改

关于c# - 在 asp.net 中管理缓存对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17274110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com