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()) | |
}) |