在NodeJS应用程序中使用ioredis节点包将数据存储在缓存中,但无法设置密钥的TTL

8oomwypt  于 2023-02-28  发布在  Redis
关注(0)|答案(1)|浏览(114)

我的NodeJS应用程序使用ioredis节点包时遇到了一个问题,我在缓存中用ttl设置了一个值,设置好后,我使用“client.ttl”控制台记录键的ttl(键)'它返回ttl,但当我转到redis-cli时(它们都连接在同一个端口上),并使用TTL键查询它,然后得到-1,这意味着键存在但没有ttl,实际上在设置ttl之后键值对仍然存在。
下面是我的session-cache.js文件:

import Redis from 'ioredis';

const client = new Redis({
  db: 0,
  host: 'localhost',
  port: 6379
});

export const cache = {
  async get(key) {
    const value = await client.get(key);
    return JSON.parse(value);
  },

  async set(key, value, ttl) {
    if (ttl) {
      await client.set(key, value, "EX", ttl);
      // await client.expire(key, ttl)
      console.log(await client.ttl(key));
    } else {
      await client.set(key, JSON.stringify(value));
    }
  },
  async delete(key) {
    await client.del(key);
  },

  async ttl(key) {
    client.ttl(key, (err, result) => {
      if (err) {
        console.error(err);
      } else {
        console.log('TTL:', result);
      }
    });
  }

}

下面是首先设置会话缓存的代码块:

export async function initiateSessionCache(requestObject) {
  let sessionCache = await cache.get(requestObject.msisdn);
  // set initial session cache if session cache is falsy (session cache is empty)
  if (!sessionCache) {
    const initialState = {
      outerState: 'start',
      innerState: 'requestId',
    };
    sessionCache = {
      state: initialState,
      requests: [],
      // create state stack to track user's state and allow user to go back to previous state
      stateStack: [initialState]
    };
    await cache.set(requestObject.msisdn, sessionCache);
  }
  return sessionCache;
}

ttl是从session-cache.js文件返回的,但在该文件之外,当在客户端上调用ttl方法获取密钥时,它返回-1。我已经了解到在正确设置ttl之前可能需要一些时间,但我仍然得到相同的结果。
可能是我的redis.config文件设置不正确吗?我使用的是Ubuntu

0sgqnhkj

0sgqnhkj1#

看起来您没有正确调用cache.set方法,它有三个参数-键、值和TTL-但您只传入了两个:

await cache.set(requestObject.msisdn, sessionCache);

这不应该是:

await cache.set(requestObject.msisdn, sessionCache, 60);

但也许我还没有完全理解这个问题,如果是这样的话,同样值得注意的是,如果你用EX在一个键上调用SET,然后再用没有EX的键调用SET,TTL将被移除,例如:

127.0.0.1:6379> SET foo bar EX 60
OK
127.0.0.1:6379> TTL foo
(integer) 58
127.0.0.1:6379> SET foo baz
OK
127.0.0.1:6379> FOO foo
(integer) -1

也许这就是你问题的根源。

相关问题