【问题标题】:Caching functions thread safe / deadlock safe for high traffic site?高流量站点的缓存功能线程安全/死锁安全?
【发布时间】:2018-10-02 05:19:53
【问题描述】:

对于高流量网站来说,以下功能是否是一种好的做法?是否存在任何类型的死锁或线程安全问题?

public static T GetInitializedTempCache<T>(string key, Func<T> getData, int minutes, bool skip = false)
{
    if (!skip)
    {
        var value = HttpRuntime.Cache[key];
        if (value == null || value.GetType() != typeof(T))
        {
            T data = getData();
            if (data != null && Config.Debugging.EnableCaching)
            {
                HttpRuntime.Cache.Add(key, data, null, DateTime.Now.AddMinutes(minutes), TimeSpan.Zero, System.Web.Caching.CacheItemPriority.Default, null);
            }
            return data;
        }
        return (T)value;
    }
    else
    {
        return getData();
    }
}

public static void RemoveTempCacheContains(string key)
{
    var keys = new List<string>();

    var enumerator = HttpRuntime.Cache.GetEnumerator();

    // copy all keys that currently exist in Cache
    while (enumerator.MoveNext())
    {
        var cacheKey = (string)enumerator.Key;

        if (cacheKey.Contains(key))
        {
            keys.Add(cacheKey);
        }
    }

    for (int i = 0; i < keys.Count; i++)
    {
        HttpRuntime.Cache.Remove(keys[i]);
    }
}

【问题讨论】:

  • 如果您正在研究缓存,请查看github.com/App-vNext/Polly 项目,这是一个“弹性和瞬态故障处理库”。它可能会在您网站的其他方面为您提供帮助。

标签: .net performance caching iis thread-safety


【解决方案1】:

回答您关于高流量网站的良好做法的问题。是的,缓存长时间运行的 IO 请求是一种很好的做法,使缓存机制通用也是一种很好的做法。不过有两个建议,将add 更改为insert,因为您肯定会遇到竞争情况。 insert 将始终插入最新的,而 add 将始终添加第一个。其次,既然您提到了高流量,请考虑使用 async func 替代方案。异步,将允许长时间运行的 IO 函数不阻塞请求线程。

回答你的失败问题。您没有在此代码中使用任何锁,因此您不应该遇到任何死锁。 getData() 我想也没有任何锁,只是在做一些长时间运行的 IO。 HttpRuntime.Cache 也是线程安全的。因此,除非getData() 不是线程安全的或有锁,否则应该没问题。

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
  • @GerhardBarnard 这怎么不能回答他的问题?正如他所问的,我指出他的代码没有缺点。正如他所要求的,我给出了高流量网站的建议。如果你能找到另一个问题让我为他回答,我会全力以赴。
  • 您对此有何看法? https://pseudomuto.com/2012/02/efficient-thread-safe-caching-with-asp.net/
  • @MikeFlynn 他将从缓存与数据库中检索作为竞争条件。但是,如果您采用这种方法并且您有 100,000 个请求同时进入,那么您有效地序列化等待每个请求的响应以验证它应该从缓存而不是数据库中获取数据。因此,如果您的数据库请求需要 10 毫秒,缓存需要 1 毫秒,那么您的最后一个请求将需要 1 毫秒进行第一次缓存检查,第一次锁定需要 12 毫秒,并且每个后续锁定需要 99,999 * 1 毫秒; 110.001 秒的响应时间。我会使用请求时可用的数据源。
  • 你是说我应该像他一样使用lock 设置还是那无关紧要。
猜你喜欢
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
相关资源
最近更新 更多