You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RedisJSON为JSON对象特定字段设置TTL失效问题(NodeJS环境)

解决RedisJSON单个字段设置TTL并自动重置的问题

首先明确:RedisJSON的JSON.SET命令不支持为单个JSON内部字段设置TTL——TTL是Redis键级别的特性,只能作用于整个Redis key,无法直接绑定到JSON对象里的某个字段。你之前的写法无效,就是因为找错了TTL的作用对象。

下面提供两种可行的实现方案:

方案一:利用Redis键空间通知+Lua脚本自动重置

这个方案能在辅助key过期时,自动触发字段值重置,适合需要实时过期的场景。

步骤1:开启Redis键空间通知

生产环境建议在redis.conf里配置notify-keyspace-events "Ex";测试环境可以通过代码临时设置:

await redis.configSet('notify-keyspace-events', 'Ex');

步骤2:订阅过期事件

注意:Redis客户端订阅频道后无法执行其他命令,所以要单独创建一个订阅客户端:

const subscriber = redis.duplicate();
await subscriber.connect();

// 订阅db 0的键过期事件(如果用其他db,把@0改成对应数字)
subscriber.subscribe('__keyevent@0__:expired', async (expiredKey) => {
  // 识别目标辅助key,这里约定辅助key格式为「原key:字段路径」
  if (expiredKey === '22:AU:suppliersCap:s2') {
    // 用Lua脚本原子性重置JSON字段
    const resetScript = `
      redis.call('JSON.SET', KEYS[1], ARGV[1], 0)
    `;
    await redis.eval(resetScript, {
      keys: ['22:AU'],
      arguments: ['.suppliersCap.s2']
    });
  }
});

步骤3:设置字段值并创建辅助过期key

每次更新目标字段时,同步创建一个带TTL的辅助key:

// 假设要把.suppliersCap.s2设为5,同时设置300秒过期
await Promise.all([
  redis.json.set('22:AU', '.suppliersCap.s2', 5),
  redis.set('22:AU:suppliersCap:s2', '1', { EX: 300 })
]);

方案二:读取时检查并重置

如果对过期实时性要求不高,可以在每次读取字段前,检查辅助key是否存在,不存在则重置字段值。这种方案无需监听事件,实现更简单:

读取逻辑

async function getSuppliersCapS2() {
  // 检查辅助key是否存在
  const keyExists = await redis.exists('22:AU:suppliersCap:s2');
  if (!keyExists) {
    // 辅助key已过期,重置字段为0
    await redis.json.set('22:AU', '.suppliersCap.s2', 0);
    return 0;
  }
  // 辅助key存在,返回当前字段值
  return await redis.json.get('22:AU', '.suppliersCap.s2');
}

设置逻辑

async function setSuppliersCapS2(value) {
  // 同步更新字段和辅助key的TTL
  await Promise.all([
    redis.json.set('22:AU', '.suppliersCap.s2', value),
    redis.set('22:AU:suppliersCap:s2', '1', { EX: 300 })
  ]);
}

注意事项

  • 方案一中,订阅客户端需要保持在线,否则过期事件会丢失,导致字段无法自动重置
  • 如果需要严格的原子性(避免设置字段和辅助key时出现异常),可以把两个操作写到同一个Lua脚本里执行
  • 辅助key的命名要和原JSON字段一一对应,避免和其他业务key冲突

内容的提问来源于stack exchange,提问作者IaMus90

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 19:26:28