Spring Boot整合Redis Stack构建本地向量数据库相似性查询
Spring Boot整合Redis Stack构建本地向量数据库相似性查询
在微服务架构中,数据的高效存储与快速查询是至关重要的。Redis作为一个高性能的内存数据结构存储系统,不仅可以用作缓存、消息代理,还可以扩展为向量数据库,实现高效的相似性搜索。本文将详细介绍如何使用Spring Boot整合Redis Stack,构建本地向量数据库,并进行相似性查询。
一、Redis Stack简介
Redis Stack(也称为Redis Enterprise或Redis Cloud)是一个全面的Redis解决方案,它包括了Redis数据库、Redis搜索、Redis AI、Redis JSON等多个模块,为开发者提供了丰富的数据结构和强大的功能。其中,Redis搜索模块允许我们将Redis用作向量数据库,进行相似性搜索。
二、环境准备
在开始之前,我们需要准备以下环境:
- JDK:确保已安装Java Development Kit(JDK),版本建议为17或更高。
- Maven:用于构建和管理Java项目依赖。
- Docker:用于运行Redis Stack容器。
- Spring Boot:用于构建微服务应用。
三、Redis Stack安装与配置
我们将使用Docker来安装Redis Stack。以下是安装步骤:
-
拉取Redis Stack镜像
docker pull redis/redis-stack -
运行Redis Stack容器
docker run -d --name redis-stack -p 6379:6379 -p 5540:5540 redis/redis-stack这将启动Redis Stack容器,并暴露Redis服务(端口6379)和Redis Insight管理界面(端口5540)。
-
访问Redis Insight
打开浏览器,访问
http://localhost:5540,即可进入Redis Insight管理界面,进行Redis数据库的可视化管理。
四、Spring Boot项目构建
接下来,我们将使用Spring Boot构建一个微服务应用,用于与Redis Stack进行交互,实现向量数据库的相似性查询。
-
创建Spring Boot项目
使用Spring Initializr或Maven命令创建一个新的Spring Boot项目,并添加以下依赖:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><!-- 其他依赖,如Spring AI(可选) --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-redis-spring-boot-starter</artifactId><version>${spring-ai.version}</version></dependency> </dependencies> -
配置Redis连接
在
application.yml或application.properties文件中配置Redis连接信息:spring:redis:host: localhostport: 6379# 其他配置,如密码、连接池等(可选) -
创建Redis配置类
创建一个Redis配置类,用于配置RedisTemplate和其他必要的Bean:
@Configuration public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));return template;}// 其他配置,如HashOperations、ValueOperations等(可选) } -
实现向量存储与查询
为了将文本或数据转换为向量,并使用Redis进行存储和查询,我们需要一个嵌入模型(如Word2Vec、BERT等)来生成向量。这里,我们假设已经有一个向量化工具(如
vectorStore),它可以将指定的字段转换为高维向量,并存储在Redis中。@Service public class VectorService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 存储向量到Redispublic void storeVector(String key, double[] vector) {// 将向量序列化为字符串或其他可存储的格式(如JSON)String vectorStr = Arrays.toString(vector);redisTemplate.opsForValue().set(key, vectorStr);}// 查询与给定向量最相似的K个向量public List<String> similaritySearch(double[] queryVector, int k) {// 将查询向量转换为与存储在Redis中相同格式的字符串(可选)String queryVectorStr = Arrays.toString(queryVector);// 使用Redis的搜索功能进行相似性搜索(这里需要实现具体的搜索逻辑)// 假设有一个`vectorStore.similaritySearch`方法可以进行相似性计算// List<Document> results = vectorStore.similaritySearch(queryVector, k);// 返回结果(这里仅为示例,实际应返回相似向量的键或其他相关信息)// return results.stream().map(Document::getKey).collect(Collectors.toList());// 由于Redis原生不支持向量搜索,这里可以使用第三方库或自定义实现// 以下是一个简单的示例,使用余弦相似度进行手动计算(不推荐用于生产环境)Map<String, Double> similarityMap = new HashMap<>();redisTemplate.keys("*").forEach(redisKey -> {String vectorStr = (String) redisTemplate.opsForValue().get(redisKey);double[] storedVector = Arrays.stream(vectorStr.replaceAll("[\\[\\]\\s]", "").split(",")).mapToDouble(Double::parseDouble).toArray();double similarity = cosineSimilarity(queryVector, storedVector);similarityMap.put(redisKey, similarity);});// 按相似度排序并返回前K个结果List<Map.Entry<String, Double>> sortedEntries = similarityMap.entrySet().stream().sorted((e1, e2) -> Double.compare(e2.getValue(), e1.getValue())).collect(Collectors.toList());return sortedEntries.stream().limit(k).map(Map.Entry::getKey).collect(Collectors.toList());}// 计算余弦相似度private double cosineSimilarity(double[] a, double[] b) {double dotProduct = 0.0;double normA = 0.0;double normB = 0.0;for (int i = 0; i < a.length; i++) {dotProduct += a[i] * b[i];normA += a[i] * a[i];normB += b[i] * b[i];}return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));} }注意:上述代码中的
vectorStore.similaritySearch方法是一个假设的方法,Redis原生并不支持向量搜索。在实际应用中,我们可以使用Redis的搜索模块(需要安装Redis Search插件)或第三方库(如Elasticsearch、FAISS等)来实现高效的向量搜索。此外,上述代码中的余弦相似度计算是手动实现的,仅用于示例,不推荐在生产环境中使用。 -
创建控制器
创建一个控制器,用于接收客户端的请求,并调用
VectorService进行向量存储和查询:@RestController @RequestMapping("/vectors") public class VectorController {@Autowiredprivate VectorService vectorService;// 存储向量@PostMapping("/store")public ResponseEntity<Void> storeVector(@RequestBody Map<String, double[]> requestBody) {String key = requestBody.keySet().iterator().next();double[] vector = requestBody.get(key);vectorService.storeVector(key, vector);return ResponseEntity.ok().build();}// 查询相似向量@GetMapping("/search")public ResponseEntity<List<String>> similaritySearch(@RequestParam double[] queryVector, @RequestParam int k) {List<String> similarKeys = vectorService.similaritySearch(queryVector, k);return ResponseEntity.ok(similarKeys);} } -
运行应用
使用Maven或IDE运行Spring Boot应用,然后可以通过Postman或其他HTTP客户端发送请求,进行向量存储和查询。
五、总结
通过上述步骤,我们成功使用Spring Boot整合了Redis Stack,并构建了一个本地向量数据库,实现了相似性查询。然而,需要注意的是,Redis原生并不支持向量搜索,因此在实际应用中,我们需要借助Redis的搜索模块、
相关文章:
Spring Boot整合Redis Stack构建本地向量数据库相似性查询
Spring Boot整合Redis Stack构建本地向量数据库相似性查询 在微服务架构中,数据的高效存储与快速查询是至关重要的。Redis作为一个高性能的内存数据结构存储系统,不仅可以用作缓存、消息代理,还可以扩展为向量数据库,实现高效的相…...
shell脚本基础学习_总结篇(完结)
细致观看可以,访问shell脚本学习专栏,对应章节会有配图https://blog.csdn.net/2201_75446043/category_12833287.html?spm1001.2014.3001.5482 导语 一、shell脚本简介 1. 定义: 2. 主要特点: 3. shell脚本的基本结构 4. S…...
什么是 C++ 中的函数对象?它有什么特点?
在 C 中,函数对象(Function Object)是一种可调用对象,它允许像函数一样被调用,但实际上它可能并不是真正的函数。函数对象可以是以下几种类型之一: 普通函数: 一个普通的、定义在命名空间或类…...
css:项目
这是一个完整的网站制作的流程 美工会先制作一个原型图: 原型图写的不详细,就是体现一个网页大致的布局 然后美工再做一个psd样例图片 然后再交给程序员 项目 模块化开发:把代码的不同的样式封装起来,需要用到相同样式的标签就…...
macOS 开发环境配置与应用开发指南
macOS 开发环境配置与应用开发指南 macOS作为苹果公司推出的操作系统,因其稳定性、优雅的用户界面和强大的开发支持,已成为开发者和创意专业人士的首选平台之一。无论是开发iOS、macOS桌面应用,还是Web应用、跨平台程序,macOS都提…...
[A-19][V06]ARMv8/v9-内存虚拟化原理
ver0.2 [看前序文章有惊喜,关注W\X\G=Z+H=“浩瀚架构师”,可以解锁全部文章] 前言 前一篇文章,我们介绍了ARM内存的属性,算是一个小小的里程碑点,接下来我们会把注意力重新拉回虚拟化的赛道。我们从[V-05] 虚拟化基础-异常模型(Exception model)之后,花了很多笔墨介绍…...
registry 删除私有仓库镜像
原文链接:https://blog.csdn.net/yogima/article/details/122172744 如果需要彻底删除,只需进行register 磁盘删除镜像 彻底删除了,就可以到达彻底删除的目的。 如果只需要软删除,则只需进行通过API删除。 curl --header "Ac…...
UPLOAD LABS | UPLOAD LABS 靶场初识
关注这个靶场的其它相关笔记:UPLOAD LABS —— 靶场笔记合集-CSDN博客 0x01:UPLOAD LABS 靶场简介 UPLOAD LABS 靶场是一个专门用于学习文件上传漏洞攻击和防御的靶场。它提供了一系列文件上传漏洞的实验环境,用于帮助用户了解文件上传漏洞的…...
Samba服务器常见问题处理
指定的网络文件夹目前是以其他用户名和密码进行映射的。要用其他用户名和密码进行连接,首先请断开所有现有的连接到网络共享的映射 解决方案 单击“开始”菜单,选择“运行…”。 在弹出的窗口中,输入cmd 进入命令行模式,并输入…...
Java基础 设计模式——针对实习面试
目录 Java基础 设计模式单例模式工厂模式观察者模式策略模式装饰器模式其他设计模式 Java基础 设计模式 单例模式 单例模式(Singleton Pattern) 定义:确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。适用场景&…...
最大公约数和最小公倍数-多语言
目录 C 语言实现 Python 实现 Java 实现 Js 实现 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 程序分析: 最小公倍数输入的两个数之积除于它们的最大公约数,关键是求出最大公约数; 求最大公约数用辗转…...
第三方数据库连接免费使用和安装
是强大的一体化数据库开发解决方案,可从单一应用程序无缝连接多个数据库,包括 MySQL、PostgreSQL、MongoDB、MariaDB、SQL Server、Oracle、SQLite 和 Redis。 下载:https://download.csdn.net/download/mo3408/90045937 升级特性 模型&…...
水库大坝安全监测之量水堰计应用
量水堰计是水库大坝安全监测系统中的一种关键设备,主要用于测量水库水位、流量等水力参数。以下是量水堰计在水库大坝安全监测中的应用及注意事项: 一、量水堰计的工作原理 量水堰计是一种专门用于测量水流流量的仪器,其工作原理主要基于水流…...
算法笔记:滑动窗口
前言 滑动窗口作为一个考点较高的算法,广泛应用于子串问题中,本文将进行详细讲解。 一、滑动窗口是什么 滑动窗口是双指针算法的一种,基本思路为维护一个窗口,然后从前往后遍历元素进行运算。 二、滑动窗口算法和其他双指针算…...
Ubuntu下的Graphviz的基础使用方法
一、Graphviz介绍 graphviz是贝尔实验室开发的一个开源的工具包,它使用一个特定的DSL(领域特定语言):dot作为脚本语言,然后使用布局引擎来解析此脚本,并完成自动布局 1、什么是Graphviz 官网地址,https://www.graphviz.org/ Gr…...
微积分复习笔记 Calculus Volume 1 - 6.8 Exponential Growth and Decay
6.8 Exponential Growth and Decay - Calculus Volume 1 | OpenStax...
React的ts文件中通过createElement拼接一段内容出来
比如接口返回一个值 const values [23.00, 40.00/kg];想做到如下效果, 如果单纯的用render渲染会很简单, 但是在ts文件中处理,所以采用了createElement拼接 代码如下: format: (values: string[]) > {if (!values || !val…...
Pinia之1:介绍Pinia、项目中引入Pinia
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
Python双向链表、循环链表、栈
一、双向链表 1.作用 双向链表也叫双面链表。 对于单向链表而言。只能通过头节点或者第一个节点出发,单向的访问后继节点,每个节点只能记录其后继节点的信息(位置),不能向前遍历。 所以引入双向链表,双…...
5G基础学习笔记
功能软件化 刚性网络:固定连接、固定功能、固化信令交互 柔性网络:网元拆解成服务模块,基于API接口调用 服务化架构(SBA) Service based Architecture (SBA): 借鉴了业界成熟的SOA、微服务架…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
