diff options
| author | Adam Soltys <[email protected]> | 2023-01-17 16:05:00 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2023-01-17 16:05:00 -0800 |
| commit | 33229e38a910e26083175a3e272278745378114c (patch) | |
| tree | c63b3fc8c5e9563ae0aa694617ebd3419a3fac8b /lib/db.js | |
| parent | 98a611d8965d8b896d124c78bdc1f7ceea6593cf (diff) | |
| download | coinos-server-33229e38a910e26083175a3e272278745378114c.tar.gz coinos-server-33229e38a910e26083175a3e272278745378114c.zip | |
redlock
Diffstat (limited to 'lib/db.js')
| -rw-r--r-- | lib/db.js | 24 |
1 files changed, 4 insertions, 20 deletions
@@ -1,25 +1,9 @@ -import { createClient } from "redis"; - -export const db = createClient({ url: "redis://db" }); - -db.on("error", err => console.log("db error", err)); - -await db.connect(); +import { Redis } from "ioredis"; +import Redlock from "redlock"; +export const db = new Redis("redis://db", { enableAutoPipelining: true }); export default db; export let g = async k => JSON.parse(await db.get(k)); export let s = (k, v) => db.set(k, JSON.stringify(v)); - -let retries = {}; -export let t = async (k, f) => { - retries[k] = retries[k] ? retries[k]++ : 0; - await db.watch(k); - let o = f(await g(k)); - let m = await db.multi(); - await s(k, o); - - if (retries[k] < 10) { - if (!(await m.exec())) setTimeout(() => t(k, f), 100); - } else throw new Error("could not obtain lock"); -}; +export let t = (f) => new Redlock([db]).using([db], 5000, f); |
