, , , ( ) , . , , - -. Cache Hit, Cache, , , . , Cache Hit, , .
, . . 1:1, . , 10 , 90, . , 10, 90, .
, , . , . ------ ( , ). , , CacheDependency , , .
, - , - CacheDependency . , , , . , .
, CacheDependencies, ICacheItemExpiration CachingBlock Enterprise Library. , CachingBlock , ASP.NET . DatabaseExpirationManager, , . , , DatabaseExpirationManager. DatabaseExpirationManager , , . , , , . DatabaseExpirationManager , . , , , .
Ok. -, , . -, , .
backback, 2005 / 2006 , .NET 2.0, , ( ). 2005 ./ 2005 ./ 2006 . 2006 CodePlex.
, , - . , CacheManager. ( Microsoft.Practices.EnterpriseLibrary.Caching):
Cache
BackgroundScheduler
ExpirationPollTimer
Cache - EntLib. BackgroundScheduler . ExpirationPollTimer Timer.
, -, , Cache . . EntLib ASP.NET , , , . , , . -, , .
BackgroundScheduler : DatabaseExpirationWorker DatabaseExpirationManager. DatabaseExpirationManager , :
private object _syncRoot = new object();
private List<Guid> _objectChanges = new List<Guid>();
public event EventHandler<DatabaseExpirationEventArgs> ExpirationFired;
...
public void UpdateExpirations()
{
lock ( _syncRoot )
{
DataTable dt = GetExpirationsFromDb();
List<Guid> keys = new List<Guid>();
foreach ( DataRow dr in dt.Rows )
{
Guid key = (Guid)dr[0];
keys.Add(key);
_objectChanges.Add(key);
}
if ( ExpirationFired != null )
ExpirationFired(this, new DatabaseExpirationEventArgs(keys));
}
}
DatabaseExpirationEventArgs :
public class DatabaseExpirationEventArgs : System.EventArgs
{
public DatabaseExpirationEventArgs( List<Guid> expiredKeys )
{
_expiredKeys = expiredKeys;
}
private List<Guid> _expiredKeys;
public List<Guid> ExpiredKeys
{
get { return _expiredKeys; }
}
}
. . PK . , , ( , ), , GetExpirationsFromDb , . , . : - ( datetime IIRC). , . , Guid .
DatabaseExpirationWorker BackgroundScheduler, , DoExpirationTimeoutExpired DatabaseExpirationManager UpdateExpirations. BackgroundScheduler virtual, BackgroundScheduler .
, , EntLib CacheManager, DatabaseExpirationWorker BackgroundScheduler, :
private List<Guid> _objectExpirations;
private void OnExpirationFired( object sender, DatabaseExpirationEventArgs e )
{
_objectExpirations = e.ExpiredKeys;
lock(_objectExpirations)
{
foreach( Guid key in _objectExpirations)
this.RealCache.Remove(key);
}
}
private Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager _realCache;
private Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager RealCache
{
get
{
lock(_syncRoot)
{
if ( _realCache == null )
_realCache = Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager.CacheFactory.GetCacheManager();
return _realCache;
}
}
}
public object this[string key]
{
get
{
lock(_objectExpirations)
{
if (_objectExpirations.Contains(key))
return null;
return this.RealCache.GetData(key);
}
}
}
, , , . , , . EntLib, , . , , , , . , , . , .