skip to Main Content

How to Set expiry time of hsetnx (https://redis.io/commands/hsetnx/) to be 1 hour. Currently i don’t see a param where i can set expiry time to it.

const IoRedis = require("ioredis");
const redis = new IoRedis();

var message = {
  "jobdid": "JCLT",
  "email": "[email protected]"
}

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);
}

2

Answers


  1. Not possible. You’ll need to call EXPIRE on the key separately.

    await redis.expire(`jobs:${email}`, 3600) // expire after 3600 seconds
    

    ADDING ATOMICITY

    As requested, here is an example of using ioredis with a transaction. Not that I have not tested this code, just writing it from memory.

    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 */
      });
    
    Login or Signup to reply.
  2. If you don’t need to enumerate the jobs separately, then you don’t really need a hash; you can just se a sequence of setnx + expire. You don’t need a MULTI since setnx will only return 1 exactly once, so a second concurrent caller will never get to the expire.

    const IoRedis = require("ioredis");
    const redis = new IoRedis();
    
    var message = {
      jobdid: "JCLT",
      email: "[email protected]",
    };
    
    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;
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search