我的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
1条答案
按热度按时间0sgqnhkj1#
看起来您没有正确调用
cache.set
方法,它有三个参数-键、值和TTL-但您只传入了两个:这不应该是:
但也许我还没有完全理解这个问题,如果是这样的话,同样值得注意的是,如果你用EX在一个键上调用SET,然后再用没有EX的键调用SET,TTL将被移除,例如:
也许这就是你问题的根源。