【redis+lua实现分布式锁】

使用Lua原因

轻量
脚本执行原子化,这对于多线程或者多进程的环境中很重要。

使用常用的EVAL 命令:
EVAL script numkeys key [key …] arg [rg …]

加锁

localhost:0>eval "if redis.call('EXISTS', KEYS[1]) == 0 then redis.call('set', KEYS[1], ARGV[1]) redis.call('expire', KEYS[1], ARGV[2]) return 1 else return 0 end"  1 user.lock   lockid1 50
"1"
localhost:0>eval "if redis.call('EXISTS', KEYS[1]) == 0 then redis.call('set', KEYS[1], ARGV[1]) redis.call('expire', KEYS[1], ARGV[2]) return 1 else return 0 end" 1 user.lock lockid1 50
"0"

localhost:0>ttl user.lock
"33"
localhost:0>ttl user.lock
"31"
localhost:0>

注意value的设置,需要设置加锁放的id,防止误删除别人加的锁

解锁

localhost:0>eval "if redis.call('EXISTS', KEYS[1]) == 0 then redis.call('set', KEYS[1], ARGV[1]) redis.call('expire', KEYS[1], ARGV[2]) return 1 else return 0 end" 1 user.lock lockid1 50
"1"
localhost:0>eval "if redis.call('EXISTS', KEYS[1]) == 0 then redis.call('set', KEYS[1], ARGV[1]) redis.call('expire', KEYS[1], ARGV[2]) return 1 else return 0 end" 1 user.lock lockid1 50
"0"
localhost:0>eval "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 ; end" 1 user.lock lockid1
"1"
localhost:0>eval "if redis.call('EXISTS', KEYS[1]) == 0 then redis.call('set', KEYS[1], ARGV[1]) redis.call('expire', KEYS[1], ARGV[2]) return 1 else return 0 end" 1 user.lock lockid1 50
"1"
localhost:0>

注意解锁时,需要判定是value是自己加的锁才解锁,防止解除别人的锁

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值