You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MLRun 1.2.1中遍历KV(NoSQL/Redis)目标且无需指定主键?

在MLRun 1.2.1中遍历Redis/NoSQL KV目标的方案

MLRun的在线特征服务(Online Feature Service)设计初衷是面向低延迟的主键查询,本身并不提供全量遍历KV存储的接口。要实现全量遍历,需要直接操作底层的Redis/NoSQL存储实例,结合MLRun的特征元数据解析结果,同时确保数据唯一性。

针对Redis目标的实现步骤

1. 获取Redis客户端连接

MLRun的Redis目标基于redis-py库,你可以通过两种方式获取客户端:

方式一:从已创建的在线特征服务中提取底层客户端

import mlrun
import mlrun.feature_store as fs

# 初始化在线特征服务
svc = fs.get_online_feature_service(fs.FeatureVector("myVector", ["client.*"]))

# 提取底层Redis客户端(仅适用于Redis作为在线存储的场景)
redis_client = svc._get_store()._client

方式二:直接通过MLRun配置初始化客户端

如果已知Redis连接信息,也可以直接创建客户端:

import redis

# 从MLRun全局配置读取Redis参数(或直接传入已知的连接信息)
redis_host = mlrun.mlconf.get("redis.host", "localhost")
redis_port = mlrun.mlconf.get("redis.port", 6379)
redis_db = mlrun.mlconf.get("redis.db", 0)

redis_client = redis.Redis(host=redis_host, port=redis_port, db=redis_db)

2. 遍历Redis键并批量获取值

使用SCAN命令(代替KEYS,避免阻塞Redis)遍历所有键,结合MGET批量获取值,同时根据特征向量的主键规则去重:

import json

# 定义特征向量的主键字段(需和你的特征向量定义一致,比如["cuid", "key1"])
primary_keys = ["cuid", "key1"]
seen_keys = set()
all_features = []

# 用SCAN游标遍历所有键
cursor = 0
while True:
    cursor, keys = redis_client.scan(cursor=cursor, match="*")  # 可加前缀过滤,比如"client_*"
    if not keys:
        break
    
    # 批量获取键对应的值
    values = redis_client.mget(keys)
    
    for key, value in zip(keys, values):
        if not value:
            continue
        
        # 解析MLRun存储的JSON格式特征数据
        feature_data = json.loads(value.decode("utf-8"))
        
        # 生成唯一主键标识用于去重
        key_identifier = tuple(feature_data.get(pk) for pk in primary_keys)
        if key_identifier in seen_keys:
            continue
        seen_keys.add(key_identifier)
        
        all_features.append(feature_data)

# 遍历完成后,all_features即为去重后的全量特征数据
print(f"共获取到{len(all_features)}条唯一特征数据")

3. 其他NoSQL KV存储的通用思路

如果使用MongoDB等其他KV存储,核心逻辑类似:

  • 获取对应存储的客户端连接
  • 使用存储原生的遍历API(比如MongoDB的find())
  • 根据特征向量定义的主键字段去重,确保数据唯一性

注意事项

  • 全量遍历会对存储实例造成一定压力,建议在业务低峰期执行
  • 批量操作(如Redis的MGET)能有效提高遍历效率,减少网络往返
  • 去重逻辑必须严格匹配特征向量的主键定义,避免重复数据

内容的提问来源于stack exchange,提问作者JzD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 16:20:22