要将 MongoDB 的查询结果(在此示例中是 MongoDBLibrary.RestfulAPIGetOne
方法)适应到 Redis,你需要根据你当前的 MongoDB 查询逻辑进行调整。以下是如何修改代码,以便在查询到数据后将其存储到 Redis 中。
修改后的代码示例
首先,确保你的 RestfulAPIGetOne
方法可以返回一个结构体实例,这样你就可以从 MongoDB 中获取数据并随后将其存入 Redis。以下是实现这一逻辑的基本步骤:
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"github.com/go-redis/redis/v8"
"go.mongodb.org/mongo-driver/bson" // 引入MongoDB驱动
)
type Link struct {
Item []Href `json:"item"`
}
type Href struct {
Href string `json:"href"`
}
type Record struct {
ID string `bson:"_id" json:"_id"`
NfType string `bson:"nfType" json:"nfType"`
Link Link `bson:"_link" json:"_link"`
}
// 假设这是从 MongoDB 获取单个记录的方法
func (mdb *MongoDBLibrary) RestfulAPIGetOne(collName string, filter interface{}) (*Record, error) {
var result Record
err := mdb.Collection(collName).FindOne(context.TODO(), filter).Decode(&result)
if err != nil {
return nil, err
}
return &result, nil
}
func main() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis地址和端口
})
defer rdb.Close()
nfType := "AMF" // 这里指定你的 nfType
collName := "urilist"
filter := bson.M{"nfType": nfType}
mongoLib := &MongoDBLibrary{} // 初始化你的MongoDB库实例
record, err := mongoLib.RestfulAPIGetOne(collName, filter)
if err != nil {
log.Fatalf("Error fetching record from MongoDB: %v", err)
}
key := fmt.Sprintf("record:%s", record.ID)
linkJSON, err := json.Marshal(record.Link)
if err != nil {
log.Fatalf("Failed to marshal link for ID %s: %v", record.ID, err)
}
err = rdb.HSet(ctx, key, map[string]interface{}{
"nfType": record.NfType,
"_link": linkJSON,
}).Err()
if err != nil {
log.Fatalf("Failed to store record %s in redis: %v", record.ID, err)
}
fmt.Printf("Stored record in Redis with key: %s\n", key)
}
主要变化说明:
从 MongoDB 获取记录:使用
RestfulAPIGetOne
方法从 MongoDB 中获取单个记录,该方法假设返回的是一个结构体指针。Redis 存储:
- 使用获取到的记录信息,生成一个唯一的 Redis 键。
- 将
_link
字段序列化为 JSON,并通过哈希类型存储在 Redis 中。
错误处理:对每一步操作(从 MongoDB 获取、JSON 序列化、写入 Redis)进行了错误处理,以确保程序健壮性。
这样,在运行时,如果满足指定的条件,它会从 MongoDB 获取数据并存储到 Redis 中。
内容由零声教学AI助手提供,问题来源于学员提问