如何设置hsetnx (https://redis.io/commands/hsetnx/)的过期时间为1小时目前我没有看到一个参数,我可以设置它的过期时间。
const IoRedis = require("ioredis");
const redis = new IoRedis();
var message = {
"jobdid": "JCLT",
"email": "a@k.com"
}
checkForDuplicate(message);
async function checkForDuplicate(message){
const email = message.email.toLowerCase();
const jobdid = message.jobdid.toLowerCase();
const resp = await redis.hsetnx(`jobs:${email}`, jobdid, +new Date());
console.log(resp);
}
如果您不需要单独枚举作业,那么您实际上不需要散列;你可以看到一个setnx + expire的序列。您不需要MULTI,因为setnx将只返回1一次,所以第二个并发调用者将永远不会过期。
const IoRedis = require("ioredis");
const redis = new IoRedis();
var message = {
jobdid: "JCLT",
email: "a@k.com",
};
checkForDuplicate(message);
async function checkForDuplicate(message) {
const key = `jobs:${message.email.toLowerCase()}:${message.jobdid.toLowerCase()}`;
const didSet = await redis.setnx(key, +new Date());
if (didSet) {
// We did set this, we're okay to set expiry too
await redis.expire(key, 3600);
}
return didSet;
}
不可能。您需要对密钥单独调用EXPIRE。
await redis.expire(`jobs:${email}`, 3600) // expire after 3600 seconds
添加原子性
按照请求,下面是一个在事务中使用ioredis的示例。并不是说我没有测试过这段代码,只是从内存中编写。
await redis.watch(key)
redis.multi()
.hsetnx(key, field, value);
.expire(key, ttlInSeconds)
.exec((err, results) => {
/* if someone changes the key, this will error, otherwise
you'll get an array of the results of calling each command */
});