RedisVL EmbeddingsCache深度实践与最佳指南

一、为什么需要 EmbeddingsCache

  1. 减少重复计算
    对同一段文本,向量化模型会每次返回相同的嵌入。借助缓存,首次计算后无论后续何时再请求,都能直接复用上次结果。

  2. 降低业务延迟
    嵌入模型推理耗时(数十毫秒到百毫秒不等),对实时系统尤为明显。缓存命中时,仅需一次 Redis GET,毫秒级响应,极大提升用户体验。

  3. 可扩展元数据管理
    除了嵌入向量,往往还需对 “文本来源”、“类别标签”、“处理时间戳” 等信息进行关联存储。EmbeddingsCache 内置 metadata 字段,丰富应用场景。

二、核心设计与实现原理

  • Redis 哈希 + 二进制字段
    每条缓存项以 Redis Hash 存储,字段包括:textmodel_nameembedding(二进制 Float32 数组)和 metadata(JSON 序列化),并可附加 TTL。

  • Key 计算
    通常以 SHA1(text + model_name) 生成唯一 Key,如:embedcache:<sha1>,避免长文本直接作为 Redis Key。

  • 批量操作管道化
    mset/mget/mexists/mdrop 等批量接口在底层使用 Redis pipeline 或 MGET/MSET 命令,实现高吞吐。

  • 异步支持
    提供 aset/aget/amexists/amdrop,与主流 async 框架(asyncio、FastAPI)无缝集成。

三、快速上手示例

3.1 环境与依赖

pip install redisvl sentence-transformers
import os, time
import numpy as np
os.environ["TOKENIZERS_PARALLELISM"] = "False"from redisvl.extensions.cache.embeddings import EmbeddingsCache
from redisvl.utils.vectorize    import HFTextVectorizer

3.2 初始化与配置

# 1. 向量化器:选用 all-mpnet-base-v2
vectorizer = HFTextVectorizer(model="redis/langcache-embed-v1",cache_folder=os.getenv("SENTENCE_TRANSFORMERS_HOME")
)# 2. 缓存:不开启过期
cache = EmbeddingsCache(name="embedcache",redis_url="redis://localhost:6379",ttl=None
)

四、核心 API 详解

4.1 单条存取

  • 存储

    text, model = "What is AI?", "redis/langcache-embed-v1"
    emb = vectorizer.embed(text)
    meta = {"category":"ai","src":"user"}
    key = cache.set(text=text, model_name=model, embedding=emb, metadata=meta)
    
    • 返回 Redis Key,可用于后续按键操作。
  • 检索

    record = cache.get(text=text, model_name=model)
    # 返回 dict: {'text', 'model_name', 'embedding', 'metadata', 'ttl_remain'}
    
  • 存在性检查 & 删除

    cache.exists(text=text, model_name=model)    # bool
    cache.drop(text=text, model_name=model)
    

4.2 键名操作

无需提供原文本,只需 Key:

cache.exists_by_key(key)
cache.get_by_key(key)
cache.drop_by_key(key)

4.3 批量操作

最佳实践:高并发场景下尽量使用批量接口,减少网络延迟。

items = [{"text": t, "model_name": m, "embedding": vectorizer.embed(t)} for t in texts]
keys   = cache.mset(items)
exists = cache.mexists(texts, model_name=m)
recs   = cache.mget(texts, model_name=m)
cache.mdrop(texts, model_name=m)

注意:异步对应 amset/amexists/amget/amdrop

五、TTL 与过期策略

  • 全局 TTL:在初始化时指定 ttl=N,所有条目默认 N 秒后自动过期。
  • 单条覆盖set(..., ttl=5) 只对该条生效。

示例:5 秒默认、1 秒覆盖、验证过期行为:

ttl_cache = EmbeddingsCache("ttl","redis://localhost:6379", ttl=5)
k1 = ttl_cache.set(text, model, emb)             # 5s
k2 = ttl_cache.set("short", model, emb, ttl=1)   # 1stime.sleep(2)
assert not ttl_cache.exists_by_key(k2)
assert     ttl_cache.exists_by_key(k1)

六、异步场景集成

import asyncioasync def async_demo():k = await cache.aset(text="Async", model_name=model, embedding=emb)hit = await cache.aexists_by_key(k)print("Async hit?", hit)await cache.adrop_by_key(k)asyncio.run(async_demo())

适用于 FastAPI、AIOHTTP 等异步框架。

七、实战案例:文本分类系统

# 1. 新建缓存 & 绑定向量化器
example = EmbeddingsCache("demo","redis://...", ttl=3600)
vectorizer.cache = example# 2. 处理流式请求
queries = ["What is AI?","How to learn ML?","What is AI?","NN?","How to learn ML?"]
hits=0
for q in queries:if example.exists(text=q, model_name=model): hits+=1emb = vectorizer.embed(q)   # 自动缓存 or 计算print(f"命中率:{hits}/{len(queries)}={(hits/len(queries))*100:.1f}%")

八、性能对比实测

bench = EmbeddingsCache("bench","redis://...", ttl=3600)
vectorizer.cache=bench
n=20# 跳过缓存
t1=time.time()
for _ in range(n): vectorizer.embed(text, skip_cache=True)
t2=time.time()# 使用缓存
t3=time.time()
for _ in range(n): vectorizer.embed(text)
t4=time.time()print(f"NoCache avg={(t2-t1)/n:.4f}s,WithCache avg={(t4-t3)/n:.4f}s,加速{(t2-t1)/(t4-t3):.2f}×")

典型可达 5×–10× 加速。

九、架构扩展与最佳实践

  1. 多模型并行
    不同业务可用不同 model_name,缓存同一文本多版本嵌入。

  2. 容量监控与清理
    定期扫描 Redis 内存、基于 LFU/LRU 策略删除冷门条目,避免缓存膨胀。

  3. 分布式部署
    在大规模集群中,可将 EmbeddingsCache 前置于微服务,后端统一 Redis;或使用 Redis Cluster、哨兵实现高可用。

  4. 落地监控

    • 缓存命中率(hits/queries)
    • 平均响应时延
    • Redis 内存使用
  5. 安全与隔离

    • 在多租户场景下,可为每个租户设置不同 name 前缀,避免 Key 冲突
    • 使用 Redis ACL/密码保护访问

十、小结

RedisVL EmbeddingsCache 通过简洁一致的 API,将文本嵌入与元数据高效落地到 Redis,支持单/批量、同步/异步、TTL 管理。本指南覆盖了从入门到进阶、实战到运维的全流程,结合典型业务场景与性能数据,助你轻松构建低成本、高性能的嵌入缓存层,显著提升向量检索应用的用户体验和系统效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/911771.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/911771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker Compose 与 Harbor 私有仓库

目录 简介 一、Docker 容器重启策略与状态码解析 &#xff08;一&#xff09;Docker 容器重启策略详解 &#xff08;二&#xff09;Docker 容器常见退出状态码 二、Docker Compose 工具深度应用 &#xff08;一&#xff09;Docker Compose 简介与安装 &#xff08;二&am…

thinkphp8之文件上传

文件上传安装 命令&#xff1a;composer require topthink/think-filesystem 二&#xff0e;上传代码、接收代码 <form action"/index/index/index" enctype"multipart/form-data" method"post"> <input type"file" name…

【商业分析】价值流图应用案例:服务器硬件生产

在当今竞争激烈的市场环境下&#xff0c;服务器硬件制造商面临着诸多挑战。本文中&#xff0c;田辛老师将深入探讨价值流图&#xff08;VSM&#xff09;在某服务器硬件生产中的应用案例&#xff0c;展示其如何助力企业实现降本增效。 一、价值流图概述 &#xff08;一&#x…

系统性能优化-4 磁盘

系统性能优化-4 磁盘 磁盘作为计算机中速度最慢的硬件之一&#xff0c;常常是系统的性能瓶颈&#xff0c;优化磁盘一般能得到明显的提升~ 文章以如何高效的传输文件来讨论针对磁盘的优化技术&#xff0c;如零拷贝、直接 IO、异步 IO等。 最简单的网络传输 最简单的方式的当然…

Windows注册HTTP服务实现Jenkins Allure报告、测试日志永久访问

使用 NSSM (Non-Sucking Service Manager) 将 Allure 报告的 HTTP 服务注册为 Windows 后台服务的详细操作攻略&#xff0c;确保 Jenkins 测试结果可以长期通过 URL 访问。 ✅ 目标 将 allure generate 生成的报告目录托管为静态网页服务&#xff0c;并作为后台服务运行&#…

从ADI与AMD的专利诉讼,看高端FPGA的巅峰对决

RFSoC,作为FPGA家族中的“贵族”,高端芯片中的尖端代表,技术积累要求高、利润厚,售价贵,主要面向不差钱的军用雷达处理、通信和测试/测量仪器用户。 2019年,模拟芯片龙头ADI公司,发起专利侵权诉讼,而尝到甜头的赛灵思,一边反诉,一边揶揄ADI公司:爱哭的娃未必有奶吃…

性能测试-jmeter实战3

课程&#xff1a;B站大学 记录软件测试-性能测试学习历程、掌握前端性能测试、后端性能测试、服务端性能测试的你才是一个专业的软件测试工程师 性能测试-jmeter实战3 负载测试稳定性测试负载测试曲线图其他测试策略并发测试压力测试容量测试 性能指标的介绍响应时间并发用户数…

Maven镜像

在 Maven 中配置多个镜像源&#xff0c;主要是为了解决依赖包在不同地区下载速度不同的问题&#xff0c;或者为了使用特定的私有仓库作为依赖源。Maven 支持在 pom.xml 文件中配置多个镜像源&#xff08;repositories&#xff09;&#xff0c;也可以在 Maven 的全局配置文件 se…

ArduPilot 教程(2):运行第一个 SITL 无人机仿真

目录 1. MAVLink 通信协议 2. MAVProxy 地面控制站 3. 运行 SITL 无人机仿真 3.1. 使用 MAVProxy 控制无人机 3.2. 使用 SITL 地图界面控制无人机 4. MAVProxy 常用命令 5. 其它地面控制站 5.1. QGroundControl 5.2. MissionPlanner 5.3. 不启用 MAVProxy 6. 本讲小…

开源AI大模型驱动下视频媒介对图文生态的重构与S2B2C商业场景创新——基于AI智能名片与商城小程序源码的实践分析

摘要&#xff1a;数字媒介演进的进程中&#xff0c;视频对图片及文字的媒介侵蚀效应正呈现加速态势&#xff0c;尤其在Z世代及新网民群体中&#xff0c;视频已成为其触网的首要信息载体。本文基于媒介技术迭代与商业场景融合的双重视角&#xff0c;探究开源AI大模型如何通过智能…

Kafka线上集群部署方案:从环境选型到资源规划思考

在分布式消息系统的落地应用中&#xff0c;Kafka集群的线上部署方案直接关系到业务系统的稳定性与性能表现。不同于测试环境的简易搭建&#xff0c;生产级集群需要从操作系统适配、存储介质选型、容量规划到网络资源调度等多维度进行系统性设计。本文将从工程实践角度&#xff…

算法第40天|买卖股票的最佳时机 1 2 3

121. 买卖股票的最佳时机 题目 思路与解法 记录每一天买或不买时的价值 class Solution { public:int maxProfit(vector<int>& prices) {// dp数组含义&#xff1a;// dp[i][0]:第i天&#xff0c;持有股票时的最大价值&#xff0c;dp[i][1]:第i天&#xff0c;不持…

【赵渝强老师】使用select...into outfile语句备份MySQL

MySQL可以使用select…into outfile语句将表的内容导出为一个文本文件。其基本的语法格式如下&#xff1a; select [列名] from 表名 [WHERE 语句] into outfile 目标文件 [其他选项];该语句分为两个部分。前半部分是一个普通的select语句&#xff0c;通过这个select语句来查询…

PHY XGE 自协商AN数据交互过程

在裸机环境下&#xff0c;两个 **支持 10GBASE-T** 的 PHY 芯片通过 Clause 73 协议完成自协商&#xff08;Auto-Negotiation&#xff0c;AN&#xff09;&#xff0c;它们在 **无操作系统控制** 的条件下&#xff0c;完成以下 **完整的点对点数据交互流程**&#xff1a; --- ##…

【算法 day09】LeetCode 232.用栈实现队列 | 225. 用队列实现栈 | 20. 有效的括号 |1047. 删除字符串中的所有相邻重复项

232.用栈实现队列 题目链接 | 文档讲解 |视频讲解 : 链接 1.思路&#xff1a; 使用2个栈去实现队列 先将元素放入栈1中&#xff0c;然后在将栈1中的元素出栈到栈2中&#xff0c;栈2的元素出栈顺序就和队列的出队一样 2.代码&#xff1a; class MyQueue {Stack<Integer…

大模型项目实战:业务场景和解决方案

你的这张图已经涵盖了很多主流的大模型实战项目&#xff0c;非常全面&#xff01;下面我会补充更多市面上常见的AI大模型实战项目&#xff0c;并且简要说明每个项目的核心内容、实现思路和主流技术栈&#xff0c;方便你参考和扩展。 1. 智能问答/知识库系统 核心内容&#xff…

vscode + Jlink 一键调试stm32 单片机程序(windows系统版)

vscode Jlink 一键调试stm32 单片机程序 安装交叉编译工具链安装 x-pack 构建工具安装 JLink 工具gnu-debuger 插件编译一键启动调试 安装交叉编译工具链 stm32采用 交叉编译工具链 arm-none-eabi-xxx, 下载之后解压&#xff0c;压缩包内部结构如下图&#xff1a; 目录下的bi…

Linux线程概念和控制

Linux线程概念 Linux中线程如何理解 线程<执行流<进程 Linux中的线程模拟进程实现&#xff08;线程就是轻量级进程&#xff09; 与独立的进程相比&#xff0c;线程创建和销毁的开销较小&#xff0c;因为它们共享相同的内存空间和资源。 线程是进程内的执行分支&…

服务器出现问题,连接服务器出现3680 并删除数据库出现1192,请查看详细问题(运维)

mysql连接服务器时&#xff0c;出现这个问题&#xff1a;3680 - Failed to create schema directory xxxx (errno: 28 - No space left on device) 第一步&#xff1a;诊断问题类型 检查磁盘空间 运行以下命令&#xff1a; bash df -h # 查看磁盘使用情况 如果输出中 Use% 接…

uniapp:微信小程序胶囊「复制链接」灰色处理

在原生开发的小程序中默认是支持复制的 &#x1f424; 但是在 uniapp 开发的小程序中无法复制&#xff08;体验版与开发版都可以进行复制&#xff0c;但发布后不可&#xff09; 解决方法&#xff1a; methods: {onShareAppMessage: function() {// return custom share data …