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

如何在Redis中高效存储按日期维度的空间日价格与可用性数据

针对Airbnb类业务的Redis日期维度数据缓存方案

核心复合结构设计

针对数百万空间的独立日期数据存储需求,推荐使用**Sorted Set(日期索引)+ Hash(详情存储)**的复合结构,兼顾日期范围查询效率与结构化数据存储能力:

1. 日期索引(Sorted Set)

  • 键命名规范:space:date_index:{space_id}
  • 存储逻辑:成员为日期字符串(如2024-05-20),分数为该日期对应的Unix时间戳(用于快速范围筛选)
  • 作用:快速定位某个空间在指定日期范围内的所有有效日期

2. 详情存储(Hash)

  • 键命名规范:space:date_data:{space_id}
  • 存储逻辑:字段为日期字符串(与Sorted Set成员一致),值为JSON格式的结构化数据(如{"price":99,"available":true})
  • 作用:高效存储每个日期的价格、可用性等详情信息

关键操作逻辑

数据更新(仅在PSQL数据变更时触发)

  • 新增/修改日期数据:
    # 更新详情Hash
    HSET space:date_data:1234 2024-05-20 '{"price":109,"available":true}'
    # 若为新增日期,同步更新索引Sorted Set(修改则无需此步)
    ZADD space:date_index:1234 1716182400 2024-05-20
    
  • 删除日期数据:
    # 删除详情Hash中的字段
    HDEL space:date_data:1234 2024-05-20
    # 同步删除索引Sorted Set中的成员
    ZREM space:date_index:1234 2024-05-20
    

日期范围查询

  1. 先通过索引获取目标日期范围内的所有日期:
    # 获取2024-05-20至2024-05-22的日期(时间戳对应日期0点)
    ZRANGEBYSCORE space:date_index:1234 1716182400 1716355199
    
  2. 批量获取这些日期的详情数据:
    HMGET space:date_data:1234 2024-05-20 2024-05-21 2024-05-22
    

实用优化建议

  • 批量操作优先:查询时用HMGET批量获取日期详情,减少Redis与后端的网络交互次数
  • 过期数据清理:对于历史过期日期(如已过的日期),可定期通过脚本扫描space:date_index:{space_id},删除时间戳小于当前时间的成员及对应Hash字段,节省内存
  • 一致性保障:PSQL数据变更与Redis更新需保证最终一致,可通过本地事务+消息队列重试机制实现(如PSQL提交后发MQ消息,消费端更新Redis,失败则重试)
  • 内存控制:若单个空间的日期数据量极大,可按月份拆分Hash(如space:date_data:1234:202405),避免单个Hash过大影响性能

方案优势对比

  • 对比Redis JSON:无需解析整个JSON对象,按需获取指定日期数据,减少内存占用与解析开销
  • 对比单独Sorted Set:解决了Sorted Set无法存储结构化数据的问题,复合结构兼顾索引效率与数据完整性
  • 对比时间序列:更适配独立空间的离散日期数据场景,无需时序聚合能力,操作更轻量化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:23:22