基于Redis实现分布式锁的几种坑你是否踩过《上》

DBC 1.6K 0

简介:基于Redis实现分布式锁的几种坑

  • 实现分布式锁 可以用 Redis、Zookeeper、Mysql数据库这几种 , 性能最好的是Redis且是最容易理解
    • 分布式锁离不开 key - value 设置
温馨提示

key 是锁的唯一标识,一般按业务来决定命名,比如想要给一种商品的秒杀活动加锁,key 命名为 “seckill_商品ID” 。value就可以使用固定值,比如设置成1

基于redis实现分布式锁,文档:http://www.redis.cn/commands.html#string
加锁 SETNX key value

setnx 的含义就是 SET if Not Exists,有两个参数 setnx(key, value),该方法是原子性操作

如果 key 不存在,则设置当前 key 成功,返回 1;

如果当前 key 已经存在,则设置当前 key 失败,返回 0

解锁 del (key)

得到锁的线程执行完任务,需要释放锁,以便其他线程可以进入,调用 del(key)

配置锁超时 expire (key,30s)

客户端奔溃或者网络中断,资源将会永远被锁住,即死锁,因此需要给key配置过期时间,以保证即使没有被显式释放,这把锁也要在一定时间后自动释放

综合伪代码
methodA(){
  String key = "coupon_66"
​
  if(setnx(key,1) == 1){
      expire(key,30,TimeUnit.MILLISECONDS)
      try {
          //做对应的业务逻辑
          //查询用户是否已经领券
          //如果没有则扣减库存
          //新增领劵记录
      } finally {
          del(key)
      }
  }else{
​
    //睡眠100毫秒,然后自旋调用本方法
    methodA()
  }
}

发表评论 取消回复
表情 图片 链接 代码

分享