前言
分布式锁有很多种实现方式,常见的有使用redis和zookeeper实现。结合最近看到的资料总结一下需要注意的地方,今天来讲讲使用redis来实现的方法。
技巧
- 增加requestId标识来自哪个客户端加的锁,这样子解锁的时候呀哦根据requestId来解锁,防止被其他人解锁。
String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
- 解锁运行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: 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