From 761354dbf5b03421302e2016e7f716fae08036b7 Mon Sep 17 00:00:00 2001 From: Stephan Date: Wed, 18 Sep 2013 10:05:44 +0200 Subject: [PATCH] Core.Cache - add new method to remove items from cache --- src/Umbraco.Core/Cache/CacheProviderBase.cs | 1 + .../Cache/HttpRuntimeCacheProvider.cs | 27 ++++++++++++ src/Umbraco.Core/Cache/NullCacheProvider.cs | 4 ++ src/Umbraco.Core/Cache/StaticCacheProvider.cs | 41 ++++--------------- src/Umbraco.Core/CacheHelper.cs | 8 ++++ 5 files changed, 49 insertions(+), 32 deletions(-) diff --git a/src/Umbraco.Core/Cache/CacheProviderBase.cs b/src/Umbraco.Core/Cache/CacheProviderBase.cs index 026f6f9dbc..012d8b23b2 100644 --- a/src/Umbraco.Core/Cache/CacheProviderBase.cs +++ b/src/Umbraco.Core/Cache/CacheProviderBase.cs @@ -15,6 +15,7 @@ namespace Umbraco.Core.Cache public abstract void ClearCacheItem(string key); public abstract void ClearCacheObjectTypes(string typeName); public abstract void ClearCacheObjectTypes(); + public abstract void ClearCacheObjectTypes(Func predicate); public abstract void ClearCacheByKeySearch(string keyStartsWith); public abstract void ClearCacheByKeyExpression(string regexString); public abstract IEnumerable GetCacheItemsByKeySearch(string keyStartsWith); diff --git a/src/Umbraco.Core/Cache/HttpRuntimeCacheProvider.cs b/src/Umbraco.Core/Cache/HttpRuntimeCacheProvider.cs index e574f38454..f5fc0e237f 100644 --- a/src/Umbraco.Core/Cache/HttpRuntimeCacheProvider.cs +++ b/src/Umbraco.Core/Cache/HttpRuntimeCacheProvider.cs @@ -103,6 +103,33 @@ namespace Umbraco.Core.Cache } } + /// + /// Clears all objects in the System.Web.Cache with the System.Type specified that satisfy the predicate + /// + public override void ClearCacheObjectTypes(Func predicate) + { + try + { + lock (Locker) + { + foreach (DictionaryEntry c in _cache) + { + var key = c.Key.ToString(); + if (_cache[key] != null + && _cache[key] is T + && predicate(key, (T)_cache[key])) + { + _cache.Remove(c.Key.ToString()); + } + } + } + } + catch (Exception e) + { + LogHelper.Error("Cache clearing error", e); + } + } + /// /// Clears all cache items that starts with the key passed. /// diff --git a/src/Umbraco.Core/Cache/NullCacheProvider.cs b/src/Umbraco.Core/Cache/NullCacheProvider.cs index 3d1bbaa79d..0ffecf59e3 100644 --- a/src/Umbraco.Core/Cache/NullCacheProvider.cs +++ b/src/Umbraco.Core/Cache/NullCacheProvider.cs @@ -23,6 +23,10 @@ namespace Umbraco.Core.Cache { } + public override void ClearCacheObjectTypes(Func predicate) + { + } + public override void ClearCacheByKeySearch(string keyStartsWith) { } diff --git a/src/Umbraco.Core/Cache/StaticCacheProvider.cs b/src/Umbraco.Core/Cache/StaticCacheProvider.cs index 0d0d2f288c..e3ca529361 100644 --- a/src/Umbraco.Core/Cache/StaticCacheProvider.cs +++ b/src/Umbraco.Core/Cache/StaticCacheProvider.cs @@ -27,50 +27,27 @@ namespace Umbraco.Core.Cache public override void ClearCacheObjectTypes(string typeName) { - foreach (var key in _staticCache.Keys) - { - if (_staticCache[key] != null - && _staticCache[key].GetType().ToString().InvariantEquals(typeName)) - { - object val; - _staticCache.TryRemove(key, out val); - } - } + _staticCache.RemoveAll(kvp => kvp.Value.GetType().ToString().InvariantEquals(typeName)); } public override void ClearCacheObjectTypes() { - foreach (var key in _staticCache.Keys) - { - if (_staticCache[key] != null - && _staticCache[key].GetType() == typeof(T)) - { - object val; - _staticCache.TryRemove(key, out val); - } - } + _staticCache.RemoveAll(kvp => kvp.Value is T); + } + + public override void ClearCacheObjectTypes(Func predicate) + { + _staticCache.RemoveAll(kvp => kvp.Value is T && predicate(kvp.Key, (T)kvp.Value)); } public override void ClearCacheByKeySearch(string keyStartsWith) { - foreach (var key in _staticCache.Keys) - { - if (key.InvariantStartsWith(keyStartsWith)) - { - ClearCacheItem(key); - } - } + _staticCache.RemoveAll(kvp => kvp.Key.InvariantStartsWith(keyStartsWith)); } public override void ClearCacheByKeyExpression(string regexString) { - foreach (var key in _staticCache.Keys) - { - if (Regex.IsMatch(key, regexString)) - { - ClearCacheItem(key); - } - } + _staticCache.RemoveAll(kvp => Regex.IsMatch(kvp.Key, regexString)); } public override IEnumerable GetCacheItemsByKeySearch(string keyStartsWith) diff --git a/src/Umbraco.Core/CacheHelper.cs b/src/Umbraco.Core/CacheHelper.cs index 96b3d99de9..8f7edeb777 100644 --- a/src/Umbraco.Core/CacheHelper.cs +++ b/src/Umbraco.Core/CacheHelper.cs @@ -110,6 +110,14 @@ namespace Umbraco.Core } } + internal void ClearStaticCacheObjectTypes(Func predicate) + { + if (_enableCache) + _staticCache.ClearCacheObjectTypes(predicate); + else + _nullStaticCache.ClearCacheObjectTypes(predicate); + } + /// /// Clears all static cache items that starts with the key passed. ///