U4-4931 - fixing & refactoring

Conflicts:
	src/Umbraco.Core/Cache/DictionaryCacheProviderBase.cs
	src/Umbraco.Core/Cache/HttpRuntimeCacheProvider.cs
	src/Umbraco.Core/Cache/ObjectCacheRuntimeCacheProvider.cs
This commit is contained in:
Stephan
2014-05-22 09:36:08 +02:00
parent 8729156fbf
commit e2f4cfaf82
3 changed files with 204 additions and 72 deletions

View File

@@ -8,7 +8,7 @@ namespace Umbraco.Core.Cache
{
internal abstract class DictionaryCacheProviderBase : ICacheProvider
{
protected static readonly ReaderWriterLockSlim Locker = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
protected readonly ReaderWriterLockSlim Locker = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
protected abstract DictionaryCacheWrapper DictionaryCache { get; }
/// <summary>
@@ -42,8 +42,9 @@ namespace Umbraco.Core.Cache
{
using (new WriteLock(Locker))
{
if (DictionaryCache[GetCacheKey(key)] == null) return;
DictionaryCache.Remove(GetCacheKey(key)); ;
var cacheKey = GetCacheKey(key);
if (DictionaryCache[cacheKey] == null) return;
DictionaryCache.Remove(cacheKey);
}
}
@@ -123,15 +124,21 @@ namespace Umbraco.Core.Cache
/// <param name="keyStartsWith">The start of the key</param>
public virtual void ClearCacheByKeySearch(string keyStartsWith)
{
var keysToRemove = DictionaryCache.Cast<object>()
.Select(item => new DictionaryItemWrapper(item))
.Where(c => c.Key is string && ((string)c.Key).InvariantStartsWith(string.Format("{0}-{1}", CacheItemPrefix, keyStartsWith)))
.Select(c => c.Key)
.ToList();
foreach (var k in keysToRemove)
using (new WriteLock(Locker))
{
DictionaryCache.Remove(k);
var keysToRemove = DictionaryCache.Cast<object>()
.Select(item => new DictionaryItemWrapper(item))
.Where(
c =>
c.Key is string &&
((string) c.Key).InvariantStartsWith(string.Format("{0}-{1}", CacheItemPrefix, keyStartsWith)))
.Select(c => c.Key)
.ToList();
foreach (var k in keysToRemove)
{
DictionaryCache.Remove(k);
}
}
}
@@ -141,54 +148,65 @@ namespace Umbraco.Core.Cache
/// <param name="regexString"></param>
public virtual void ClearCacheByKeyExpression(string regexString)
{
var keysToRemove = new List<object>();
foreach (var item in DictionaryCache)
using (new WriteLock(Locker))
{
var c = new DictionaryItemWrapper(item);
var s = c.Key as string;
if (s != null)
var keysToRemove = new List<object>();
foreach (var item in DictionaryCache)
{
var withoutPrefix = s.TrimStart(string.Format("{0}-", CacheItemPrefix));
if (Regex.IsMatch(withoutPrefix, regexString))
var c = new DictionaryItemWrapper(item);
var s = c.Key as string;
if (s != null)
{
keysToRemove.Add(c.Key);
var withoutPrefix = s.TrimStart(string.Format("{0}-", CacheItemPrefix));
if (Regex.IsMatch(withoutPrefix, regexString))
{
keysToRemove.Add(c.Key);
}
}
}
}
foreach (var k in keysToRemove)
{
DictionaryCache.Remove(k);
foreach (var k in keysToRemove)
{
DictionaryCache.Remove(k);
}
}
}
public virtual IEnumerable<object> GetCacheItemsByKeySearch(string keyStartsWith)
{
return (from object item in DictionaryCache
using (new ReadLock(Locker))
{
return (from object item in DictionaryCache
select new DictionaryItemWrapper(item)
into c
where c.Key is string && ((string) c.Key).InvariantStartsWith(string.Format("{0}-{1}", CacheItemPrefix, keyStartsWith))
where
c.Key is string &&
((string) c.Key).InvariantStartsWith(string.Format("{0}-{1}", CacheItemPrefix, keyStartsWith))
select c.Value).ToList();
}
}
public IEnumerable<object> GetCacheItemsByKeyExpression(string regexString)
public virtual IEnumerable<object> GetCacheItemsByKeyExpression(string regexString)
{
var found = new List<object>();
foreach (var item in DictionaryCache)
using (new ReadLock(Locker))
{
var c = new DictionaryItemWrapper(item);
var s = c.Key as string;
if (s != null)
var found = new List<object>();
foreach (var item in DictionaryCache)
{
var withoutPrefix = s.TrimStart(string.Format("{0}-", CacheItemPrefix));
if (Regex.IsMatch(withoutPrefix, regexString))
var c = new DictionaryItemWrapper(item);
var s = c.Key as string;
if (s != null)
{
found.Add(c.Value);
var withoutPrefix = s.TrimStart(string.Format("{0}-", CacheItemPrefix));
if (Regex.IsMatch(withoutPrefix, regexString))
{
found.Add(c.Value);
}
}
}
}
return found;
return found;
}
}
/// <summary>
@@ -198,8 +216,11 @@ namespace Umbraco.Core.Cache
/// <returns></returns>
public virtual object GetCacheItem(string cacheKey)
{
var result = DictionaryCache.Get(GetCacheKey(cacheKey));
return result;
using (new ReadLock(Locker))
{
var result = DictionaryCache.Get(GetCacheKey(cacheKey));
return result;
}
}
public abstract object GetCacheItem(string cacheKey, Func<object> getCacheItem);