|
@@ -93,9 +93,9 @@ public class GeminiServiceImpl implements GeminiService {
|
|
|
GeminiUserView view = GeminiUserView.builder()
|
|
GeminiUserView view = GeminiUserView.builder()
|
|
|
.skuName(goodsDonSku.getSubTitle())
|
|
.skuName(goodsDonSku.getSubTitle())
|
|
|
.expireTime(geminiUser.getExpireTime())
|
|
.expireTime(geminiUser.getExpireTime())
|
|
|
|
|
+ .userToken(geminiUser.getUserToken())
|
|
|
.limitNum(geminiUser.getLimitNum())
|
|
.limitNum(geminiUser.getLimitNum())
|
|
|
.limitTime(geminiUser.getLimitTime())
|
|
.limitTime(geminiUser.getLimitTime())
|
|
|
- .use(Math.min(geminiUser.getLimitNum(), getConversationCount(geminiUser.getUserToken(), geminiUser.getLimitTime())))
|
|
|
|
|
.build();
|
|
.build();
|
|
|
return view;
|
|
return view;
|
|
|
} else {
|
|
} else {
|
|
@@ -158,54 +158,6 @@ public class GeminiServiceImpl implements GeminiService {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- @Override
|
|
|
|
|
- public Long getConversationCount(String userToken, Long limitTime) {
|
|
|
|
|
- String key = "gemini:conversation:limit:" + userToken;
|
|
|
|
|
- long currentTimeMillis = System.currentTimeMillis();
|
|
|
|
|
- long windowStartMillis = currentTimeMillis - (limitTime * 60 * 60) * 1000;
|
|
|
|
|
-
|
|
|
|
|
- // 清除时间窗口之前的请求记录
|
|
|
|
|
- redisService.zRemoveRangeByScore(key, 0, windowStartMillis);
|
|
|
|
|
-
|
|
|
|
|
- Long count = redisService.zCard(key);
|
|
|
|
|
- return count != null ? count : 0L;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- @Override
|
|
|
|
|
- public ConversationLimitResponse conversationLimit(String userToken, GeminiUser user) {
|
|
|
|
|
- return isConversationAllowed(userToken, user.getLimitNum(), user.getLimitTime());
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * 滑动窗口限制检查
|
|
|
|
|
- */
|
|
|
|
|
- private ConversationLimitResponse isConversationAllowed(String userToken, int limit, Long limitTime) {
|
|
|
|
|
- String key = "gemini:conversation:limit:" + userToken;
|
|
|
|
|
- long currentTimeMillis = System.currentTimeMillis();
|
|
|
|
|
- long windowStartMillis = currentTimeMillis - (limitTime * 60 * 60) * 1000;
|
|
|
|
|
-
|
|
|
|
|
- ConversationLimitResponse response = new ConversationLimitResponse();
|
|
|
|
|
-
|
|
|
|
|
- // 清除时间窗口之前的请求记录
|
|
|
|
|
- redisService.zRemoveRangeByScore(key, 0, windowStartMillis);
|
|
|
|
|
-
|
|
|
|
|
- Long currentSize = redisService.zCard(key);
|
|
|
|
|
- if (currentSize != null && currentSize >= limit) {
|
|
|
|
|
- // 超过限制,拒绝请求
|
|
|
|
|
- Set<Object> times = redisService.zRangeByScore(key, 0, currentTimeMillis, 0, 1);
|
|
|
|
|
- Long oldestTime = (Long) times.stream().findFirst().orElse(null);
|
|
|
|
|
- if (oldestTime != null) {
|
|
|
|
|
- long nextAvailableTime = oldestTime + (limitTime * 60 * 60 * 1000);
|
|
|
|
|
- response.setNextAvailableTime(nextAvailableTime);
|
|
|
|
|
- }
|
|
|
|
|
- response.setLimited(true);
|
|
|
|
|
- return response;
|
|
|
|
|
- } else {
|
|
|
|
|
- response.setLimited(false);
|
|
|
|
|
- return response;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
/**
|
|
/**
|
|
|
* Gemini镜像端API域名
|
|
* Gemini镜像端API域名
|
|
|
*/
|
|
*/
|