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
参考:
© 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 教程站