在 Go 中使用 Redis 存储和读取 JSON 数据的示例代码如下。这个代码片段展示了如何将你提到的两个 JSON 对象存入 Redis,并从中读取它们。
示例代码
首先确保你已经安装了 go-redis
库:
go get github.com/go-redis/redis/v8
然后,你可以使用以下代码与 Redis 交互:
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"github.com/go-redis/redis/v8"
)
var ctx = context.Background()
// 定义 NFProfile 的结构体
type NFProfile struct {
NfType string `json:"nfType,omitempty"`
NfStatus string `json:"nfStatus,omitempty"`
PlmnList []PlmnEntry `json:"plmnList,omitempty"`
Ipv4Addresses []string `json:"ipv4Addresses,omitempty"`
NfInstanceId string `json:"nfInstanceId,omitempty"`
}
type PlmnEntry struct {
Mcc string `json:"mcc"`
Mnc string `json:"mnc"`
}
func main() {
// 创建 Redis 客户端
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis 服务器地址
})
nfInstanceID := "NF_INSTANCE_ID_12345"
smfInstanceID := "smf_12345"
nfProfile := NFProfile{
NfType: "AMF",
NfStatus: "REGISTERED",
PlmnList: []PlmnEntry{{Mcc: "460", Mnc: "01"}},
Ipv4Addresses: []string{"192.168.0.1"},
NfInstanceId: nfInstanceID,
}
smfProfile := NFProfile{
NfType: "", // 如果有特定类型可以添加
NfStatus: "", // 如果有状态信息也可以添加
PlmnList: []PlmnEntry{{Mcc: "460", Mnc: "01"}},
Ipv4Addresses: []string{"192.168.0.1"},
NfInstanceId: smfInstanceID,
}
err := setNFProfile(rdb, nfInstanceID, nfProfile)
if err != nil {
log.Fatalf("could not set NF profile for %s : %v", nfInstanceID, err)
}
err = setNFProfile(rdb, smfInstanceID, smfProfile)
if err != nil {
log.Fatalf("could not set SMF profile for %s : %v", smfInstanceID, err)
}
fmt.Println("Data has been stored in Redis.")
retrievedNFS, err := getNFProfile(rdb, nfInstanceID)
if err != nil {
log.Fatalf("could not retrieve NF profile for %s : %v", nfInstanceID, err)
}
fmt.Printf("Retrieved NF Profile for %s : %+v\n", nfInstanceID, retrievedNFS)
retrievedSMF, err := getNFProfile(rdb, smfInstanceID)
if err != nil {
log.Fatalf("could not retrieve SMF profile for %s : %v", smfInstanceID, err)
}
fmt.Printf("Retrieved SMF Profile for %s : %+v\n", smfInstanceID, retrievedSMF)
}
// 将结构体转换为 JSON 字符串并存储到 Redis
func setNFProfile(rdb *redis.Client, key string, profile NFProfile) error {
profileJSON, err := json.Marshal(profile)
if err != nil {
return fmt.Errorf("failed to marshal profile to JSON: %w", err)
}
return rdb.Set(ctx, key, profileJSON, 0).Err()
}
// 从 Redis 获取并解析 JSON 字符串为结构体
func getNFProfile(rdb *redis.Client, key string) (NFProfile, error) {
var profile NFProfile
result, err := rdb.Get(ctx, key).Result()
if err != nil {
return profile, fmt.Errorf("failed to get value from Redis for key %s : %w", key ,err )
}
err = json.Unmarshal([]byte(result), &profile)
if err != nil {
return profile ,fmt.Errorf("failed to unmarshal JSON to structure type :%w" ,err )
}
return profile ,nil
}
代码说明
结构体定义:我们定义了一个
NFProfile
和一个嵌套的PlmnEntry
结构体来表示你的数据。连接到 Redis:创建一个新的 Redis 客户端,连接到指定的地址(在这里是 localhost 的 6379 端口)。
设置和获取函数:
setNFProfile
函数接收一个键和对应的结构体,将其转换为 JSON 格式后存储到 Redis。getNFProfile
函数根据键从 Redis 获取值,并将其解析回结构体。
错误处理:对于可能出现的错误进行处理,并打印相应的信息。
执行逻辑:调用设置和获取函数,分别存储两个实例的数据并打印出来。
注意事项
- 请确保你的环境中已安装 Go 和运行中的Redis 实例。
- 若需要,适当修改连接参数以符合实际情况(如密码、数据库索引等)。
- 对于更复杂的数据,可以根据需求扩展或调整数据模型。
通过上述示例,你应该能够成功地将 JSON 数据存储在 Redis 并能检索出来。如有其他问题,请随时询问!
内容由零声教学AI助手提供,问题来源于学员提问