redis 实现分布式锁

使用redis实现分布式锁一、

SETNX

  • 语法:SETNX key value
  • 将 key 的值设为 value ,当且仅当 key 不存在。
  • 若给定的 key 已经存在,则 SETNX 不做任何动作。
  • SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写
  • 该命令仅当key不存在时才可以设置成功,使用该命令设值可以保障众多客户端中只有一个客户端可以成功设置值(即:获取到锁)
SETNX lock lock_value

释放锁就比较简单,只需要将此key删除掉,其他客户端就可以继续为此key设值从而获取到锁

DEL lock

但是如果仅用上述命令实现加锁时,那么一般释放锁的操作也就是DEL KEY;假如某客户端在准备释放锁时发生异常或者突然宕机,那么这个锁将不会被释放,进而引起其他客户端无法获取到锁
所以在获取锁时,需要给锁设置一个过期时间,可能最初加锁会这样设计

SETNX lock lock_value
>ok
#设置过期时间
EXPIRE lock 5

上述实现还是会出现问题,由于上述两命令不是一个原子操作,假如当加锁成功,但是在设置过期时间的同时服务器突然挂了或者其他原因导致未设置成功,依然无法解决

好在redis2.8之后给set命令提供了更多的参数用来在一个原子操作中完成setNx key value和expire key两个命令的结合

SET

  • 语法:SET key value [EX seconds] [PX milliseconds] [NX|XX]
  • EX second :设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。
  • PX millisecond :设置键的过期时间为 millisecond 毫秒。 SET key value PX millisecond 效果等同于 PSETEX key millisecond value 。
  • NX :只在键不存在时,才对键进行设置操作。 SET key value NX 效果等同于 SETNX key value 。
  • XX :只在键已经存在时,才对键进行设置操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值