RedisLock.cs

(开头部分) 3KB

这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。

using CSRedis;
using System.Threading;
using System.Threading.Tasks;

namespace RedisLock_Demo
{
    public class RedisLock
    {
        /// <summary>
        /// 锁key
        /// </summary>
        private readonly string lockKey = "RedisLock";
        /// <summary>
        /// 锁的过期秒数
        /// </summary>
        private readonly int lockTime = 20;
        /// <summary>
        /// 续命线程取消令牌
        /// </summary>
        private CancellationTokenSource tokenSource = new CancellationTokenSource();
        public RedisLock()
        {
            //RedisHelper.Initialization(new CSRedis.CSRedisClient("127.0.0.1:6379,password=123456,poolsize=50,ssl=false,writeBuffer=10240"));
            RedisHelper.Initialization(new CSRedis.CSRedisClient("127.0.0.1:6379,poolsize=50,ssl=false,writeBuffer=10240"));
        }

        /// <summary>
        /// 获取锁
        /// </summary>
        /// <param name="requestId">请求id保证释放锁时的客户端和加锁的客户端一致</param>
        /// <returns></returns>
        public bool GetLock(string requestId)
        {
            //设置key 设置过期时间20s
            while (true)
            {
                //设置key Redis2.6.12以上版本,可以用set获取锁。set可以实现setnx和expire,这个是原子操作
                if (RedisHelper.Set(lockKey, requestId, lockTime, RedisExistence.Nx))
                {
                    //设置成功后开启子线程为key续命
                    CreateThredXm();
                    return true;
                }
            }
        }
        /// <summary>
        /// 为锁续命(防止业务操作时间大于锁自动释放时间,锁被自动释放掉)
        /// </summary>
        void CreateThredXm()
        {
            Task.Run(() =>
           {
               while (true)
               {
                   Thread.Sleep(10);
                   //外部取消 退出子线程
                   if (tokenSource.IsCancellationRequested)
                   {
                       return;
                   }
后面还有 27 行代码,解锁后查看完整代码

24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明

AI 解读

登录后可用,每次 10 积分,解读结果公开显示在下面。

还没有人解读过这个文件。