go代码实现 gin 传入运单号查询运单号物流详情,如果redis缓存中本运单号已签收,则返回物流详情,如果redis缓存中不存在此运单号。调用接口去查询物流详情
时间: 2024-02-06 15:19:06 浏览: 69
以下是一个简单的Go代码实现,使用Gin框架和Redis缓存,根据传入的运单号查询运单号物流详情。如果Redis缓存中已有该运单号的签收信息,则直接返回签收信息;否则,调用接口查询物流详情,并将查询到的签收信息存入Redis缓存中。
```go
package main
import (
"fmt"
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/go-redis/redis"
)
type LogisticsInfo struct {
WaybillNumber string `json:"waybill_number"` // 运单号
Status string `json:"status"` // 物流状态
// 其它物流信息字段
}
func main() {
// 初始化Gin框架和Redis客户端
r := gin.Default()
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
// 定义路由接口
r.GET("/logistics/:waybill_number", func(c *gin.Context) {
waybillNumber := c.Param("waybill_number")
// 先从Redis缓存中查询是否有该运单号的签收信息
if val, err := client.Get(waybillNumber).Result(); err == nil {
// Redis缓存中已有该运单号的签收信息,直接返回该签收信息
c.JSON(http.StatusOK, gin.H{
"status": "success",
"data": val,
})
} else {
// Redis缓存中没有该运单号的签收信息,调用接口查询物流详情并存入缓存
logisticsInfo := queryLogisticsInfo(waybillNumber) // 调用接口查询物流详情
if logisticsInfo.Status == "已签收" {
// 如果物流状态为已签收,则将签收信息存入Redis缓存中
client.Set(waybillNumber, logisticsInfo, 24*time.Hour)
}
c.JSON(http.StatusOK, gin.H{
"status": "success",
"data": logisticsInfo,
})
}
})
// 启动Gin框架
r.Run(":8080")
}
func queryLogisticsInfo(waybillNumber string) *LogisticsInfo {
// TODO: 调用接口查询物流详情
// 返回的数据格式要与LogisticsInfo结构体保持一致
return &LogisticsInfo{
WaybillNumber: waybillNumber,
Status: "已签收",
}
}
```
在上述代码中,我们定义了一个LogisticsInfo结构体表示运单号的物流详情,包含运单号和物流状态等信息。在路由接口中,我们首先从Redis缓存中查询是否有该运单号的签收信息,如果有则直接返回该签收信息,否则调用接口查询物流详情并将查询到的签收信息存入Redis缓存中。注意,我们在存入Redis缓存时设置了过期时间为24小时,以避免缓存数据过期而导致的数据不一致问题。
阅读全文