https://redis.io/topics/distlock
ioredis lock
https://redis.io/topics/distlock
ioredis lock
| const Redis = require('ioredis') | |
| const client = new Redis({ enableOfflineQueue: false }) | |
| const releaseScript = `if redis.call("get",KEYS[1]) == ARGV[1] then | |
| return redis.call("del",KEYS[1]) | |
| else | |
| return 0 | |
| end` | |
| client.defineCommand('release', { | |
| lua: releaseScript, | |
| numberOfKeys: 1 | |
| }) | |
| const lock = async (key, val, millisec) => { | |
| try { | |
| const res = await client.set(key, val, 'PX', millisec, 'NX') | |
| return (res || '').toLocaleLowerCase().includes('ok') | |
| } catch (e) { | |
| console.log(e) | |
| return false | |
| } | |
| } | |
| const release = async (key, val) => { | |
| return await client.release(key, val) | |
| } | |
| const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)) | |
| const main = async () => { | |
| const key = 'lock_test' | |
| const val = 1111 | |
| console.log(await lock(key, val, 1000 * 5)) | |
| console.log(await lock(key, val + 1111, 1000 * 5)) | |
| console.log(await client.get(key)) | |
| console.log(await release(key, val + 1111)) | |
| // await sleep(1000 * 5 + 100); | |
| console.log(await release(key, val)) | |
| } | |
| client.on('ready', () => { | |
| main() | |
| .catch(console.error) | |
| .finally(() => client.disconnect()) | |
| }) |