如何在Redis中存储Hash类型数据?使用hset方法运行异常该如何解决?
问题原因梳理
- 错误被静默忽略:现有代码中hset回调仅打印错误日志,未将错误通过reject抛出,即使Redis操作执行失败(如连接异常、权限不足、参数非法),Promise仍会正常resolve,你无法感知到操作失败,会误以为写入未生效。
- Redis客户端版本不兼容:如果使用的是Redis Node.js客户端v4及以上版本,官方已经废弃回调式写法,所有操作默认返回Promise,强行传入回调函数不会被执行,自然不会产生写入行为。同时v4开始hash写入方法名改为驼峰式
hSet,全小写hset会直接报错。 - 异步流程未等待:调用该工具函数时如果未使用
await或.then处理异步逻辑,可能程序在Redis写入操作完成前就终止,导致写入未落地。
正确实现方案
方案1:Redis v3及以下版本(回调写法兼容)
修正错误处理逻辑,不要吞掉异常:
const UpdateStatusOfEventofMap = (eventId, status) => { console.log('in function eventId --->', eventId, 'status ==> ', status) return new Promise((resolve, reject) => { client.hset('StatusOfEvent', eventId, status, (err, reply) => { if (err) { console.log('hset error:', err) return reject(err) } resolve(reply) }) }) } // 调用示例,必须等待异步完成 // await UpdateStatusOfEventofMap('test_event_001', 2)
方案2:Redis v4及以上版本(官方推荐Promise写法)
v4版本无需手动封装Promise,注意方法名大小写,且客户端初始化后需要显式调用client.connect()完成连接:
// 初始化客户端示例(可放在公共配置文件) // const { createClient } = require('redis') // const client = createClient() // client.on('error', err => console.log('Redis Client Error', err)) // await client.connect() const UpdateStatusOfEventofMap = async (eventId, status) => { console.log('in function eventId --->', eventId, 'status ==> ', status) try { // 注意方法名为驼峰hSet,不是全小写hset return await client.hSet('StatusOfEvent', eventId, status) } catch (err) { console.log('hset error:', err) throw err } } // 调用示例 // await UpdateStatusOfEventofMap('test_event_001', 2)
写入验证方法
写入完成后可以在Redis CLI中执行以下命令验证结果:
- 单条查询:
hget StatusOfEvent 你的eventId - 全量查询:
hgetall StatusOfEvent
内容的提问来源于stack exchange,提问作者user17242278
相关产品推荐
相关产品推荐

