Redise篇-记一次Redise的封装(二)

还记得,上次基于缓存的封装中,我们预留了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:需要释放锁的资源

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值