一、在添加一个缓存项时,允许指定一个过期策略,这个过期策略对象要实现ICacheItemExpiration接口,常见的过期策略有:

 

绝对过期时间 AbsoluteTime

表达式表示的时间过期策略:ExtendedFormatTime

程序运行中一直不会过期NeverExpired

每次读取之后,再延长指定的时间后才会过期:SlidingTime

文件依赖:FileDependency

 

二、自己实现一个,缓存项依赖:CacheItemDependency

 

参考FileDependency的实现,缓存项的过期与否取决于文件是否发生了变化,我们自己实现一个过期策略,就是缓存项的过期与否取决于另一个NeverExpired的缓存项是否发生了变化。

代码如下:

 

    }

 

三、使用方法

1、更新缓存所依赖的缓存项。代码如下:

 

        }

 

2、每次更新数据库中的表时,调用UpdateCacheDependency方法。

在上述代码中cacheKey可以用数据库中标的名称。

还有一个问题就是 每次更新数据库中的表时,都要调用UpdateCacheDependency方法,是不是很烦,这也是没有办法的,必须调用,否则 依赖于 以cacheKey为Key的缓存项 的缓存项 不会失效,一般可以在数据访问的基类中将Insert\Update\Delete执行的地方调用这个方法即可。

 

如果用DataSet,代码类似这样:

 

        }

 

如果用实体类,代码类似这样:

 

[] cacheKeys)
        {
            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);
        }

 

 

 

 

 

 

相关文章: