redis锁的进化历程

Posted tobemaster

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis锁的进化历程相关的知识,希望对你有一定的参考价值。

      日常工作中总是会有高并发的场景,需要实现锁机制来保证序列性,接下来我们一步一步实现一个 单机Redis下完全可靠的Redis锁(ps: 如果是Redis集群的话,就存在主从切换锁失效的问题,解决这个问题的话就比较麻烦了,这里不做讨论,现有的解决方案有redlock,大家可以看下它的实现原理)

Redis锁 第一版(php实现):

    //加锁
    public function lock($key)
    
        $redisConnect = Redis::connection();
        $v = $redisConnect->get($key);
        if ($v == 1) 
            return false;
        
        $res = $redisConnect->setex($key);
        return (bool)$res;
    

    //解锁
    public function unlock($key)
    
        $redisConnect = Redis::connection();
        return $redisConnect->del($key);
    

 

版本一的问题:如果加锁之后进程中断,就会死锁

 

版本二,设置锁的超时时间来解决版本一问题

    public function lock($key, $seconds)
    
        $redisConnect = Redis::connection();
        $v = $redisConnect->get($key);
        if ($v == 1) 
            return false;
        
        $res = $redisConnect->setex($key, $seconds, 1);
        return (bool)$res;
    

    //解锁
    public function unlock($key)
    
        $redisConnect = Redis::connection();
        return $redisConnect->del($key);
    

 

第二版的问题:设置了超时时间,但是有一种场景,a加锁之后到了超时时间a还没执行完,这个时候锁失效 b可以再加锁,然后a执行完毕 就会把b加的锁删除。 说到底问题出在了,不同的进程加的锁是没区别的。

 

版本三: 解决版本二的问题 可以在设置锁的时候 加入一个唯一置,在删除锁的时候,如果发现唯一值已经不是设置的了,就不删除改锁了,而且说明这个操作中原子性已经遭到了破坏,保险起见需要回滚当前实物。

//暂存todo

 

以上是关于redis锁的进化历程的主要内容,如果未能解决你的问题,请参考以下文章

Redis 分布式锁的正确实现原理演化历程与 Redisson 实战总结

死磕 java同步系列之redis分布式锁进化史

死磕 java同步系列之redis分布式锁进化史

Redis专题:锁的基本概念到Redis分布式锁实现

Redis进阶学习03---Redis完成秒杀和Redis分布式锁的应用

Redis(十三):Redis分布式锁的正确实现方式