Node Redis缓存数据随机消失问题排查求助
Redis随机丢键问题排查与解决方案
核心疑问解答
exists命令不会删除键:这是Redis的只读查询命令,仅返回键的存在状态(1存在/0不存在),绝对不会修改或删除任何键。- M1 MacBook无普遍兼容问题:当前Redis官方已完善支持Apple Silicon架构,不存在导致随机丢键的通用兼容性问题,可排除此因素。
可能原因与排查方案
1. TTL设置验证与意外过期
- 用Redis-cli执行
TTL <cacheKey>,检查目标键的剩余过期时间是否为预期的604800秒(7天),确认set命令的TTL参数是否生效。 - 排查代码库中是否存在其他修改键过期时间或删除键的逻辑:比如
DEL、UNLINK、EXPIRE、PEXPIRE等命令,或Redis的过期回调函数。
2. 循环存储的并发/异常问题
- 给
set操作添加错误捕获,排查是否存在存储失败的情况:for(let i=0; i< data.length; i++){ try { await client.set(cacheKey, JSON.stringify(dataToStore), { EX: 604800 }); } catch (err) { console.error(`存储键 ${cacheKey} 失败:`, err); } } - 考虑用批量操作优化循环逻辑(如
MSET,需注意值的序列化处理),减少网络IO次数,降低失败概率。
3. 内存淘汰策略检查
- 执行以下命令查看Redis内存配置:
CONFIG GET maxmemory CONFIG GET maxmemory-policy - 确保
maxmemory设置足够容纳所有缓存数据,且maxmemory-policy为noeviction(若无需自动淘汰键),避免因内存触发自动淘汰。
4. 键名生成逻辑冲突
- 检查
cacheKey的生成规则,确认循环中每个数据对应的键是唯一的:比如是否正确使用了data[i]的唯一标识(如ID)来生成键,而非固定值导致后续存储覆盖前序键。 - 打印循环中的
cacheKey值,验证每个键的唯一性。
5. Redis服务异常重启
- 查看Redis日志文件(路径通常为
/usr/local/var/log/redis.log,依安装方式调整),检查是否存在服务意外重启、崩溃的记录,这可能导致未持久化的键丢失。 - 确认Redis持久化配置(
RDB/AOF)是否开启,避免服务重启后数据丢失。
内容的提问来源于stack exchange,提问作者Sheldon
相关产品推荐
相关产品推荐

