package com.vincent.rsf.server.ai.store; import com.fasterxml.jackson.core.type.TypeReference; import com.vincent.rsf.server.ai.config.AiDefaults; import com.vincent.rsf.server.ai.dto.AiChatMemoryDto; import com.vincent.rsf.server.ai.dto.AiChatRuntimeDto; import com.vincent.rsf.server.ai.dto.AiChatSessionDto; import com.vincent.rsf.server.ai.store.support.AiRedisExecutor; import com.vincent.rsf.server.ai.store.support.AiRedisIndexSupport; import com.vincent.rsf.server.ai.store.support.AiRedisKeys; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import java.util.List; @Component @RequiredArgsConstructor public class AiConversationCacheStore { private final AiRedisExecutor aiRedisExecutor; private final AiRedisIndexSupport aiRedisIndexSupport; private final AiRedisKeys aiRedisKeys; public AiChatRuntimeDto getRuntime(Long tenantId, Long userId, String promptCode, Long sessionId, Long aiParamId) { return aiRedisExecutor.readJson(aiRedisKeys.buildRuntimeKey(tenantId, userId, promptCode, sessionId, aiParamId), AiChatRuntimeDto.class); } public void cacheRuntime(Long tenantId, Long userId, String promptCode, Long sessionId, Long aiParamId, AiChatRuntimeDto runtime) { String key = aiRedisKeys.buildRuntimeKey(tenantId, userId, promptCode, sessionId, aiParamId); aiRedisExecutor.writeJson(key, runtime, AiDefaults.RUNTIME_CACHE_TTL_SECONDS); rememberConversationKey(tenantId, userId, key); aiRedisIndexSupport.remember(aiRedisKeys.buildTenantRuntimeIndexKey(tenantId), key); } public AiChatMemoryDto getMemory(Long tenantId, Long userId, String promptCode, Long sessionId) { return aiRedisExecutor.readJson(aiRedisKeys.buildMemoryKey(tenantId, userId, promptCode, sessionId), AiChatMemoryDto.class); } public void cacheMemory(Long tenantId, Long userId, String promptCode, Long sessionId, AiChatMemoryDto memory) { String key = aiRedisKeys.buildMemoryKey(tenantId, userId, promptCode, sessionId); aiRedisExecutor.writeJson(key, memory, AiDefaults.MEMORY_CACHE_TTL_SECONDS); rememberConversationKey(tenantId, userId, key); } public List getSessionList(Long tenantId, Long userId, String promptCode, String keyword) { return aiRedisExecutor.readJson(aiRedisKeys.buildSessionsKey(tenantId, userId, promptCode, keyword), new TypeReference>() { }); } public void cacheSessionList(Long tenantId, Long userId, String promptCode, String keyword, List sessions) { String key = aiRedisKeys.buildSessionsKey(tenantId, userId, promptCode, keyword); aiRedisExecutor.writeJson(key, sessions, AiDefaults.SESSION_LIST_CACHE_TTL_SECONDS); rememberConversationKey(tenantId, userId, key); } public void evictUserConversationCaches(Long tenantId, Long userId) { aiRedisIndexSupport.deleteTrackedKeys(aiRedisKeys.buildConversationIndexKey(tenantId, userId)); } public void evictTenantRuntimeCaches(Long tenantId) { aiRedisIndexSupport.deleteTrackedKeys(aiRedisKeys.buildTenantRuntimeIndexKey(tenantId)); } private void rememberConversationKey(Long tenantId, Long userId, String key) { aiRedisIndexSupport.remember(aiRedisKeys.buildConversationIndexKey(tenantId, userId), key); } }