1. Redis 8.0 新特性概述
Redis 8.0 版本带来了多项重大更新,旨在提升性能、扩展功能,并更好地支持现代应用,特别是人工智能(AI)和机器学习(ML)场景。其中,RediSearch 模块的深度集成以及全新的 Vector Set 数据类型的引入,是本次更新的核心亮点 。
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 )来查找与给定查询向量最相似的向量。
VADD user:alice:photos VALUES 512 0.1 0.2 ... 0.8 photo:42
VSIM user:alice:photos VALUES 512 0.15 0.25 ... 0.75 COUNT 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 run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:latest
3.2 TypeScript 开发环境搭建
为了使用 TypeScript 进行开发,需要搭建相应的开发环境。创建一个新的 Node.js 项目并安装必要的依赖:
mkdir redis-forum-ts
cd redis-forum-ts
npm init -y
npm install -g typescript ts-node
npm install redis @types/redis @xenova/transformers
{
"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'
});
client.on ('error' , (err) => console.log ('Redis Client Error' , err));
await client.connect ();
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 的新特性,建议进行适当的类型定义和封装。
interface VectorAddParams {
key: string ;
label: string ;
vector: number[] ;
}
interface VectorSearchResultItem {
label: string ;
score: number ;
}
async function vadd (client: any , params: VectorAddParams): Promise<void > {
}
async function vsim (client: any , params: VectorSimilaritySearchParams): Promise<VectorSearchResultItem[]> {
}
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)。我们主要关注帖子模型。
import { SchemaFieldTypes, VectorAlgorithms } from '@redis/search' ;
export interface Post {
id: string ;
title: string ;
content: string ;
authorId: string ;
tags: string[] ;
createdAt: Date;
contentEmbedding?: number[] ;
}
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 服务
适用场景
中小型应用,希望简化技术栈
大型应用,对嵌入质量和性能有较高要求
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 中。
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);
}
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,我们可以为论坛系统构建强大的全文搜索功能。
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 {
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 实现帖子相似性推荐
帖子相似性推荐功能可以根据当前帖子的内容,找到语义上相似的其他帖子。
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:' , '' ));
}
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 的低延迟特性,根据用户的最新行为实时更新推荐列表
6.2 实现语义搜索与问答功能
RediSearch 和 Vector Set 的结合为实现语义搜索和简单的问答功能提供了基础。
语义搜索架构
graph LR
A["用户查询"] --> B["文本向量化"]
B --> C["向量相似性搜索"]
C --> D["结果排序"]
D --> E["返回相关帖子"]
F["问答库"] --> G["问题向量"]
G --> H["答案关联"]
H --> I["智能问答"]
随着论坛用户和帖子数量的增长,性能优化和系统扩展变得至关重要。
await client.ft.optimize ('idx:forum_posts' );
const args = [
'VADD' , key, 'VALUES' , dims, ...values, element,
'QUANTIZE' , '8'
];
async function asyncProcessPost (post: Post) {
const embedding = await embedText (post.content);
await addPostVectorToVectorSet (post.id, embedding);
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 领域的潜力值得持续关注和探索。"