美文网首页
1.Redis分布式锁

1.Redis分布式锁

作者: 未知的证明 | 来源:发表于2019-05-05 19:18 被阅读0次

    首先要了解:分布式锁需要解决的问题

    1.互斥性
    2.安全性
    3.死锁
    4.容错

    方法一:

    SETNX key value:如果key不存在,则创建并赋值
    时间复杂度O(1),返回值:设置成功返回1 失败返回0(locknx已经存在无法更改,操作是原子的)

    image
    image.png

    在执行某段代码时,先尝试使用SETNX对某个key设值,如果成功则没有其他线程占用该资源,如果失败则等待到SETNX成功。

    但是如果SETNX某个key,则这个key就长久存在,如何解决SETNX长期有效的问题?

    EXPIRE key seconds

    设置key的生存时间,当key过期时(生存时间为0)会被自动删除

    image

    代码逻辑(伪代码)如下:

    image

    EXPIRE缺点:原子性得不到满足(当setnx执行成功后挂掉,未来得及执行expire,会导致key一直被占用,其他线程永远无法执行)
    方法二:

    set key value [EX seconds] [PX milliseconds] [NX|XX]


    image.png

    EX seconds:设置键的过期时间为second秒

    PX milliseconds:设置键的过期时间为 milliseconds毫秒

    NX:只在键不存在时,才对键进行设置操作

    XX:只在键已经存在时,才对键进行设置操作

    SET操作成功完成时,返回OK,否则返回nil
    如果有大量的key同时过期的时候,由于清除大量的key很耗时,会出现短暂的卡顿现象:在设置key的过期时间的时候,给每个key设置随机值来避免卡顿现象发生。

    相关文章

      网友评论

          本文标题:1.Redis分布式锁

          本文链接:https://www.haomeiwen.com/subject/pgtkoqtx.html