使用redis+springboot+langchain4j实现AI对话持久化

1.添加redis依赖

复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.配置配置文件.yml

复制代码
spring:
  data:
    redis:
      # Redis 服务器地址
      host: localhost
      # Redis 服务器端口
      port: 6379
      # 如果你设置了密码,填在这里(默认通常没有密码,可留空)
      # spring.data.redis.password=123456
      # 数据库索引(默认为0)
      database: 0

3.启动redis,编写RedisChatMemoryStore类,实现了ChatMemoryStore接口:

复制代码
@Component
public class RedisChatMemoryStore implements ChatMemoryStore {

    private final StringRedisTemplate redisTemplate;

    // 定义一个 Key 前缀,防止和其他 Redis 数据冲突
    private static final String KEY_PREFIX = "chat:memory:";
    // 定义数据过期时间,例如 7 天后自动删除闲置的聊天记录
    private static final Duration TTL = Duration.ofDays(7);

    public RedisChatMemoryStore(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Override
    public List<ChatMessage> getMessages(Object memoryId) {
        // 1. 拼接 Key
        String key = KEY_PREFIX + memoryId;

        // 2. 从 Redis 获取 JSON 字符串
        String json = redisTemplate.opsForValue().get(key);

        // 3. 如果为空,返回空列表;否则反序列化
        if (json == null || json.isEmpty()) {
            return new ArrayList<>();
        }
        return messagesFromJson(json);
    }

    @Override
    public void updateMessages(Object memoryId, List<ChatMessage> messages) {
        String key = KEY_PREFIX + memoryId;
        String json = messagesToJson(messages);

        // 4. 保存到 Redis,并设置过期时间
        // set(key, value, timeout)
        redisTemplate.opsForValue().set(key, json, TTL);
    }

    @Override
    public void deleteMessages(Object memoryId) {
        String key = KEY_PREFIX + memoryId;
        redisTemplate.delete(key);
    }
}

4.工厂类中在创建ChatMemory时添加上ChatMemoryStore属性:

复制代码
@Bean
public AiCodeHelperService aiCodeHelperService(){
  ChatMemory chatMemory=MessageWindowChatMemory.builder()
          .chatMemoryStore(redisChatMemoryStore)
          .id("rance-global")
          .maxMessages(10)
          .build();

  AiCodeHelperService build = AiServices.builder(AiCodeHelperService.class)
          .chatMemory(chatMemory)
          .chatModel(qwenChatModel)
          .build();
  return build;
}

5.测试即可

相关推荐
数智化管理手记2 小时前
精益生产中的TPM管理是什么?一文破解设备零故障的密码
服务器·网络·数据库·低代码·制造·源代码管理·精益工程
翊谦2 小时前
Java Agent开发 Milvus 向量数据库安装
java·数据库·milvus
晓晓hh2 小时前
JavaSE学习——迭代器
java·开发语言·学习
查古穆3 小时前
栈-有效的括号
java·数据结构·算法
Java面试题总结3 小时前
Spring - Bean 生命周期
java·spring·rpc
硅基诗人3 小时前
每日一道面试题 10:synchronized 与 ReentrantLock 的核心区别及生产环境如何选型?
java
014-code3 小时前
String.intern() 到底干了什么
java·开发语言·面试
難釋懷3 小时前
OpenResty实现Redis查询
数据库·redis·openresty
光影少年3 小时前
AI Agent智能体开发
人工智能·aigc·ai编程
别抢我的锅包肉4 小时前
【MySQL】第四节 - 多表查询、多表关系全解析
数据库·mysql·datagrip