Skip to content

Instantly share code, notes, and snippets.

@koh110
Created June 10, 2020 12:05
Show Gist options
  • Save koh110/2e78daaed1617c8f1b96d1d7db32bca6 to your computer and use it in GitHub Desktop.
Save koh110/2e78daaed1617c8f1b96d1d7db32bca6 to your computer and use it in GitHub Desktop.
ioredis
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())
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment