如果你想从 Redis 中筛选出所有具有特定 nfType
的记录,可以使用类似于前面所述的方法,但需要在循环中将符合条件的所有记录存储到一个切片中。下面是一个示例,展示了如何实现这一点:
示例代码
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"github.com/go-redis/redis/v8"
)
type Link struct {
Item []Href `json:"item"`
}
type Href struct {
Href string `json:"href"`
}
type Record struct {
ID string `json:"_id"`
NfType string `json:"nfType"`
Link Link `json:"_link"`
}
func getRecordsByNfType(ctx context.Context, rdb *redis.Client, nfType string) ([]Record, error) {
keyPattern := "record:*" // 使用通配符匹配所有键
var records []Record // 用于存储符合条件的记录
iter := rdb.Scan(ctx, 0, keyPattern, 0).Iterator()
for iter.Next(ctx) {
key := iter.Val()
recordData, err := rdb.HGetAll(ctx, key).Result()
if err != nil {
return nil, err
}
var rec Record
rec.ID = key[len("record:"):] // 去掉前缀以获取 ID
rec.NfType = recordData["nfType"]
if linkJSONStr := recordData["_link"]; linkJSONStr != "" {
if err := json.Unmarshal([]byte(linkJSONStr), &rec.Link); err != nil {
return nil, err
}
}
// 如果 nfType 匹配,将记录添加到结果切片中
if rec.NfType == nfType {
records = append(records, rec)
}
}
if err := iter.Err(); err != nil {
return nil, err
}
return records, nil
}
func main() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis 地址和端口配置
})
defer rdb.Close()
nfType := "AMF" // 指定要查询的 nfType
records, err := getRecordsByNfType(ctx, rdb, nfType)
if err != nil {
log.Fatalf("Error fetching records from Redis: %v", err)
}
if len(records) > 0 {
fmt.Printf("Found %d record(s):\n", len(records))
for _, record := range records {
fmt.Printf("%+v\n", record)
}
} else {
fmt.Println("No matching records found.")
}
}
代码说明:
结构体定义:
- 定义了与之前相同的结构体
Link
和Record
。
- 定义了与之前相同的结构体
Redis 查询函数:
- 函数
getRecordsByNfType
用于从 Redis 获取所有匹配特定nfType
的记录。 - 利用 Redis 的扫描迭代器查找所有键,并检查每个记录的
nfType
是否与指定值匹配。如果匹配,就将该记录添加到结果切片中。
- 函数
主函数:
- 创建 Redis 客户端实例,调用查询函数并打印找到的所有记录。
注意事项:
- 此示例假设你的数据以哈希表格式存储在 Redis 中,并且有
_link
字段包含 JSON 数据。如果你的实际数据结构不同,请相应调整字段名称和解析方式。 - 在大数据集上使用全表扫描时性能可能较差,因此如果可能的话,请考虑使用更有效的数据模型或索引策略。
- 确保处理任何潜在的错误情况,以便在应用程序运行期间能够安全地捕获问题。
内容由零声教学AI助手提供,问题来源于学员提问