一、在添加一个缓存项时,允许指定一个过期策略,这个过期策略对象要实现ICacheItemExpiration接口,常见的过期策略有:
绝对过期时间 : AbsoluteTime
表达式表示的时间过期策略:ExtendedFormatTime
程序运行中一直不会过期NeverExpired:
每次读取之后,再延长指定的时间后才会过期:SlidingTime。
文件依赖:FileDependency
二、自己实现一个,缓存项依赖:CacheItemDependency
参考FileDependency的实现,缓存项的过期与否取决于文件是否发生了变化,我们自己实现一个过期策略,就是缓存项的过期与否取决于另一个NeverExpired的缓存项是否发生了变化。
代码如下:
三、使用方法
1、更新缓存所依赖的缓存项。代码如下:
2、每次更新数据库中的表时,调用UpdateCacheDependency方法。
在上述代码中cacheKey可以用数据库中标的名称。
还有一个问题就是 每次更新数据库中的表时,都要调用UpdateCacheDependency方法,是不是很烦,这也是没有办法的,必须调用,否则 依赖于 以cacheKey为Key的缓存项 的缓存项 不会失效,一般可以在数据访问的基类中将Insert\Update\Delete执行的地方调用这个方法即可。
如果用DataSet,代码类似这样:
如果用实体类,代码类似这样:
{
int returnValue = -1;
try
{
Database db = DatabaseFactory.CreateDatabase();
DbCommand cmd = db.GetStoredProcCommand(spName);
if (populateParamters != null)
{
populateParamters(entity, db, cmd);
}
if (handleReturnValue != null)
{
db.AddParameter(cmd, "ReturnValue", DbType.Int32, ParameterDirection.ReturnValue, String.Empty, DataRowVersion.Default, null);
}
db.ExecuteNonQuery(cmd);
returnValue = 0;
if (handleReturnValue != null)
{
returnValue = DataAccessHelper.GetReturnValue(db, cmd);
handleReturnValue(returnValue, "");
}
}
catch
{
throw;
}
if (removeCache && cacheKeys != null && cacheKeys.Length > 0)
{
UpdateCacheDependency(cacheKeys);
}
return (returnValue == 0);
}