$ ls ~yifei/notes/

分布式系统中的锁

Posted on:

Last modified:

分布式系统需要使用分布锁。首先我们来回忆一下在单机情况下的锁。

当我们的程序在需要访问临界区的时候,我们可以加一个锁,如果是多线程程序,可以使用线程锁, 如果是多进程程序,可以使用进程级别的锁。但是在分布式的环境中,如果在不同主机上部署的程序 要访问同一个临界区是该怎么做呢?这时候我们需要分布式的锁。

当部署的服务或者脚本不在同一台机器上时,使用分布式的锁,可以使用 zookeeper 或者 redis 实现一个分布式锁。这里主要介绍一下基于 redis 的分布式锁。

redis 官方给出的单机 redis 分布式锁:

加锁

NX 命令指定了只有在不存在的时候才会创建,如果已经存在,则会返回失败。EX 指定了过期时间, 避免进程挂掉后死锁。值设定为了一个随机数,这样只有加锁的进程才知道锁的值是多少

SET resource-name my_random_string NX EX max-lock-time

解锁

因为解锁时会检查是否提供了随机数的值,所以只有创建锁的进程才能够解锁。

if redis.call("get",KEYS[1]) == ARGV[1] then
    return redis.call("del",KEYS[1])
else
    return 0
end

EVAL "script..." 1 resource-name my_random_string

参考:

  1. https://redis.io/topics/distlock
WeChat Qr Code

© 2016-2022 Yifei Kong. Powered by ynotes

All contents are under the CC-BY-NC-SA license, if not otherwise specified.

Opinions expressed here are solely my own and do not express the views or opinions of my employer.

友情链接: MySQL 教程站