使用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.测试即可

相关推荐
打呵欠的猫5 小时前
一个 Hook 让 AI 每次写文件前自动检查编码规范,违规代码再也提交不进来
前端·ai编程·代码规范
NingBo5 小时前
让非技术人员也能一键使用 DeepSeek Harness
ai编程·deepseek
全栈弄潮儿5 小时前
真实案例:用 AI 重构一段难维护的旧代码
aigc·openai·ai编程
小夏coding5 小时前
从"一把梭"到"精妙拆解" —— 滑动窗口计时框架的设计演进
java·后端
这个DBA有点耶6 小时前
从MySQL 5.7到8.0:JSON查询性能差在哪?虚拟列索引vs多值索引怎么选
数据库·mysql·架构
胡写代码6 小时前
数据库审计字段,别再每张表各写一套了——我统一成这 6 个字段
数据库
MacroZheng6 小时前
同事问我:"Claude Code经常失忆,不怕它把项目搞炸?",我:"怕,三个Markdown文件给它装个永不丢失的外置大脑!"
java·人工智能·后端
十年Java程序媛8 小时前
深度实战:JDK21 虚拟线程 + HikariCP 生产正确配比、坑点、监控全套
java·spring boot
Web3_Basketball8 小时前
1200个Agent如何串通作弊?三道护栏让它无处遁形
ai编程
xiaoqiMikko8 小时前
有人在搜一个不存在的 Tomcat 版本
java·tomcat