核心优势
- Redis 8.0内存加速与向量搜索
- SQLite持久化存储与SQL查询
- Webman框架高性能API服务
设计目标
系统架构设计
整体架构概述
本图数据库系统旨在通过结合Redis 8.0的内存高速读写与向量搜索能力、SQLite3的持久化存储与SQL查询能力,以及PHP Webman框架提供的高性能API服务,构建一个功能上类似于Neo4j或DGraph的轻量级解决方案。该系统特别针对社交网络数据、复杂的知识图谱以及推荐系统中的用户-物品交互数据进行优化。
接入层
负责接收和处理客户端请求,提供统一的API接口
缓存层
利用Redis存储热点图数据,加速图遍历和查询操作
持久层
使用SQLite存储完整的图数据,确保数据持久化
组件选型与职责
组件 | 主要职责 | 关键技术/特性 |
---|---|---|
Redis 8.0
|
作为缓存层和向量搜索引擎。存储热点图数据、图遍历加速、支持向量搜索进行实时推荐、存储部分图数据索引 | 内存存储、多种数据结构、向量搜索功能、持久化(RDB/AOF) |
SQLite3
|
作为持久层。负责数据的长期存储、提供SQL查询能力、保障数据完整性、支持离线分析与备份 | 文件数据库、ACID事务、SQL查询、轻量级、无需独立服务器进程 |
PHP (Webman)
|
作为接入层和业务逻辑处理核心。提供JSON RPC 2.0和MCP协议的API接口、实现图遍历、模式匹配、推荐算法等核心逻辑 | Webman框架(基于Workerman,高性能HTTP服务)、JSON RPC 2.0、MCP协议 |
数据流与交互
客户端请求
客户端通过HTTP协议向Webman框架发送JSON RPC 2.0格式的请求
接入层处理
Webman框架接收请求,分发给相应的PHP处理程序进行解析和初步处理
缓存层交互
读请求先查询Redis缓存,命中直接返回;未命中则请求持久层SQLite3
持久层交互
当缓存未命中时,PHP处理程序与SQLite3数据库交互,执行SQL查询
数据处理与计算
获取原始数据后,PHP处理程序执行图计算逻辑(路径查找、模式匹配等)
结果返回
PHP处理程序将结果封装成JSON RPC 2.0响应,通过Webman框架返回
数据存储与索引设计
图数据模型定义
本系统采用属性图模型(Property Graph Model)作为核心数据模型,由节点(Nodes)、边(Relationships)、标签(Labels)和属性(Properties)构成。
节点结构示例
{
"id": "node_123",
"labels": ["User", "VIP"],
"properties": {
"name": "Alice",
"age": 30,
"email": "alice@example.com",
"embedding": "[0.1, 0.5, -0.2]"
}
}
边结构示例
{
"id": "edge_456",
"type": "FOLLOWS",
"source": "node_123",
"target": "node_789",
"properties": {
"since": "2023-01-01T10:00:00Z"
}
}
Redis存储与索引策略
节点存储策略
-
Hash存储节点属性
node:<node_id>
-
Set/Sorted Set存储标签索引
tag:<label_name>
边存储策略
-
Sorted Set存储邻接列表
out_edges:<node_id>
-
存储入边关系
in_edges:<node_id>
向量搜索支持 (Redis 8.0)
索引创建
FT.CREATE user_vectors ON HASH PREFIX 1 user:
SCHEMA embedding VECTOR HNSW 10
TYPE FLOAT32 DIM 128
DISTANCE_METRIC COSINE M 40
EF_CONSTRUCTION 200
向量搜索
FT.SEARCH user_vectors
"*=>[KNN 10 @embedding $userA_vec]"
PARAMS 2 userA_vec "\x12\xa9\xf5\x6c"
SORTBY __vector_score DIALECT 2
SQLite持久化存储方案
节点表设计
CREATE TABLE nodes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
type TEXT,
labels TEXT,
properties TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
边表设计
CREATE TABLE edges (
id INTEGER PRIMARY KEY AUTOINCREMENT,
source_id INTEGER NOT NULL,
target_id INTEGER NOT NULL,
relationship_type TEXT NOT NULL,
properties TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (source_id) REFERENCES nodes(id),
FOREIGN KEY (target_id) REFERENCES nodes(id)
);
性能优化建议
PRAGMA journal_mode=WAL;
PRAGMA synchronous=NORMAL;
PRAGMA cache_size=-size_in_kb;
数据同步与一致性
挑战
Redis与SQLite之间的数据同步延迟和一致性问题
同步策略
- • 同步更新策略
- • 缓存失效策略
- • 最终一致性
权衡
根据业务场景权衡性能、复杂度和一致性级别
数据同步流程
-
1
数据变更首先写入SQLite进行持久化
-
2
根据策略同步或异步更新Redis缓存
-
3
对于关联数据(如节点删除),需清理所有相关缓存和索引
API设计与实现
JSON RPC 2.0 API接口设计
请求格式
{
"jsonrpc": "2.0",
"method": "method_name",
"params": {
"param1": "value1",
"param2": "value2"
},
"id": "request_id"
}
成功响应
{
"jsonrpc": "2.0",
"result": {
// 方法调用结果
},
"id": "request_id"
}
API类别 | 方法名称 | 参数 | 返回值/描述 |
---|---|---|---|
节点操作 | createNode | labels, properties | node_id |
getNode | node_id | node object | |
updateNode | node_id, properties, labels | success | |
deleteNode | node_id | success | |
findNodesByLabelAndProperties | label, filter, limit, offset | nodes array | |
边操作 | createRelationship | source_id, target_id, type, properties | relationship_id |
getRelationship | relationship_id | relationship object | |
updateRelationship | relationship_id, properties | success | |
deleteRelationship | relationship_id | success | |
findEdgesByTypeAndProperties | type, filter, limit, offset | edges array | |
图遍历与查询 | getNeighbors | node_id, edgeType, direction | Node[] |
traverse | startNodeId, traversalDescription | Path[] | |
shortestPath | startNodeId, endNodeId, edgeType | Path | |
matchPattern | pattern | Record[] | |
推荐算法 | recommendItemsForUser | userId, algorithm, parameters | Item[] |
recommendUsersForUser | userId, algorithm, parameters | User[] | |
findSimilarNodes | nodeId, similarityMetric, limit | Node[] |
Webman框架集成与路由配置
项目创建与依赖
# 创建Webman项目
composer create-project workerman/webman
# 安装Redis依赖
composer require predis/predis
# 配置环境变量
cp .env.example .env
路由配置
// route/app.php
use Webman\Route;
Route::post('/rpc', [
app\controller\RpcController::class,
'handleRequest'
]);
启动与运行
php start.php start
php start.php start -d
windows.bat
核心图数据库功能实现
高效的图遍历与路径查询
广度优先搜索 (BFS)
从起始节点开始,逐层访问其邻居节点。Redis缓存邻接关系可大幅提升性能。
优化策略
- • Redis Set/Sorted Set存储邻接关系
- • 缓存未命中时回源SQLite查询
- • 查询结果存入Redis
最短路径查询
基于Dijkstra算法(带权图)或BFS(无权图),Redis加速算法执行。
Redis辅助
- • Set存储已访问节点集合
- • Hash记录节点前驱节点
- • 避免重复访问和环路
图遍历性能优化
node:A:neighbors:FOLLOWS
服务器端执行计算逻辑
内存使用、磁盘I/O、计算复杂度
实时推荐算法支持
向量相似度推荐
利用Redis 8.0向量搜索功能,快速找到与用户兴趣向量最相似的物品。
流程
- 1. 物品表示为向量(属性、描述嵌入)
- 2. 建立Redis向量索引
- 3. 用户兴趣表示为向量
- 4. KNN搜索最相似物品
图结构推荐
结合图结构信息,如"朋友喜欢的东西我也可能喜欢"的社交信号。
实现
- • 图遍历找到N度好友
- • 聚合好友喜欢的物品
- • 结合向量相似度排序
- • 基于路径的复杂推荐