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