前言
分布式鎖有很多種實現(xiàn)方式,常見的有使用redis和zookeeper實現(xiàn)诀艰。結合最近看到的資料總結一下需要注意的地方,今天來講講使用redis來實現(xiàn)的方法资锰。
技巧
- 增加requestId標識來自哪個客戶端加的鎖叽讳,這樣子解鎖的時候呀哦根據(jù)requestId來解鎖拟蜻,防止被其他人解鎖。
String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
- 解鎖運行l(wèi)ua腳本達到原子性要求震捣。在eval命令執(zhí)行Lua代碼的時候荔棉,Lua代碼將被當成一個命令去執(zhí)行,并且直到eval命令執(zhí)行完成蒿赢,Redis才會執(zhí)行其他命令润樱。
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