node redis鎖的實現

鎖是一種同步機制,用於保證一項資源在任何時候只能被一個進程使用,如果有其他進程想要使用相同的資源,那麼就必須等待,直到正在使用資源的進程放棄使用權爲止。

const redis = require("redis"),
    client = redis.createClient();

client.on("error", function (err) {
    console.log("Error " + err);
});

class Redis {
    /**
     * 設置字符串
     * @param key
     */
    get(key) {
        return new Promise((resolve,reject) =>{
            client.get(key, function(err, reply) {
                // reply is null when the key is missing
                resolve(reply);
            });
        })
    }
    /**
     * 獲取字符串
     * @param key
     * @param value
     */
    set(key, value) {
        //redis不支持存儲對象
        if (typeof value=="object")  {
            value = JSON.stringify(value)
        }
        client.set(key, value);
    }
    /**
     * 刪除
     * @param key
     */
    del(key) {
        client.del(key);
    }
    /**
     * NX 當key不存在時設置,存在時不操作
     * PX 過期時間
     * @param key
     * @param value
     * @param expireTime 過期時間
     */
    setNX(key, value, expireTime) {
        return new Promise((resolve,reject) =>{
            client.set(key, value, 'NX', 'PX', expireTime, (err, reply) => {
                if (err) {
                    reject(err);
                    return;
                }
                if (!reply) {
                    reject('請勿重複操作')
                    return
                }
                resolve(reply)
            })
        })
    }
}

const redisOperate = new Redis();
const LOCK = "LOCK_ID";

async function lockFun() {
    //當LOCK值存在是執行,不存在則不執行
    await redisOperate.setNX(LOCK, new Date(), 100000);
    try {
        //執行程序 ...
        //
        //
        redisOperate.del(LOCK);
    } catch (err) {
        redisOperate.del(LOCK);
    }

}

lockFun();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章