Spring Boot整合Redis Stack构建本地向量数据库相似性查询

ops/2024/11/29 4:41:17/

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用作向量数据库,进行相似性搜索。

二、环境准备

在开始之前,我们需要准备以下环境:

  1. JDK:确保已安装Java Development Kit(JDK),版本建议为17或更高。
  2. Maven:用于构建和管理Java项目依赖。
  3. Docker:用于运行Redis Stack容器。
  4. Spring Boot:用于构建微服务应用。
三、Redis Stack安装与配置

我们将使用Docker来安装Redis Stack。以下是安装步骤:

  1. 拉取Redis Stack镜像

    docker pull redis/redis-stack
    
  2. 运行Redis Stack容器

    docker run -d --name redis-stack -p 6379:6379 -p 5540:5540 redis/redis-stack
    

    这将启动Redis Stack容器,并暴露Redis服务(端口6379)和Redis Insight管理界面(端口5540)。

  3. 访问Redis Insight

    打开浏览器,访问http://localhost:5540,即可进入Redis Insight管理界面,进行Redis数据库的可视化管理。

四、Spring Boot项目构建

接下来,我们将使用Spring Boot构建一个微服务应用,用于与Redis Stack进行交互,实现向量数据库的相似性查询。

  1. 创建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>
    
  2. 配置Redis连接

    application.ymlapplication.properties文件中配置Redis连接信息:

    spring:redis:host: localhostport: 6379# 其他配置,如密码、连接池等(可选)
    
  3. 创建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等(可选)
    }
    
  4. 实现向量存储与查询

    为了将文本或数据转换为向量,并使用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等)来实现高效的向量搜索。此外,上述代码中的余弦相似度计算是手动实现的,仅用于示例,不推荐在生产环境中使用。

  5. 创建控制器

    创建一个控制器,用于接收客户端的请求,并调用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);}
    }
    
  6. 运行应用

    使用Maven或IDE运行Spring Boot应用,然后可以通过Postman或其他HTTP客户端发送请求,进行向量存储和查询。

五、总结

通过上述步骤,我们成功使用Spring Boot整合了Redis Stack,并构建了一个本地向量数据库,实现了相似性查询。然而,需要注意的是,Redis原生并不支持向量搜索,因此在实际应用中,我们需要借助Redis的搜索模块、


http://www.ppmy.cn/ops/137562.html

相关文章

Qt桌面应用开发 第九天(综合项目一 飞翔的鸟)

目录 1.鸟类创建 2.鸟动画实现 3.鼠标拖拽 4.自动移动 5.右键菜单 6.窗口透明化 项目需求&#xff1a; 实现思路&#xff1a; 创建项目导入资源鸟类创建鸟动画实现鼠标拖拽实现自动移动右键菜单窗口透明化 1.鸟类创建 ①鸟类中包含鸟图片、鸟图片的最小值下标和最大值…

【04】Selenium+Python 手动添加Cookie免登录(实例)

一、什么是Cookie&#xff1f; Cookie 是一种由服务器创建并保存在用户浏览器中的小型数据文件。它用于存储用户的相关信息&#xff0c;以便在后续访问同一网站时可以快速检索这些信息。Cookie 主要用于以下几个方面&#xff1a; 1.状态管理&#xff1a; Cookie 可以保存用户…

【简单好抄保姆级教学】javascript调用本地exe程序(谷歌,edge,百度,主流浏览器都可以使用....)

javascript调用本地exe程序 详细操作步骤结果 详细操作步骤 在本地创建一个txt文件依次输入 1.指明所使用注册表编程器版本 Windows Registry Editor Version 5.00这是脚本的第一行&#xff0c;指明了所使用的注册表编辑器版本。这是必需的&#xff0c;以确保脚本能够被正确解…

数据库和缓存的数据一致性 -20241124

问题描述 一致性 缓存中有数据&#xff0c;缓存的数据值数据库中的值缓存中本没有数据&#xff0c;数据库中的值最新值&#xff08;有请求查询数据库时&#xff0c;会将数据写入缓存&#xff0c;则变为上面的“一致”状态&#xff09; “数据不一致”&#xff1a; 缓存的数据值…

探索 Vue的nextTick :原理剖析、使用场景及代码实践详解

在 Vue 中,$nextTick 是一个非常有用的 API,主要用于在 DOM 更新完成后执行一些操作。它可以确保某些代码在 Vue 完成数据更新和 DOM 渲染后再执行,从而避免因更新延迟导致的问题。 1. $nextTick 的作用 $nextTick 的作用是延迟执行一个回调函数,直到 DOM 更新完成。这通…

Linux系统性能优化技巧

系统性能优化 在当今的信息技术领域&#xff0c;Linux系统的性能优化变得越来越重要。随着Linux操作系统的广泛应用&#xff0c;从桌面环境到大型服务器集群&#xff0c;性能优化不仅可以提升系统的响应速度和吞吐量&#xff0c;还能降低资源消耗&#xff0c;从而延长硬件使用…

【深度学习之回归预测篇】 深度极限学习机DELM多特征回归拟合预测(Matlab源代码)

深度极限学习机 (DELM) 作为一种新型的深度学习算法&#xff0c;凭借其独特的结构和训练方式&#xff0c;在诸多领域展现出优异的性能。本文将重点探讨DELM在多输入单输出 (MISO) 场景下的应用&#xff0c;深入分析其算法原理、性能特点以及未来发展前景。 1、 DELM算法原理及其…

大模型并行:TP, PP, DP,MP

目录 大模型并行:TP, PP, DP,MP 张量并行(TP) 数据并行(DP) 模型并行(MP) 流水线并行(PP) TP:张量模型并行 一、定义与基本原理 二、切分方式 三、主要优势与挑战 优势 挑战 四、应用场景 五、注意事项 大模型并行:TP, PP, DP,MP 数据并行(Data Pa…