美文网首页
redis分布式锁

redis分布式锁

作者: RobertCrazying | 来源:发表于2018-02-01 18:05 被阅读28次

前言

分布式锁有很多种实现方式,常见的有使用redis和zookeeper实现。结合最近看到的资料总结一下需要注意的地方,今天来讲讲使用redis来实现的方法。

技巧

  1. 增加requestId标识来自哪个客户端加的锁,这样子解锁的时候呀哦根据requestId来解锁,防止被其他人解锁。
        String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);

  1. 解锁运行lua脚本达到原子性要求。在eval命令执行Lua代码的时候,Lua代码将被当成一个命令去执行,并且直到eval命令执行完成,Redis才会执行其他命令。
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));

  1. 秒杀库存案例
   1:  def storage_scenario_six():
   2:      conn = redis_conn()
   3:      lua = """
   4:              local storage = redis.call('get','storage_seckill')
   5:              if  storage ~= false then
   6:                  if tonumber(storage) > 0 then
   7:                      return redis.call('decr','storage_seckill')
   8:                  else
   9:                      return 'storage is zero now, can't perform decr action'
  10:                  end
  11:              else
  12:                  return redis.call('set','storage_seckill',10)
  13:              end
  14:            """
  15:      result = conn.eval(lua,0)
  16:      print(result)

参考阅读

http://wudashan.cn/2017/10/23/Redis-Distributed-Lock-Implement/
http://www.cnblogs.com/scy251147/p/8371636.html#!comments

相关文章

网友评论

      本文标题:redis分布式锁

      本文链接:https://www.haomeiwen.com/subject/khodzxtx.html