完整教程:AI应用生成平台:数据库、缓存与存储

news/2025/10/16 8:55:27/文章来源:https://www.cnblogs.com/lxjshuju/p/19144728

二、数据库、缓存与存储

项目仓库:https://github.com/vasc-language/ai-code-mother

项目预览:https://www.joinoai.cloud

9. AI 零代码应用生成项目中,为什么要从数据库加载对话历史到记忆中?完整流程是怎样的?

为什么需要加载对话历史

1. 上下文连续性

2. 个性化体验

3. 会话恢复

完整流程实现

1. 数据库存储结构

CREATE TABLE chat_history (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
app_id BIGINT NOT NULL,
user_id BIGINT NOT NULL,
message TEXT NOT NULL,
message_type VARCHAR(10) NOT NULL, -- 'USER' 或 'AI'
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_app_id_create_time (app_id, create_time)
);

2. 加载流程

// 在AiCodeGeneratorServiceFactory中的实现
public int loadChatHistoryToMemory(Long appId, MessageWindowChatMemory chatMemory, int maxCount) {
// 1. 从数据库查询历史记录(按时间倒序,限制数量)
QueryWrapper queryWrapper = QueryWrapper.create()
.eq(ChatHistory::getAppId, appId)
.orderBy(ChatHistory::getCreateTime, false)
.limit(1, maxCount);
List<ChatHistory> historyList = this.list(queryWrapper);// 2. 反转列表,确保按时间正序(老的在前,新的在后)historyList = historyList.reversed();// 3. 清理现有缓存,防止重复加载chatMemory.clear();// 4. 按顺序添加到记忆中for (ChatHistory history : historyList) {if (ChatHistoryMessageTypeEnum.USER.getValue().equals(history.getMessageType())) {chatMemory.add(UserMessage.from(history.getMessage()));} else if (ChatHistoryMessageTypeEnum.AI.getValue().equals(history.getMessageType())) {chatMemory.add(AiMessage.from(history.getMessage()));}}return loadedCount;}

3. 记忆管理策略

// 创建带记忆的AI服务
MessageWindowChatMemory chatMemory = MessageWindowChatMemory
.builder()
.id(appId)                          // 每个应用独立的记忆空间
.chatMemoryStore(redisChatMemoryStore) // Redis持久化存储
.maxMessages(20)                    // 最多保留20条消息
.build();
// 从数据库加载历史对话到记忆中
chatHistoryService.loadChatHistoryToMemory(appId, chatMemory, 20);

4. 数据流转过程

用户发起对话 → 检查Redis缓存 → 缓存未命中 → 从MySQL加载历史 →
构建MessageWindowChatMemory → 添加到Redis → AI服务使用记忆 →
生成回复 → 保存新消息到MySQL → 更新Redis缓存

10. AI 零代码应用生成项目中,你如何配置 Caffeine 的缓存策略?

Caffeine缓存配置

1. AI服务实例缓存

// 在AiCodeGeneratorServiceFactory中的配置
private final Cache<String, AiCodeGeneratorService> serviceCache = Caffeine.newBuilder().maximumSize(1000)                    // 最大缓存1000个实例.expireAfterWrite(Duration.ofMinutes(30))  // 写入后30分钟过期.expireAfterAccess(Duration.ofMinutes(10)) // 访问后10分钟过期.removalListener((key, value, cause) -> {log.debug("AI 服务实例被移除,缓存键: {}, 原因: {}", key, cause);}).build();

2. 缓存策略说明

大小限制策略

  • maximumSize(1000): 限制最大缓存条目数,防止内存溢出
  • 基于LRU算法淘汰最少使用的条目

过期策略

  • expireAfterWrite: 写入后过期,适用于数据时效性要求
  • expireAfterAccess: 访问后过期,适用于热点数据保持

监听器配置

  • removalListener: 监控缓存条目移除事件
  • 用于调试和性能分析

3. 缓存使用模式

// 获取缓存的AI服务实例
public AiCodeGeneratorService getAiCodeGeneratorService(long appId, CodeGenTypeEnum codeGenType) {
String cacheKey = buildCacheKey(appId, codeGenType);
// 如果缓存存在直接返回,不存在则创建新实例并缓存
return serviceCache.get(cacheKey, key -> createAiCodeGeneratorService(appId, codeGenType));
}
private String buildCacheKey(long appId, CodeGenTypeEnum codeGenType) {
return appId + "_" + codeGenType.getValue();
}

4. 性能优化考虑

  • 内存效率: 限制缓存大小,避免OOM
  • 并发安全: Caffeine天然支持高并发访问
  • 热点数据: 访问后过期策略保持活跃实例
  • 资源清理: 移除监听器确保资源正确释放

11. 在实现 AI 的对话记录时,为什么选择 Redis 进行持久化?

Redis选择的原因

1. 性能优势

// Redis内存存储,访问速度极快
RedisChatMemoryStore redisChatMemoryStore = RedisChatMemoryStore.builder()
.host(host)
.port(port)
.password(password)
.ttl(ttl)  // 支持TTL自动过期
.build();

优势对比:

  • Redis: 内存存储,微秒级响应
  • MySQL: 磁盘存储,毫秒级响应
  • 文件系统: 磁盘IO,响应时间不稳定

2. 数据结构适配

// LangChain4j的ChatMemoryStore接口天然支持Redis
MessageWindowChatMemory chatMemory = MessageWindowChatMemory
.builder()
.chatMemoryStore(redisChatMemoryStore) // 直接使用Redis存储
.maxMessages(20)
.build();

3. 会话特性匹配

  • 临时性: 对话记忆通常是临时的,Redis的TTL机制完美匹配
  • 高频访问: AI对话过程中需要频繁读取历史消息
  • 结构化: Redis支持复杂数据结构,适合存储消息对象

4. 扩展性考虑

  • 分布式: Redis集群支持水平扩展
  • 持久化: RDB+AOF双重保障数据安全
  • 高可用: 主从复制+哨兵模式保证服务可用性
架构设计

1. 双重存储策略

实时对话记忆: Redis (快速访问)↓
历史记录归档: MySQL (长期存储)

2. 数据生命周期

// 对话过程中的数据流
用户消息 → 保存到MySQL → 加载到Redis → AI处理 →
AI回复 → 保存到MySQL → 更新Redis → 返回用户

3. 缓存策略

  • 写入策略: Write-Through(同时写入Redis和MySQL)
  • 读取策略: Cache-Aside(优先从Redis读取,未命中则从MySQL加载)
  • 过期策略: TTL自动过期 + 手动清理

12. AI 零代码应用生成项目中,Redis 主要用在哪些场景?

Redis使用场景详解

1. 对话记忆存储

// LangChain4j集成的Redis对话存储
@Bean
public RedisChatMemoryStore redisChatMemoryStore() {
return RedisChatMemoryStore.builder()
.host(host)
.port(port)
.password(password)
.ttl(ttl)
.build();
}
  • 用途: 存储AI对话的上下文记忆
  • 特点: 支持TTL自动过期,高频读写
  • 数据结构: Hash结构存储消息列表

2. 用户会话管理

// Spring Session集成Redis
// 在pom.xml中配置
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency>
  • 用途: 存储用户登录状态和会话信息
  • 特点: 支持分布式会话共享
  • 数据结构: String/Hash存储会话数据

3. 应用数据缓存

// Spring Cache集成Redis
@Cacheable(
value = "good_app_page",
key = "T(com.spring.aicodemother.utils.CacheKeyUtils).generateKey(#appQueryRequest)",
condition = "#appQueryRequest.pageNum <= 10"
)
public BaseResponse<Page<AppVO>> listGoodAppVOByPage(@RequestBody AppQueryRequest appQueryRequest) {// 精选应用列表缓存}
  • 用途: 缓存热点应用数据,减少数据库压力
  • 配置: 5分钟过期时间
  • 优化: 只缓存前10页数据

4. 分布式限流

// 使用Redisson实现分布式限流
@Before("@annotation(rateLimit)")
public void doBefore(JoinPoint point, RateLimit rateLimit) {
String key = generateRateLimitKey(point, rateLimit);
RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);
// 设置限流参数
rateLimiter.trySetRate(RateType.OVERALL,
rateLimit.rate(),
rateLimit.rateInterval(),
RateIntervalUnit.SECONDS);
// 尝试获取令牌
if (!rateLimiter.tryAcquire(1)) {
throw new BusinessException(ErrorCode.TOO_MANY_REQUEST);
}
}
  • 用途: API接口限流,防止恶意请求
  • 算法: 令牌桶算法
  • 粒度: 支持用户级、IP级、接口级限流

5. 缓存管理配置

@Bean
public CacheManager cacheManager() {
RedisCacheConfiguration defaultConfig = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(30))  // 默认30分钟过期
.disableCachingNullValues()        // 禁用null值缓存
.serializeKeysWith(RedisSerializationContext.SerializationPair
.fromSerializer(new StringRedisSerializer()));
return RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(defaultConfig)
// 针对不同业务配置不同过期时间
.withCacheConfiguration("good_app_page",
defaultConfig.entryTtl(Duration.ofMinutes(5)))
.build();
}
Redis在项目中的架构角色

1. 性能层

  • 作为MySQL的缓存层,提升查询性能
  • 减少数据库压力,提高系统吞吐量

2. 会话层

  • 管理用户登录状态
  • 支持分布式部署的会话共享

3. 限流层

  • 实现分布式限流
  • 保护系统免受恶意攻击

4. 记忆层

  • 存储AI对话上下文
  • 支持智能对话的连续性

总结:
Redis在AI零代码生成项目中扮演着多重角色,从性能优化到业务功能支撑,是系统架构中不可或缺的组件。其高性能、丰富的数据结构和完善的生态支持,使其成为处理实时数据和缓存场景的最佳选择。

联系我们

如果您有任何问题或建议,请随时联系我们:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/937996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CCPC2022绵阳 游记(VP)

主包犯蠢浪费 $150min$,从铜首掉下铜中,$5t$ 罚时 $692$。省流 主包犯蠢浪费 \(150min\),从铜首掉下铜中,\(5t\) 罚时 \(692\)。10.14 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 晚上叶神有课,提前到 …

2025 年电缆桥架生产厂家最新推荐排行榜:含北方 / 河北 / 瓦楞 / 防火 / 模压 / 镀锌桥架品牌及合作案例盘点

在电力传输、建筑基建等关键领域,电缆桥架作为线路支撑核心设备,其质量直接决定工程安全与运维稳定性。当前市场中,部分厂家存在工艺粗糙、防腐性能不足、承重不达标等问题,导致桥架寿命缩短、线路故障频发,增加企…

详细介绍:[创业之路-640]:通信行业供应链 - 通信网的发展趋势:IP化统一 、云网融合 、算网协同 、FMC(固定移动融合)、空天地一体化

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年胰岛素泵厂家最新推荐排行榜:国产实力厂家技术、口碑及全场景适配方案全景解析软针植入/平衡式留置针/无异物感胰岛素泵厂家推荐

随着糖尿病患者对精准控糖需求的不断提升,胰岛素泵作为核心治疗设备,其技术迭代速度与产品适配性备受关注。当前市场中,既有深耕多年的成熟品牌持续创新,也有新兴企业凭借差异化技术崭露头角,但产品质量、输注精度…

2025 年国内磨床厂家最新推荐榜:聚焦平面磨床外圆磨床等品类,助力企业精准选优质设备

当前磨床市场品类繁杂,平面磨床、外圆磨床、数控磨床等产品质量差异显著,众多企业在选购时常陷入困境。部分厂家缺乏规范质量管控,设备精度与稳定性不足,难以适配汽车、军工、工程机械等行业高标准加工需求;还有厂…

2025 年加工中心厂家最新推荐榜:覆盖立式、卧式、龙门及 850 等多规格设备,帮采购方高效选实力厂商

当前加工中心市场厂商数量繁杂,产品质量、技术实力及服务水平差异显著,汽车摩托车、军工、工程机械等行业采购方在挑选设备时,常因信息不对称难以精准定位符合需求的品牌。部分厂商技术研发薄弱、产品同质化严重,无…

进程的内存管理

> 「C语言进程虚拟内存」:栈、堆、数据段、代码段各自职责、生命周期、典型API 。一、虚拟内存总览:四个大区 任何一个程序,正常运行都需要内存资源,用来存放诸如变量、常量、函数代码等等。这些不同的内容,所…

深入理解Java内存模型与volatile关键字:从理论到实践

1. 引言:为什么需要理解内存模型? 在多核处理器成为主流的今天,并发编程已成为每个Java程序员的必备技能。然而,编写正确的并发程序远比单线程程序复杂,主要原因在于我们需要处理两个核心问题:线程之间如何通信?…

完整教程:【stm32】cube固件解析和放入工程(HAL_F4)

完整教程:【stm32】cube固件解析和放入工程(HAL_F4)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

312、金缕衣

312、金缕衣312、金缕衣 唐●杜秋娘 劝君莫惜金缕衣,劝君惜取少年时。 花开堪折直须折,莫待无花空折枝。【现代诗意译】 我劝你啊 不要看重华丽衣裳 但是 一定要珍惜 青春年少美好时光花开宜折的时候 就要立即把它摘…

使用 Visual Studio 快速创建 NuGet 程序包并发布到 NuGet 官网

前言 在前面的 .NET EF Core 快速入门实战教程章节中我们创建了一个名为 EFCoreGenericRepository 的 .NET 9 通用仓储类库,今天我们来把这个 EF Core 通用仓储类库打包成 NuGet 程序包并发布到 NuGet 官网(https://…

反配容斥

反配容斥模拟赛考了这个 trick,感觉挺牛的。 直接放题。 题意 给定一个长度为 \(n\) 的序列 \(\{ a_i \}\),令全集 \(U = \{ 1,2,3,\cdots,n \}\),定义子集 \(S\) 的权值 \(g(S)=1+\oplus_{i\in S} a_i\)。 我们称集…

怎么激活win11?笔记本重装系统后怎么激活Windows?

我可以肯定99%的人并不完全了解Windows的几种激活方式,或者知其一,不知其二。 windows10 突然右下角出现激活windows? 光广告就能搜索出一大堆,必定广告是要收费的,说明市场是有的,但我这是分享的是免费使用教程…

AVG Clear:彻底卸载AVG产品的专业工具

AVG Clear是一款专业的AVG产品卸载工具,当传统卸载方式失效时,可自动扫描并彻底删除AVG相关的文件、注册表项和安装文件,确保系统完全清理。适用于Windows 10/11系统。AVG Clear 下载 立即在作者网站下载 作者: AV…

深入解析:安卓 WPS Office v18.21.0 国际版

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

现代 PHP8+ 实战特性介绍 Enums、Fibers 和 Attributes

现代 PHP8+ 实战特性介绍 Enums、Fibers 和 Attributes PHP 一直是 Web 开发领域使用最广泛的语言之一。这些年来,它的特性不断演进,每个版本都让语言变得更有表现力、更高效、对开发者更友好。如果你一直在关注最近…

用【WPF+Dlib68】实现 侧脸 眼镜虚拟佩戴 - 用平面图表现空间视觉 - 行人-

一个精致的眼镜3D模型,在模型网站中的售价几百人民币是非常常见的,它的制作成本以及制作周期,对于实际落地的项目来说是一个非常大的阻碍。于是我尝试使用 平面眼镜图 来表现 眼镜在佩戴时的空间感 ,尤其是 侧脸 时…

比 26ai 更震撼的,是 Oracle AI 向量搜索改写的生命答案

比 "26ai" 更震撼的,是 Oracle AI 向量搜索改写的生命答案2025-10-16 08:02 AlfredZhao 阅读(0) 评论(0) 收藏 举报在 Oracle AI World 上,“26ai” 的名字成为外界讨论的焦点,引发广泛好奇与热议。 …

科学背景如何赋能云计算业务战略

本文讲述了一位神经科学博士如何将科研背景应用于云计算业务发展,通过理解科研工作者需求,帮助企业客户将研究负载迁移至云端,加速从原始数据到研究成果的转化过程。科学背景如何赋能云计算业务战略 安德烈亚皮尔斯…