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

如何在Node.js+TypeScript项目中为Redis的HSET设置过期时间

Redis HSET 设置过期时间的正确方式

Redis 不支持直接在 HSET 命令中为哈希表设置过期时间,因为过期时间是绑定在整个键上的,而非哈希表内的单个字段。你需要分两步操作:先通过 HSET 存储数据,再通过 EXPIRE(或 PEXPIRE 用于毫秒级)命令为哈希键设置过期时间。

TypeScript 示例代码(async/await 风格)

假设你使用的是官方推荐的 redis v4+ 客户端,以下是完整实现:

import { createClient } from 'redis';

// 初始化 Redis 客户端
const client = createClient({
  url: 'redis://localhost:6379' // 根据你的 Redis 配置修改
});

// 连接客户端
await client.connect();

async function setHashWithExpiry(hashKey: string, field: string, value: any, expireSeconds: number) {
  try {
    // 第一步:存储哈希字段数据
    await client.hSet(hashKey, field, JSON.stringify(value));
    // 第二步:为整个哈希键设置过期时间
    await client.expire(hashKey, expireSeconds);
    console.log('数据存储并设置过期成功');
  } catch (err) {
    console.error('操作失败:', err);
    throw err; // 按需处理业务错误
  }
}

// 使用示例
await setHashWithExpiry('user_cache', 'user_123', { id: 123, name: 'John' }, 10);

额外说明

  • 若需要毫秒级过期,用 pexpire 替代 expire,参数传入毫秒数即可。
  • 要保证 HSET 和 EXPIRE 操作的原子性(避免仅存数据未设过期的情况),可以用 Lua 脚本实现:
async function setHashWithExpiryAtomic(hashKey: string, field: string, value: any, expireSeconds: number) {
  const luaScript = `
    redis.call('HSET', KEYS[1], ARGV[1], ARGV[2])
    redis.call('EXPIRE', KEYS[1], ARGV[3])
    return 1
  `;
  try {
    await client.eval(luaScript, {
      keys: [hashKey],
      arguments: [field, JSON.stringify(value), expireSeconds.toString()]
    });
    console.log('原子性操作成功');
  } catch (err) {
    console.error('原子性操作失败:', err);
    throw err;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:07:07