RedisChatMemoryStore.java 1.49 KB
package com.xly.config;

import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.ChatMessageDeserializer;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 旧版消息记忆({@code chat:mem:{convId}})的**遗留只读**兼容层。
 *
 * <p>事实源已迁移到事件日志({@link com.xly.service.LedgerService},{@code chat:ledger:}),
 * 本类不再写入:只保留旧会话的历史兼容读取与删除级联,30 天 TTL 到期后自然淘汰,届时可整体删除。
 */
@Component
public class RedisChatMemoryStore {

    private static final String PREFIX = "chat:mem:";

    private final StringRedisTemplate redis;

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

    public List<ChatMessage> getMessages(Object memoryId) {
        String json = redis.opsForValue().get(PREFIX + memoryId);
        if (json == null || json.isBlank()) {
            return new ArrayList<>();
        }
        return ChatMessageDeserializer.messagesFromJson(json);
    }

    public boolean exists(Object memoryId) {
        try {
            return Boolean.TRUE.equals(redis.hasKey(PREFIX + memoryId));
        } catch (Exception e) {
            return true; // 读失败时不误判为「可清理」
        }
    }

    public void deleteMessages(Object memoryId) {
        redis.delete(PREFIX + memoryId);
    }
}