今日油价:如何避免取到旧数据?结合每日 7 点更新频率的定时拉取
# 今日油价:如何避免取到旧数据?结合每日 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)