还记得,上次基于缓存的封装中,我们预留了IBaseCacheContainer接口的内容,并没有写任何代码,我们希望在这个接口中扩展缓存锁,为什么要用到缓存锁呢,这个,我需要详细的阐述一下,当需要有两个线程操作同一个缓存数据时,一旦一个线程为更新缓存,另外一个操作为读取缓存,怎么办?读取了旧值,缓存的值被更改。导致出现业务错误。这时候我们需要线程同步,线程同步的方法据我了解有两种,(1):原子操作;(2)锁;
原子操作能保证该操作在CPU内核中不会被“拆分”,
锁,能保证只有一个线程访问该数据,当其他线程访问该数据时,会被拒绝,直到当前获得数据的线程将锁释放,其他线程才能获取数据;
好了,已经很明确了,我们为保证数据的可靠性,我们需要一个缓存锁,即拒绝其他线程访问数据。
同样的,为了保证程序的可扩展性,我们依然需要针对接口编程;针对锁的操作,锁;解除锁;是否锁成功;重新尝试锁;废话不多说,直接贴代码;
public interface IFxbolCacheLock : IDisposable
{
/// <summary>
/// 是否成功获得锁
/// </summary>
bool LockSuccessful { get; set; }
/// <summary>
/// 开始锁
/// </summary>
/// <param name="resourceName">资源名称,即锁的标识</param>
bool Lock(string resourceName);
/// <summary>
/// 开始锁,并设置重试条件
/// </summary>
/// <param name="resourceName">资源名称,即锁的标识</param>
/// <param name="retryCount">重试次数</param>
/// <param name="retryDelay">每次重试延时</param>
/// <returns></returns>
bool Lock(string resourceName, int retryCount, TimeSpan retryDelay);
/// <summary>
/// 释放锁
/// </summary>
/// <param name="resourceName">需要释放锁的 Key,即锁的标识</param>
void UnLock(string resourceName);
}
bool LockSuccessful;判断是否锁成功;
bool Lock(string resourceName); 锁操作,resourceName:需要锁的资源;
bool Lock(string resourceName,int retryCount,TimeSpan retryDelay);锁操作,resourceName:需要锁的资源,即Key;retryCount重试次数;retryDelay每次重试的时间间隔;
void UnLock(string resourceName);释放锁操作,resourceName:需要释放锁的资源