Redis Stack 基础知识-构建现代实时数据平台
Redis Stack 是 Redis 生态系统中的重要组件,它扩展了 Redis OSS 的核心功能,为开发者提供了更丰富的数据处理能力和更完整的开发体验。本文将深入介绍 Redis Stack 的概念、特性、应用场景以及如何将其与 Spring AI 结合使用。
一、Redis Stack 简介
Redis Stack 是 Redis 官方推出的一站式解决方案,它整合了 Redis 最先进的模块和功能,为开发者提供了构建实时应用的理想平台。
1.1 Redis Stack 的核心组件
- Redis OSS:作为核心基础组件
- RedisJSON:支持 JSON 文档存储和查询
- RediSearch:提供全文搜索能力
- RedisTimeSeries:时间序列数据支持
- RedisBloom:概率数据结构支持
- RedisGraph:图数据模型支持(使用 Cypher 查询语言)
1.2 为什么选择 Redis Stack?
Redis Stack 的设计理念是为开发者提供一个统一而强大的实时数据平台,同时保持 Redis 的核心哲学:简单性、高性能和可靠性。它不仅满足了缓存需求,还能支持更复杂的数据模型和查询需求,适用于各种实时数据处理场景。
二、Redis Stack 的主要特性
2.1 数据结构与模型支持
- JSON 文档:原生支持 JSON 数据的存储、索引和查询
- 全文搜索:支持复杂的文本搜索、聚合和过滤
- 时间序列:高效处理时间序列数据,支持降采样和聚合
- 概率数据结构:支持 Bloom、Cuckoo、Count-Min Sketch 等概率算法
- 图数据模型:支持图数据的存储和查询
2.2 Redis Insight 可视化工具
Redis Stack 包含了 Redis Insight,这是一个功能强大的可视化工具,能够帮助开发者理解和优化 Redis 数据。通过 Redis Insight,你可以:
- 可视化浏览数据结构
- 对大多数 Redis Stack 数据结构进行 CRUD 操作
- 使用带有智能命令自动完成功能的高级命令行界面
- 实时分析 Redis 流量
- 使用内置的 Redis CLI
- 分析内存使用情况
- 识别和排除性能瓶颈
三、Redis Stack 的应用场景
3.1 AI 与机器学习
- 向量数据库:存储和查询嵌入向量,支持语义搜索和推荐系统
- 特征存储:为机器学习模型提供低延迟的特征访问
- 语义缓存:缓存自然语言处理结果,提高系统响应速度
3.2 实时数据处理
- 数据去重:利用概率数据结构高效去除重复数据
- 消息传递:构建高性能的消息队列和发布/订阅系统
- 快速数据摄取:处理高速流入的实时数据
3.3 应用优化
- 缓存:传统的高性能数据缓存
- 身份验证令牌存储:安全高效地管理用户会话和认证信息
- 查询缓存:缓存复杂查询结果,减轻数据库负担
四、Redis Stack 的安装与配置
4.1 Docker 安装
使用 Docker 可以快速部署 Redis Stack:
docker run -d --name redis-stack --restart=always \
-v redis-data:/data -p 6379:6379 -p 8001:8001 \
-e REDIS_ARGS="--requirepass 123456" \
redis/redis-stack:latest
安装完成后,可以通过 localhost:8001
访问 Redis Insight 管理界面,默认用户名为 default
,密码为 123456
。
4.2 包选择
Redis Stack 提供了两种不同的包装选择:
- Redis Stack Server:仅包含 Redis OSS 和模块扩展,适用于生产部署
- Redis Stack:包含完整的开发者工具套件,包括 Redis Stack Server 和 Redis Insight 桌面应用程序
五、与 Spring AI 集成实现向量数据库功能
向量数据库是 AI 应用中的核心组件,Redis Stack 可以与 Spring AI 结合,实现高效的向量存储和检索功能。
5.1 添加依赖
在 Spring Boot 项目的 pom.xml
文件中添加以下依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-redis-store</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-tika-document-reader</artifactId>
</dependency>
5.2 配置连接
在 application.yml
中配置 Redis 连接参数:
spring:
data:
redis:
database: 0
timeout: 10s
lettuce:
pool:
# 连接池最大连接数
max-active: 200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# 连接池中的最大空闲连接
max-idle: 10
# 连接池中的最小空闲连接
min-idle: 0
repositories:
enabled: false
password: 123456
5.3 配置向量数据库
创建 Redis 向量数据库配置类:
@Configuration
// 禁用SpringAI提供的RedisStack向量数据库的自动配置,会和Redis的配置冲突。
@EnableAutoConfiguration(exclude = {RedisVectorStoreAutoConfiguration.class})
// 读取RedisStack的配置信息
@EnableConfigurationProperties({RedisVectorStoreProperties.class})
@AllArgsConstructor
public class RedisVectorConfig {
/**
* 创建RedisStack向量数据库
*
* @param embeddingModel 嵌入模型
* @param properties redis-stack的配置信息
* @return vectorStore 向量数据库
*/
@Bean
public VectorStore vectorStore(EmbeddingModel embeddingModel,
RedisVectorStoreProperties properties,
RedisConnectionDetails redisConnectionDetails) {
RedisVectorStore.RedisVectorStoreConfig config = RedisVectorStore.RedisVectorStoreConfig.builder()
.withIndexName(properties.getIndex())
.withPrefix(properties.getPrefix())
.build();
return new RedisVectorStore(config, embeddingModel,
new JedisPooled(redisConnectionDetails.getStandalone().getHost(),
redisConnectionDetails.getStandalone().getPort(),
redisConnectionDetails.getUsername(),
redisConnectionDetails.getPassword()),
properties.isInitializeSchema());
}
}
5.4 文档嵌入
实现文档嵌入的接口:
@RestController
@RequestMapping("/api/vector")
@AllArgsConstructor
public class VectorController {
private final VectorStore vectorStore;
/**
* 嵌入文件
*
* @param file 待嵌入的文件
* @return 是否成功
*/
@SneakyThrows
@PostMapping("embedding")
public Boolean embedding(@RequestParam MultipartFile file) {
// 从IO流中读取文件
TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(
new InputStreamResource(file.getInputStream())
);
// 将文本内容划分成更小的块
List<Document> splitDocuments = new TokenTextSplitter()
.apply(tikaDocumentReader.read());
// 存入向量数据库,这个过程会自动调用embeddingModel,将文本变成向量再存入
vectorStore.add(splitDocuments);
return true;
}
}
5.5 文档查询
实现相似度查询接口:
/**
* 查询向量数据库
*
* @param query 用户的提问
* @return 匹配到的文档
*/
@GetMapping("query")
public List<Document> query(@RequestParam String query) {
return vectorStore.similaritySearch(query);
}
六、Redis Stack 在 AI 领域的应用
Redis Stack 作为向量数据库在 AI 应用中具有广泛的用途,特别是在构建 RAG(检索增强生成)系统时尤为重要。
6.1 RAG 系统架构
RAG 系统的典型流程:
- 文档收集与处理
- 文本分割
- 向量嵌入(使用 EmbeddingModel)
- 向量存储(使用 Redis Stack)
- 相似度查询
- 大语言模型生成回答
6.2 性能优势
Redis Stack 在向量数据库应用中的性能优势:
- 低延迟:毫秒级的查询响应时间
- 高吞吐量:支持高并发的向量检索
- 内存优化:高效的内存使用设计
- 扩展性:支持水平扩展和集群部署
七、总结与展望
Redis Stack 作为现代实时数据平台,不仅继承了 Redis 的高性能特性,还扩展了其数据处理能力,使其成为构建 AI 应用、实时分析系统和高性能应用的理想选择。
结合 Spring AI,Redis Stack 可以轻松实现向量数据库功能,为 RAG 系统和其他 AI 应用提供强大的基础设施支持。随着 AI 技术的不断发展,Redis Stack 的应用场景将会更加广泛,其在实时数据处理领域的价值也将进一步凸显。
博客拟写过程的 参考资料:
觉得有用的话可以点点赞 (/ω\),支持一下。
如果愿意的话关注一下。会对你有更多的帮助。
每周都会不定时更新哦 >人< 。