1
I’m having a headache with multiple processes writing in the same key. Is there any way to lock a key, both for writing and reading?
cluster.js
const cluster = require('cluster');
const cpus = require('os').cpus().length;
const client = require('redis').createClient();
client.set('num', '0');
if (cluster.isMaster) {
    console.log('Master process is running');
    for (let i = 0; i < cpus; i++) {
        cluster.fork();
    }
} else {
    require('./main.js');
}
main.ts
import * as redis from 'redis';
import * as Lock from 'redis-lock';
import { promisify } from 'util';
const config: redis.ClientOpts = {
    host: '127.0.0.1',
    port: 6379
};
const client: redis.RedisClient = new redis.RedisClient(config);
const lock = promisify(Lock(client));
(async () => {
    for (let i = 0; i < 5; i++) {
        await add();
    }
})();
async function add() {
    await new Promise<string>((resovle, reject) => {
        lock('num').then((done) => {
            client.watch('num', (err: Error) => {
                if (err) {
                    console.error(err);
                    done();
                    reject(err);
                }
                client.get('num', (err: Error, reply: string) => {
                    if (err) {
                        console.error(err);
                        done();
                        reject(err);
                    }
                    let numStr: string = reply;
                    let num: number = Number(numStr);
                    num++;
                    client.multi().set('num', num).exec((err: Error, reply: string) => {
                        if (err) {
                            console.error(err);
                            done();
                            reject(err);
                        }
                        console.log(num);
                        done();
                        resovle(reply);
                    });
                });
            });
        });
    });
};
Numbers of cpus: 4 Upshot:
1
1
1
2
3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Well, I was able to solve the problem https://github.com/Placidina/redis-concurrency
– Placidina