抽象网络节点连接图

基于RedisSQLitePHP
图数据库系统设计与实现

构建轻量级、高性能的图数据库解决方案,支持社交网络、知识图谱与实时推荐系统

核心优势

  • Redis 8.0内存加速与向量搜索
  • SQLite持久化存储与SQL查询
  • Webman框架高性能API服务

设计目标

μs级
图遍历响应
实时
推荐计算

系统架构设计

整体架构概述

本图数据库系统旨在通过结合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协议

数据流与交互

1

客户端请求

客户端通过HTTP协议向Webman框架发送JSON RPC 2.0格式的请求

2

接入层处理

Webman框架接收请求,分发给相应的PHP处理程序进行解析和初步处理

3

缓存层交互

读请求先查询Redis缓存,命中直接返回;未命中则请求持久层SQLite3

4

持久层交互

当缓存未命中时,PHP处理程序与SQLite3数据库交互,执行SQL查询

5

数据处理与计算

获取原始数据后,PHP处理程序执行图计算逻辑(路径查找、模式匹配等)

6

结果返回

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)
);

性能优化建议

启用WAL模式:PRAGMA journal_mode=WAL;
调整同步设置:PRAGMA synchronous=NORMAL;
增大缓存大小:PRAGMA cache_size=-size_in_kb;

数据同步与一致性

挑战

Redis与SQLite之间的数据同步延迟和一致性问题

同步策略

  • • 同步更新策略
  • • 缓存失效策略
  • • 最终一致性

权衡

根据业务场景权衡性能、复杂度和一致性级别

数据同步流程

  1. 1
    数据变更首先写入SQLite进行持久化
  2. 2
    根据策略同步或异步更新Redis缓存
  3. 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
windows.bat

核心图数据库功能实现

高效的图遍历与路径查询

广度优先搜索 (BFS)

从起始节点开始,逐层访问其邻居节点。Redis缓存邻接关系可大幅提升性能。

优化策略
  • • Redis Set/Sorted Set存储邻接关系
  • • 缓存未命中时回源SQLite查询
  • • 查询结果存入Redis

最短路径查询

基于Dijkstra算法(带权图)或BFS(无权图),Redis加速算法执行。

Redis辅助
  • • Set存储已访问节点集合
  • • Hash记录节点前驱节点
  • • 避免重复访问和环路

图遍历性能优化

边类型过滤
node:A:neighbors:FOLLOWS
Lua脚本
服务器端执行计算逻辑
平衡优化
内存使用、磁盘I/O、计算复杂度

实时推荐算法支持

向量相似度推荐

利用Redis 8.0向量搜索功能,快速找到与用户兴趣向量最相似的物品。

流程
  1. 1. 物品表示为向量(属性、描述嵌入)
  2. 2. 建立Redis向量索引
  3. 3. 用户兴趣表示为向量
  4. 4. KNN搜索最相似物品

图结构推荐

结合图结构信息,如"朋友喜欢的东西我也可能喜欢"的社交信号。

实现
  • • 图遍历找到N度好友
  • • 聚合好友喜欢的物品
  • • 结合向量相似度排序
  • • 基于路径的复杂推荐

推荐算法整合流程

1
向量搜索
Redis向量索引KNN查询
2
图关系分析
SQLite查询或Redis图操作进行关系过滤
3
结果整合
PHP逻辑协调,结合内容相似度和协同行为