zoukankan      html  css  js  c++  java
  • 怎样用redis实现分布式锁

    引子

    redis作为一个强大的key/value数据库。事实上还能够用来实现轻量级的分布式锁。


    1.实现方案1

    最早官方在SETNX命令页给了一个实现:

    acquire lock: SETNX lock.foo <current Unix time + lock timeout + 1>
    
    release lock: DEL lock.foo
    acquire lock when time expired: GETSET lock.foo <current Unix timestamp + lock timeout + 1>


    只是这个方法有漏洞。就是release lock用的DEL命令不支持cas删除(delete if current value equals old value)。这样忽略race condition将会出现故障:

    A client will try to release the lock after the expire time deleting the key created by another client that acquired the lock later.


    2.实现方案2

    官方在SETNX命令页介绍了新的方案:SET command + Lua script:

    Starting with Redis 2.6.12 it is possible to create a much simpler locking primitive using the SET command to acquire the lock, and a simple Lua script to release the lock. The pattern is documented in the SET command page.

    The old SETNX based pattern is documented below for historical reasons.


    该方案有2个优化:

    (1)SET 命令能够设置key过期时间:SET key value [EX seconds] [PX milliseconds] [NX|XX]

    The lock will be auto-released after the expire time is reached.


    (2)使用Lua脚本实现cas删除(详见SET命令页)

    It is possible to make this system more robust modifying the unlock schema as follows:

    • Instead of setting a fixed string, set a non-guessable large random string, called token.
    • Instead of releasing the lock with DEL, send a script that only removes the key if the value matches.



  • 相关阅读:
    [saiku] 系统登录成功后查询Cubes
    216. Combination Sum III
    215. Kth Largest Element in an Array
    214. Shortest Palindrome
    213. House Robber II
    212. Word Search II
    211. Add and Search Word
    210. Course Schedule II
    分硬币问题
    开始学习Python
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6950221.html
Copyright © 2011-2022 走看看