上一篇写了接口IFxbolCacheLock的封装,一个属性,三个方法。现在我们需实现该接口中的方法
定义一个抽象类BaseCacheLock,实现接口IFxbolCacheLock
protected string _resourceName;
protected IBaseCacheStrategy _cacheStrategy;
protected int _retryCount;
protected TimeSpan _retryDelay;
protected BaseCacheLock(IBaseCacheStrategy strategy, string resourceName, int retryCount, TimeSpan retryDelay)
{
_cacheStrategy = strategy;
_resourceName = resourceName;
_retryCount = retryCount;
_retryDelay = retryDelay;
}
简单介绍一下参数,
_resourceName:需锁的资源名称;
_cacheStrategy:下文会着重介绍;
_retryCount:重新获取锁的次数;
_retryDelay:重新获取锁资源的时间间隔
IBaseCacheStrategy对象:
为了更好的扩展缓存锁,我们将需缓存锁的对象继承自接口IBaseCacheStrategy,接口中的方法如下:
/// <summary>
/// 创建一个(分布)锁
/// </summary>
/// <param name="resourceName">资源名称</param>
/// <param name="key">Key标识</param>
/// <param name="retryCount">重试次数</param>
/// <param name="retryDelay">重试延时</param>
/// <returns></returns>
ICacheLock BeginCacheLock(string resourceName, string key, int retryCount = 0, TimeSpan retryDelay = new TimeSpan());
该方法返回ICacheLock接口对象
需锁定的缓存资源继承自该接口时,均需实现开始缓存锁的方法。
BaseCacheLock构造函数中的,IBaseCacheStrategy实际为形参。
ok,继续贴代码:
public bool LockSuccessful { get; set; }
/// <summary>
/// 执行锁操作
/// </summary>
/// <returns></returns>
protected ICacheLock LockNow()
{
if (_retryCount != 0 && _retryDelay.Ticks != 0)
{
LockSuccessful = Lock(_resourceName, _retryCount, _retryDelay);
}
else
{
LockSuccessful = Lock(_resourceName);
}
return this;
}
LockNow,锁缓存资源,返回结果由LockSuccessful属性接收
public void Dispose()
{
UnLock(_resourceName);
}
public abstract bool Lock(string resourceName);
public abstract bool Lock(string resourceName, int retryCount, TimeSpan retryDelay);
public abstract void UnLock(string resourceName);
虚方法,由具体实现锁的对象来完成,这样,初步的缓存锁的框架已经搭建完成