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

相关推荐
无限码力3 小时前
华为OD技术面真题 - 数据库MySQL - 3
数据库·mysql·华为od·八股文·华为od技术面八股文
heartbeat..3 小时前
Redis 中的锁:核心实现、类型与最佳实践
java·数据库·redis·缓存·并发
Prince-Peng3 小时前
技术架构系列 - 详解Redis
数据结构·数据库·redis·分布式·缓存·中间件·架构
虾说羊3 小时前
redis中的哨兵机制
数据库·redis·缓存
_F_y3 小时前
MySQL视图
数据库·mysql
2301_790300963 小时前
Python单元测试(unittest)实战指南
jvm·数据库·python
3 小时前
java关于内部类
java·开发语言
好好沉淀3 小时前
Java 项目中的 .idea 与 target 文件夹
java·开发语言·intellij-idea
gusijin3 小时前
解决idea启动报错java: OutOfMemoryError: insufficient memory
java·ide·intellij-idea
To Be Clean Coder3 小时前
【Spring源码】createBean如何寻找构造器(二)——单参数构造器的场景
java·后端·spring