如何实现定期缓存重新加载

时间:2018-05-21 20:04:43

标签: c#

firebase deploy

上述缓存由单身包装器使用。以下是实施。

public class Cache<TKey, TValue> : ICache<TKey, TValue>
{
    private readonly IDictionary<TKey, TValue> _internalCache;
    private readonly object _syncLock = new object();

    public Cache()
    {
        _internalCache = new Dictionary<TKey, TValue>();
    }

    public TValue this[TKey key]
    {
        get
        {
            lock (_syncLock) {
               //...
            }
        }
        set
        {
            lock (_syncLock) {
               //...
            }
        }
    }

    public ICollection<TValue> GetAll()
    {
        lock (_syncLock) {
            return _internalCache.Values;
        }
    }

    public bool ContainsKey(TKey key)
    {
        lock (_syncLock)
        {
            return _internalCache.ContainsKey(key);
        }
    }

}  

现在我的问题是,如果我想重新加载缓存,我可以使用以下内容吗?我希望无缝重新加载,以便线程可以访问陈旧信息。

public class ActivityCache : ICache<string, Activity> 
 {
    private readonly ICache<string, Activity> _cache = new Cache<string, Activity>();

    private static readonly ActivityCache _instance = new ActivityCache();

    // http://www.yoda.arachsys.com/csharp/singleton.html
    static ActivityCache()
    {
    }

    ActivityCache()
    {
    }

    public static ActivityCache Instance
    {
        get { return _instance; }
    }

    public Activity this[string activityUrl]
    {
        get
        {
            if (string.IsNullOrEmpty(activityUrl))
            {
                return null;
            }

            return _cache[activityUrl];
        }
        set
        {
            if (string.IsNullOrEmpty(activityUrl))
            {
                return;
            }

            _cache[activityUrl] = value;
        }
    }

    public ICollection<Activity> GetAll()
    {
        return _cache.GetAll();
    }

    public bool ContainsKey(string key)
    {
        return _cache.ContainsKey(key);
    }
}

_internalCache是​​readonly。它不会让我改变任务。

2 个答案:

答案 0 :(得分:1)

_internalCache是只读的(我假设您不仅要删除readonly关键字才能使其正常工作)。但这只会影响对列表的引用。您仍然可以替换列表中的项,如下所示:

public void Reload(IDictionary<TKey, TValue> values)
{
    lock(_synclock)
    {
        _internalCache.Clear();
        _internalCache.AddRange(values);
    }
}

此外,不是自己编写所有这些锁,也许你可以考虑使用ConcurrentDictionary提供以安全方式访问密钥的方法,甚至允许你提供一个委托来重新填充一个密钥条目不见了。

答案 1 :(得分:0)

实际上,您不需要重新创建字典(因为它是只读的)。您可以清除所有值,只需从Clear()调用IDictionary<TKey, TValue>方法即可。样本:

public void Reload(IDictionary<TKey, TValue> values)
{
    lock (_synclock)
    {
       _internalCache.Clear();

       foreach (var value in values)
          _internalCache.Add(value);
    }
}