当前位置: 首页 > news >正文

Redis中的hash数据结构设置过期时间的坑!!!

问题描述

 

在使用 Redis Hash 结构时,发现在异步操作完成后设置过期时间不生效,但在第一次写入后立即设置过期时间却可以正常工作。

问题复现

 

// 情况一:不生效
redisTemplate.opsForHash().put(uuid, "field1", value1);
redisTemplate.opsForHash().put(uuid, "field2", value2);
// ... 多次写入操作 ...
redisTemplate.expire(uuid, 300, TimeUnit.SECONDS);  // 设置可能不生效// 情况二:生效
redisTemplate.opsForHash().put(uuid, "field1", value1);
redisTemplate.expire(uuid, 300, TimeUnit.SECONDS);  // 立即设置生效
// ... 后续写入操作 ...

原因分析

 

1.  Redis Hash 的特性 ◦ Hash 结构的每次写入操作都可能影响 key 的状态 ◦ 多次写入后 key 的状态可能发生变化  

2.  过期时间检查 ◦ TTL 返回 -1:key 存在但没有过期时间 ◦ TTL 返回 -2:key 不存在 ◦ TTL > 0:剩余过期时间(秒)    

解决方案

 

1. 在首次写入时设置足够长的过期时间

// 设置初始数据和过期时间
redisTemplate.opsForHash().put(uuid, "pdfPath", pdfPath);
redisTemplate.expire(uuid, 900, TimeUnit.SECONDS);  // 15分钟足够处理完成// 后续异步操作
CompletableFuture.supplyAsync(() -> {redisTemplate.opsForHash().put(uuid, "otherField", value);return result;
});

 2.定期检查 key 状态

Long ttl = redisTemplate.getExpire(uuid);
if (ttl == -1) {log.warn("Key {} 存在但没有过期时间", uuid);
} else if (ttl == -2) {log.warn("Key {} 不存在", uuid);
}

最佳实践

 

1. 评估操作耗时,设置合适的过期时间

2. 在首次写入时设置过期时间

3. 避免在多次写入后设置过期时间

4. 添加状态监控和日志记录  总结 在使用 Redis Hash 结构时,建议在创建时就设置合适的过期时间,而不是在多次操作后再设置。这样可以确保数据在整个处理过程中的可靠性和可用性。

http://www.xdnf.cn/news/125191.html

相关文章:

  • 纯真社区IP库离线版发布更新
  • 2025年3月电子学会青少年机器人技术(五级)等级考试试卷-理论综合
  • LeetCode算法题(Go语言实现)_59
  • Java函数式编程深度解析:从Lambda到流式操作
  • Allegro23.1新功能之铜皮替换成Via功能操作指导
  • PowerBI-使用参数动态修改数据源路径
  • 注意力机制:Transformer如何用“数学凝视“统治AI?
  • QTcpSocket 和 QUdpSocket 来实现基于 TCP 和 UDP 的网络通信
  • 第二章:langchain文本向量化(embed)搭建与详细教程-openai接口方式(上)
  • 软件开发过程通常包含多个阶段,结合 AI 应用,可规划出以下 Markdown 文件名称的资料来记录各阶段内容
  • 每日JavaScript 4.24
  • nacos配置springboot配置信息,并且集成金仓数据库
  • loading加载中效果 css实现
  • 【AI论文】ToolRL:奖励是工具学习所需的一切
  • windows 部署cAdvisor
  • SpringBoot 封装统一API返回格式对象 标准化开发 请求封装 统一格式处理
  • 使用vue2开发一个医疗预约挂号平台-前端静态网站项目练习
  • 携国家图书馆文创打造AI创意短片,阿里妈妈AIGC能力面向商家开放
  • Gazebo 仿真环境系列教程(一):环境安装与基础使用
  • ubuntu20.04(ROS noetic版)安装cartographer
  • 一次丝滑的手工SQL注入
  • 深度剖析RLHF:语言模型“类人输出”的训练核心机制
  • 全面认识Chroma 向量数据库中的索引和相似度
  • Python基础语法:标识符,运算符,数据输入input(),数据输出print(),转义字符,续行符
  • 如何通过CRM管理软件提升客户满意度:实战策略与系统应用解析
  • java项目中分库分表使用场景?具体应该如何实现?
  • Streamlit从入门到精通:构建数据应用的利器
  • 数据中台-数据质量管理系统:从架构到实战
  • ai如何赋能艺术教育
  • LainChain技术解析:基于RAG架构的下一代语言模型增强框架