技术博客
今日油价:如何避免取到旧数据?结合每日 7 点更新频率的定时拉取

今日油价:如何避免取到旧数据?结合每日 7 点更新频率的定时拉取

作者: 万维易源
2026-08-27
今日油价定时拉取缓存过期更新频率
# 今日油价:如何避免取到旧数据?结合每日 7 点更新频率的定时拉取 > 接口/接入点:今日油价 · 查询油价(138-46)/ 查询行情(138-49) · 免费 · 适用人群:中高级开发者 · 阅读时间:约 6 分钟 ## TL;DR - 数据**每日 7 点**更新,缓存 TTL 应设为「到下次 7 点过期」,才不会拿到昨日价。 - 接了「查询行情」的 `next_change_time`(下次调价日),可在临近调价时**主动失效缓存**强制回源。 - 定时任务建议放在 7:05 之后,避开更新瞬间的数据未就绪窗口。 ## Why 缓存用错了反而会害你:如果 TTL 设成「固定 24 小时」但从任意时刻起算,就可能在新价已出、旧缓存未过期时把旧价展示给用户,引发客诉。正确姿势是让缓存过期点对齐数据更新点(每日 7 点)。 ## What | 项 | 说明 | |----|------| | 更新频率 | 每日 7 点整 | | 相关字段 | `ct`(数据更新时间)、查询行情的 `next_change_time` | | 目标 | 取到最新价、避开旧缓存 | ## How **定时拉取 + 缓存对齐 7 点** ```python import requests, redis, datetime rds = redis.Redis(host="localhost", port=6379, db=0) def seconds_to_next_7am(): now = datetime.datetime.now() d = now.replace(hour=7, minute=0, second=0, microsecond=0) if now >= d: d += datetime.timedelta(days=1) return int((d - now).total_seconds()) def refresh(prov): r = requests.post("https://route.showapi.com/138-46", data={"appKey": "YOUR_APPKEY", "prov": prov}, timeout=10).json() item = r["showapi_res_body"]["list"][0] rds.setex(f"oil:{prov}", seconds_to_next_7am(), str(item)) # 定时任务(如 cron 每天 7:10):遍历省份调用 refresh ``` cURL(手动触发刷新): ```bash curl -X POST "https://route.showapi.com/138-46?appKey=YOUR_APPKEY" \ -H "content-type: application/x-www-form-urlencoded" -d "prov=%E5%8C%97%E4%BA%AC" ``` **调价日主动失效**(结合查询行情): ```python # 取下次调价日,临近时删除缓存 r2 = requests.post("https://route.showapi.com/138-49", data={"appKey": "YOUR_APPKEY", "prov": "北京"}, timeout=10).json() next_change = r2["showapi_res_body"]["next_change_time"] # YYYYMMDD # 若 next_change 为今天,则 rds.delete(f"oil:北京") 强制回源 ``` ## 返回示例与解析 `ct` 是数据更新时间(如 `2022-09-07 10:06:12.867`),可用于校验缓存是否已是当日数据;`next_change_time` 为 `YYYYMMDD`,用于调价前主动失效。 ## 进阶/边界 - **避开更新窗口**:定时任务放在 7:05~7:10,避开 7 点准点数据同步瞬间。 - **缓存未就绪兜底**:若回源失败,可返回上一次成功缓存(即使略旧),保证可用性。 - **全国拉全也适用**:批量拉全后统一写缓存,见[《全国 31 省油价怎么一次性拉全?》](https://www.showapi.com/guides/oilprice-province-list-138)。 ## FAQ **Q:缓存设 24 小时为什么还会拿到旧价?** A:若从非 7 点时刻起算 24 小时,TTL 过期点会偏离更新点,可能展示旧价。应让过期点对齐每日 7 点。 **Q:怎么知道数据已更新?** A:看 `ct`(数据更新时间)是否为当天;或结合查询行情的 `next_change_time` 在调价日主动失效缓存。 **Q:定时任务什么时候跑最好?** A:建议每天 7:05 之后,避开 7 点准点的同步窗口。 ## 相关能力 / 下一步阅读 - [今日油价:免费也有档次限制,如何设计缓存避免超限?](https://www.showapi.com/guides/oilprice-cache-138) - [今日油价:涨跌幅怎么查?「查询行情」接入点的调价日与涨跌率实战](https://www.showapi.com/guides/oilprice-trend-138) - **本系列共 13 篇**:查看[今日油价开发指南总目录](https://www.showapi.com/guides/oilprice-guides-138)