分布式锁

2021-05-29  本文已影响0人  格林哈

1 方案

1.1 分布锁的问题

1.2 锁的设计原则

2 redis 实现


# 成功返回OK 表示持有锁, 失败返回null 获取锁失败
# 获取锁(unique_value可以是UUID等)
SET resource_name unique_value NX PX 3000
    NX 只在键不存在时, 才对键进行设置操作
    PX 将键的过期时间设置为 milliseconds 毫秒
    EX 将键的过期时间设置为 seconds 秒

# f封装到一个命令 释放锁(lua脚本中,一定要比较value,防止误解锁)
if redis.call("get",KEYS[1]) == ARGV[1] then
    return redis.call("del",KEYS[1])
else
    return 0
end

redis.call() 执行命令 ,过程中发生错误时,脚本会停止执行
redis eval  可以执行脚本, 所有键都应该由 KEYS 数组来传递
如: eval "return redis.call('set',KEYS[1],'bar')" 1 xxp
# 在命令的最后,那些不是键名参数的附加参数 arg [arg ...] ,可以在 Lua 中通过全局变量 ARGV 数组访问
eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second

2.1 redis作者Redlock实现

2.2 基于 Redis 实现分布式锁的优缺点

3 数据库

## SELECT 同时获取 ver 值
select amount, old_ver from order where order_id = xxx
## UPDATE 的时候检查 ver 值是否与第 2 步获取到的值相同
update order set ver = old_ver + 1, amount = yyy where order_id = xxx and ver = old_ver

4 常见问题

4.1 分布式锁高并发优化

参考

上一篇 下一篇

猜你喜欢

热点阅读