Redis 8.0 新特性深度解析与TypeScript实战

通过将 RediSearch 深度集成到其查询引擎并引入原生的 Vector Set 数据类型,Redis 8.0 显著增强了其在全文搜索和向量相似性搜索方面的能力。

Redis 8.0 TypeScript RediSearch Vector Search

深度集成

RediSearch 完全融入 Redis Query Engine

原生向量支持

全新的 Vector Set 数据类型

智能搜索

结合关键词与语义搜索

TypeScript 实战

构建智能论坛系统

1. Redis 8.0 新特性概述

Redis 8.0 版本带来了多项重大更新,旨在提升性能、扩展功能,并更好地支持现代应用,特别是人工智能(AI)和机器学习(ML)场景。其中,RediSearch 模块的深度集成以及全新的 Vector Set 数据类型的引入,是本次更新的核心亮点

8.0
Redis 版本
2x
性能提升
向量维度支持
100%
RediSearch 集成度

1.1 RediSearch 融入 Redis Query Engine

Redis 8.0 的一个关键特性是将 RediSearch 模块完全集成到 Redis 核心中,形成了 Redis Query Engine [369] [373]。 这意味着用户不再需要单独安装或管理 RediSearch 模块,其功能已成为 Redis 原生日志的一部分。

"通过将 RediSearch 融入 Query Engine,Redis 8.0 显著增强了其在数据查询和分析方面的能力。"

1.2 原生向量数据支持:Vector Set 数据类型

Redis 8.0 引入了全新的 `Vector Set` 数据类型(目前处于 Beta 阶段),专门为存储和检索高维向量而设计 [357] [360]。 这一新数据类型旨在满足 AI 应用场景的需求,如语义搜索、推荐系统、人脸识别等。

全文搜索

支持布尔逻辑、模糊搜索、地理空间查询等多功能搜索能力

向量相似性搜索

高效的KNN搜索,支持量化、降维和属性过滤

混合查询

结合关键词搜索和语义搜索,提供更智能的查询体验

2. 核心概念与功能详解

2.1 RediSearch 全文搜索核心机制

RediSearch 的核心机制在于其高效的索引构建和查询处理能力。它使用压缩的倒排索引来实现快速索引,同时保持较低的内存占用 [369] [373]

RediSearch 工作流程

graph LR A["FT.CREATE 定义索引"] --> B["自动索引数据"] B --> C["FT.SEARCH 执行查询"] C --> D["解析查询语句"] D --> E["利用索引定位文档"] E --> F["返回匹配结果"]

2.2 Vector Set 向量相似性搜索原理

`Vector Set` 数据类型的核心功能是进行向量相似性搜索。其基本原理是将高维向量存储在 Redis 中,并通过特定的算法(如 K-最近邻,KNN)来查找与给定查询向量最相似的向量。

// Vector Set 基本操作示例 VADD user:alice:photos VALUES 512 0.1 0.2 ... 0.8 photo:42 // 向名为 user:alice:photos 的 Vector Set 添加一个 512 维向量 VSIM user:alice:photos VALUES 512 0.15 0.25 ... 0.75 COUNT 3 // 搜索与给定查询向量最相似的 3 个向量

2.3 Redis 8.0 中 RediSearch 与 Vector Set 的协同

在 Redis 8.0 中,RediSearch (作为 Redis Query Engine 的一部分) 和 `Vector Set` 数据类型可以协同工作,以提供更强大的搜索和推荐能力。用户可以执行混合查询(Hybrid Queries),即结合传统的基于关键字的全文搜索和基于向量相似性的语义搜索 [370]

"这种协同作用使得开发者能够构建更智能、更灵活的搜索和推荐系统,充分利用 Redis 8.0 提供的多样化数据操作能力。"

3. 环境搭建与配置

3.1 Redis 8.0 安装与模块配置

要充分利用 Redis 8.0 的新特性,推荐使用 Redis Stack,因为它包含了 Redis 以及所有相关的模块,如 RediSearch, RedisJSON, RedisTimeSeries, RedisBloom 和 RedisGraph,并且会预装支持向量搜索的 `Vector Set` [365]

# 使用 Docker 快速启动 Redis Stack docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:latest # Redis 服务器运行在 6379 端口,RedisInsight 运行在 8001 端口

3.2 TypeScript 开发环境搭建

为了使用 TypeScript 进行开发,需要搭建相应的开发环境。创建一个新的 Node.js 项目并安装必要的依赖:

# 创建项目目录并初始化 mkdir redis-forum-ts cd redis-forum-ts npm init -y # 安装 TypeScript 和相关工具 npm install -g typescript ts-node npm install redis @types/redis @xenova/transformers # 创建 tsconfig.json { "compilerOptions": { "target": "ESNext", "module": "CommonJS", "strict": true, "outDir": "./dist" } }

4. TypeScript 中操作 Redis 8.0 新特性

4.1 使用 `node-redis` 客户端库

在 TypeScript 项目中与 Redis 8.0 交互,推荐使用官方支持的 `redis` (也称为 `node-redis`) 客户端库

import { createClient } from 'redis'; const client = createClient({ url: 'redis://localhost:6379' // 替换为你的 Redis 服务器地址 }); client.on('error', (err) => console.log('Redis Client Error', err)); await client.connect(); // ... 执行 Redis 操作 ... await client.quit();

4.2 通过 `sendCommand` 调用 `Vector Set` 相关命令

由于 `Vector Set` 是 Redis 8.0 的新数据类型,可以使用 `client.sendCommand()` 方法直接发送原始命令

async function addPhotoVector(client: any, userId: string, photoId: string, embedding: number[]) { const key = `user:${userId}:photos`; const dims = embedding.length.toString(); const values = embedding.map(v => v.toString()); const args = ['VADD', key, 'VALUES', dims, ...values, 'photo:' + photoId]; await client.sendCommand(args); } // 示例:搜索相似图片 async function searchPhotos(client: any, userId: string, queryEmbedding: number[], count: number): Promise<string[]> { const key = `user:${userId}:photos`; const dims = queryEmbedding.length.toString(); const values = queryEmbedding.map(v => v.toString()); const args = ['VSIM', key, 'VALUES', dims, ...values, 'COUNT', count.toString()]; const result = await client.sendCommand(args); return result; }

4.3 使用 `@redis/search` 进行 RediSearch 操作

对于 RediSearch 操作,`node-redis` 库提供了 `@redis/search` 子模块,其中包含了针对 RediSearch 命令的封装。

import { SchemaFieldTypes, VectorAlgorithms } from '@redis/search'; // 创建包含向量字段的索引 await client.ft.create('idx:posts', { title: { type: SchemaFieldTypes.TEXT, weight: 5.0 }, content: SchemaFieldTypes.TEXT, tags: { type: SchemaFieldTypes.TAG, separator: ',' }, postEmbedding: { type: SchemaFieldTypes.VECTOR, ALGORITHM: VectorAlgorithms.HNSW, TYPE: 'FLOAT32', DIM: 512, DISTANCE_METRIC: 'COSINE' } }, { ON: 'HASH', PREFIX: 'post:' }); // 执行混合查询(关键词 + 向量搜索) const float32Buffer = (arr: number[]) => Buffer.from(new Float32Array(arr).buffer); const searchQuery = `(@title:${keyword} | @content:${keyword})=>[KNN ${resultCount} @postEmbedding $vec AS score]`; const results = await client.ft.search('idx:posts', searchQuery, { PARAMS: { vec: float32Buffer(queryVector) }, RETURN: ['title', 'content', 'score'], SORTBY: 'score', DIALECT: 2 });

4.4 TypeScript 类型定义与封装策略

为了在 TypeScript 项目中更好地利用 Redis 8.0 的新特性,建议进行适当的类型定义和封装。

// 为 Vector Set 操作定义接口 interface VectorAddParams { key: string; label: string; vector: number[]; } interface VectorSearchResultItem { label: string; score: number; } // 封装 Vector Set 操作 async function vadd(client: any, params: VectorAddParams): Promise<void> { // ... 实现 VADD 命令的封装 ... } async function vsim(client: any, params: VectorSimilaritySearchParams): Promise<VectorSearchResultItem[]> { // ... 实现 VSIM 命令的封装 ... }

5. 实战:从零构建智能论坛系统 (TypeScript)

5.1 项目初始化与结构设计

我们将使用 Express.js 作为 Web 框架,并遵循 MVC (Model-View-Controller) 模式进行项目组织。

项目结构设计

graph TD A["src/"] --> B["config/redis.ts"] A --> C["controllers/"] A --> D["models/"] A --> E["routes/"] A --> F["services/"] A --> G["app.ts"] C --> C1["post.controller.ts"] C --> C2["user.controller.ts"] D --> D1["post.model.ts"] D --> D2["user.model.ts"] E --> E1["post.routes.ts"] E --> E2["user.routes.ts"] F --> F1["embedding.service.ts"]

5.2 数据模型定义:用户、帖子、评论

在论坛系统中,核心数据模型通常包括用户 (User)、帖子 (Post) 和评论 (Comment)。我们主要关注帖子模型。

// src/models/post.model.ts import { SchemaFieldTypes, VectorAlgorithms } from '@redis/search'; export interface Post { id: string; // Redis Hash key 的一部分,例如 `post:${id}` title: string; content: string; authorId: string; tags: string[]; createdAt: Date; contentEmbedding?: number[]; // 帖子内容的向量嵌入 } // 用于 RediSearch 索引的 Schema export const PostSchema = { '$.title': { type: SchemaFieldTypes.TEXT, AS: 'title', SORTABLE: true, WEIGHT: 5.0 }, '$.content': { type: SchemaFieldTypes.TEXT, AS: 'content' }, '$.authorId': { type: SchemaFieldTypes.TAG, AS: 'authorId' }, '$.tags': { type: SchemaFieldTypes.TAG, AS: 'tags', SEPARATOR: ',' }, '$.createdAt': { type: SchemaFieldTypes.NUMERIC, AS: 'createdAt', SORTABLE: true }, '$.contentEmbedding': { type: SchemaFieldTypes.VECTOR, ALGORITHM: VectorAlgorithms.HNSW, TYPE: 'FLOAT32', DIM: 768, DISTANCE_METRIC: 'COSINE', AS: 'contentEmbedding' } };

5.3 文本向量嵌入生成与存储

为了在论坛中实现基于语义的搜索和推荐,我们需要将文本内容转换为向量嵌入。以下是两种常见的实现方案:

特性 方案一:Node.js/TypeScript (`@xenova/transformers`) 方案二:调用 Python 服务 (`sentence-transformers` + FastAPI)
实现复杂度 较低,全 JS/TS 栈 较高,涉及跨语言通信和服务部署
性能 可能受 Node.js 单线程和模型大小限制 可利用 Python 多核和 GPU 加速,性能潜力更高
模型选择与灵活性 相对有限,依赖 JS 移植的模型 非常广泛,可灵活选择 Python 生态中的各种模型
部署与维护 简单,与主应用一同部署 较复杂,需要独立部署和维护 Python 服务
适用场景 中小型应用,希望简化技术栈 大型应用,对嵌入质量和性能有较高要求
// 使用 @xenova/transformers 生成文本嵌入 import { pipeline } from '@xenova/transformers'; let generateEmbedding: any; export async function initializeEmbeddingModel() { if (!generateEmbedding) { generateEmbedding = await pipeline( 'feature-extraction', 'Xenova/all-MiniLM-L6-v2' // 示例模型,可替换 ); } } export async function embedText(text: string): Promise<number[]> { if (!generateEmbedding) { throw new Error("Embedding model not initialized."); } const pipeOptions = { pooling: 'mean', normalize: true }; const output = await generateEmbedding(text, pipeOptions); return Array.from(output.tolist()[0]); }

5.4 帖子发布与向量索引构建

当用户发布新帖子时,关键步骤是将帖子的文本内容转换为数值向量,并将其存储到 Redis 中。

// 使用 VADD 将向量存入 Vector Set export async function addPostVectorToVectorSet(postId: string, embedding: number[]): Promise<void> { const key = `forum:post:vectors`; const dims = embedding.length.toString(); const values = embedding.map(v => v.toString()); const args = ['VADD', key, 'VALUES', dims, ...values, `post:${postId}`]; await redisClient.sendCommand(args); } // 创建 RediSearch 索引(项目启动时调用) export async function createPostIndex(): Promise<void> { try { await redisClient.ft.create('idx:forum_posts', PostSchema, { ON: 'JSON', PREFIX: 'post:' }); console.log('RediSearch index for posts created successfully.'); } catch (e: any) { if (e.message === 'Index already exists') { console.log('Post index already exists.'); } else { throw e; } } }

5.5 实现论坛全文搜索功能

利用 RediSearch,我们可以为论坛系统构建强大的全文搜索功能。

// 在 post.controller.ts 中实现搜索功能 export const searchPosts = async (req: Request, res: Response) => { const query = req.query.q; // 获取查询关键词 if (!query || typeof query !== 'string') { return res.status(400).json({ error: 'Query parameter "q" is required and must be a string.' }); } try { // 构建 RediSearch 查询字符串 const searchQuery = `(@title:${query} | @content:${query})`; const results = await redisClient.ft.search('idx:forum_posts', searchQuery, { LIMIT: { from: 0, size: 10 }, // 分页参数 RETURN: ['$.id', '$.title', '$.content', '$.authorId', '$.createdAt'], SORTBY: { BY: 'createdAt', DIRECTION: 'DESC' } }); const posts: Post[] = results.documents.map(doc => ({ id: doc.value['$.id'], title: doc.value['$.title'], content: doc.value['$.content'], authorId: doc.value['$.authorId'], createdAt: new Date(doc.value['$.createdAt']), })); res.json({ total: results.total, posts }); } catch (error) { console.error('Error searching posts:', error); res.status(500).json({ error: 'Internal server error' }); } };

5.6 实现帖子相似性推荐

帖子相似性推荐功能可以根据当前帖子的内容,找到语义上相似的其他帖子。

// 方案一:使用 Vector Set 的 VSIM 命令 export async function getSimilarPostsFromVectorSet(postId: string, currentPostEmbedding: number[], k: number = 5): Promise<string[]> { const key = `forum:post:vectors`; const dims = currentPostEmbedding.length.toString(); const values = currentPostEmbedding.map(v => v.toString()); const args = ['VSIM', key, 'VALUES', dims, ...values, 'COUNT', k.toString(), 'EXCLUDE_ELE', `post:${postId}`]; const result = await redisClient.sendCommand(args); return result.map((id: string) => id.replace('post:', '')); } // 方案二:使用 RediSearch 的 KNN 搜索 export async function getSimilarPostsFromRediSearch(postId: string, currentPostEmbedding: number[], k: number = 5): Promise<string[]> { const queryVectorBuffer = Buffer.from(new Float32Array(currentPostEmbedding).buffer); const searchQuery = `(@id:-${postId})=>[KNN ${k} @contentEmbedding $query_vec AS score]`; const results = await redisClient.ft.search('idx:forum_posts', searchQuery, { PARAMS: { query_vec: queryVectorBuffer }, RETURN: ['id'], SORTBY: 'score', DIALECT: 2 }); return results.documents.map(doc => doc.value.id); }

5.7 用户界面与交互实现

用户界面(UI)和交互是论坛系统的重要组成部分,但本教程主要关注后端实现。简要来说,前端可以使用现代 JavaScript 框架(如 React, Vue.js, Angular)或服务器端渲染技术来构建。

"前端通过调用后端提供的 API 接口来获取和提交数据。由于本教程重点在 Redis 和 TypeScript 后端,前端实现细节将不在此详述。"

6. 高级特性与优化

6.1 构建更智能的推荐系统

基于 Redis 8.0 的向量搜索能力,可以构建更智能的推荐系统,而不仅仅是基于帖子内容的相似性。

用户行为分析

记录用户的浏览、点赞、评论等行为,将这些行为数据转换为用户偏好向量

协同过滤

通过分析哪些帖子经常被同一用户喜欢,来发现物品间的关联

混合推荐

结合基于内容的推荐和基于行为的推荐,提高推荐的准确性和多样性

实时个性化

利用 Redis 的低延迟特性,根据用户的最新行为实时更新推荐列表

RediSearch 和 Vector Set 的结合为实现语义搜索和简单的问答功能提供了基础。

语义搜索架构

graph LR A["用户查询"] --> B["文本向量化"] B --> C["向量相似性搜索"] C --> D["结果排序"] D --> E["返回相关帖子"] F["问答库"] --> G["问题向量"] G --> H["答案关联"] H --> I["智能问答"]

6.3 性能优化与扩展性考虑

随着论坛用户和帖子数量的增长,性能优化和系统扩展变得至关重要。

// 性能优化策略示例 // 1. 索引优化 await client.ft.optimize('idx:forum_posts'); // 2. 向量量化与降维 const args = [ 'VADD', key, 'VALUES', dims, ...values, element, 'QUANTIZE', '8' // 8-bit 量化 ]; // 3. 异步处理 async function asyncProcessPost(post: Post) { const embedding = await embedText(post.content); await addPostVectorToVectorSet(post.id, embedding); // 更新帖子 JSON 文档 await client.json.set(`post:${post.id}`, '$', { ...post, contentEmbedding: embedding }); }

7. 总结与展望

7.1 Redis 8.0 新特性在AI应用中的价值

Redis 8.0 通过集成 RediSearch 和引入 Vector Set,极大地增强了其在 AI 应用中的价值。它不再仅仅是一个高性能的缓存或键值存储,而是演变成了一个能够处理复杂搜索、相似性匹配和实时数据分析的多功能数据平台。

"原生向量数据支持使得开发者可以直接在 Redis 中存储和查询高维嵌入,而无需引入额外的专用向量数据库,简化了技术栈并降低了系统复杂性。"

7.2 未来可能的发展方向

展望未来,Redis 在 AI 领域的发展方向可能包括:

更强大的向量处理能力

支持更多类型的向量索引算法、更灵活的量化策略以及更高效的向量运算

与 AI 生态的深度集成

提供更便捷的与主流机器学习框架和 AI 应用开发工具集成的方案

增强的查询语言和功能

支持更复杂的 AI 相关查询模式,如图形遍历、时序数据分析等

云原生和 Serverless 集成

提供更紧密的与云平台 AI 服务和 Serverless 架构集成的解决方案

"Redis 8.0 的新特性为开发者打开了通往更智能应用的大门,其在 AI 领域的潜力值得持续关注和探索。"
Redis 人工智能技术概念图