refactor(ai-web): 优化id的生成
This commit is contained in:
@@ -0,0 +1,74 @@
|
|||||||
|
package com.lanyuanxiaoyao.service.ai.core.configuration;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用雪花算法作为ID生成器
|
||||||
|
*
|
||||||
|
* @author lanyuanxiaoyao
|
||||||
|
* @date 2024-11-14
|
||||||
|
*/
|
||||||
|
public class SnowflakeId {
|
||||||
|
/**
|
||||||
|
* 起始的时间戳
|
||||||
|
*/
|
||||||
|
private final static long START_TIMESTAMP = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 序列号占用的位数
|
||||||
|
*/
|
||||||
|
private final static long SEQUENCE_BIT = 11;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 序列号最大值
|
||||||
|
*/
|
||||||
|
private final static long MAX_SEQUENCE_BIT = ~(-1 << SEQUENCE_BIT);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 时间戳值向左位移
|
||||||
|
*/
|
||||||
|
private final static long TIMESTAMP_OFFSET = SEQUENCE_BIT;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 序列号
|
||||||
|
*/
|
||||||
|
private static long sequence = 0;
|
||||||
|
/**
|
||||||
|
* 上一次时间戳
|
||||||
|
*/
|
||||||
|
private static long lastTimestamp = -1;
|
||||||
|
|
||||||
|
public static synchronized long next() {
|
||||||
|
long currentTimestamp = nowTimestamp();
|
||||||
|
if (currentTimestamp < lastTimestamp) {
|
||||||
|
throw new RuntimeException("Clock have moved backwards.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentTimestamp == lastTimestamp) {
|
||||||
|
// 相同毫秒内, 序列号自增
|
||||||
|
sequence = (sequence + 1) & MAX_SEQUENCE_BIT;
|
||||||
|
// 同一毫秒的序列数已经达到最大
|
||||||
|
if (sequence == 0) {
|
||||||
|
currentTimestamp = nextTimestamp();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 不同毫秒内, 序列号置为0
|
||||||
|
sequence = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastTimestamp = currentTimestamp;
|
||||||
|
return (currentTimestamp - START_TIMESTAMP) << TIMESTAMP_OFFSET | sequence;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static long nextTimestamp() {
|
||||||
|
long milli = nowTimestamp();
|
||||||
|
while (milli <= lastTimestamp) {
|
||||||
|
milli = nowTimestamp();
|
||||||
|
}
|
||||||
|
return milli;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static long nowTimestamp() {
|
||||||
|
return Instant.now().toEpochMilli();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@ import lombok.Data;
|
|||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class Group {
|
public class Group {
|
||||||
private String id;
|
private Long id;
|
||||||
private String name;
|
private String name;
|
||||||
private String status;
|
private String status;
|
||||||
private Long createdTime;
|
private Long createdTime;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.lanyuanxiaoyao.service.ai.web.entity;
|
package com.lanyuanxiaoyao.service.ai.web.entity.context;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -8,8 +8,8 @@ import lombok.Data;
|
|||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class KnowledgeVO {
|
public class KnowledgeVO {
|
||||||
private String id;
|
private Long id;
|
||||||
private String vectorSourceId;
|
private Long vectorSourceId;
|
||||||
private String name;
|
private String name;
|
||||||
private String strategy;
|
private String strategy;
|
||||||
private Long size;
|
private Long size;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.lanyuanxiaoyao.service.ai.web.service;
|
package com.lanyuanxiaoyao.service.ai.web.service;
|
||||||
|
|
||||||
import club.kingon.sql.builder.SqlBuilder;
|
import club.kingon.sql.builder.SqlBuilder;
|
||||||
import cn.hutool.core.util.IdUtil;
|
import com.lanyuanxiaoyao.service.ai.core.configuration.SnowflakeId;
|
||||||
import com.lanyuanxiaoyao.service.ai.web.entity.vo.DataFileVO;
|
import com.lanyuanxiaoyao.service.ai.web.entity.vo.DataFileVO;
|
||||||
import com.lanyuanxiaoyao.service.common.Constants;
|
import com.lanyuanxiaoyao.service.common.Constants;
|
||||||
import org.springframework.jdbc.core.JdbcTemplate;
|
import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
@@ -44,7 +44,7 @@ public class DataFileService {
|
|||||||
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public Long initialDataFile(String filename) {
|
public Long initialDataFile(String filename) {
|
||||||
long id = IdUtil.getSnowflakeNextId();
|
long id = SnowflakeId.next();
|
||||||
template.update(
|
template.update(
|
||||||
SqlBuilder.insertInto(DATA_FILE_TABLE_NAME, "id", "filename")
|
SqlBuilder.insertInto(DATA_FILE_TABLE_NAME, "id", "filename")
|
||||||
.values()
|
.values()
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import cn.hutool.core.io.FileUtil;
|
|||||||
import cn.hutool.core.lang.Pair;
|
import cn.hutool.core.lang.Pair;
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.lanyuanxiaoyao.service.ai.web.entity.EmbeddingContext;
|
|
||||||
import com.lanyuanxiaoyao.service.ai.web.entity.Knowledge;
|
import com.lanyuanxiaoyao.service.ai.web.entity.Knowledge;
|
||||||
|
import com.lanyuanxiaoyao.service.ai.web.entity.context.EmbeddingContext;
|
||||||
import com.lanyuanxiaoyao.service.ai.web.entity.vo.DataFileVO;
|
import com.lanyuanxiaoyao.service.ai.web.entity.vo.DataFileVO;
|
||||||
import com.lanyuanxiaoyao.service.ai.web.service.knowledge.GroupService;
|
import com.lanyuanxiaoyao.service.ai.web.service.knowledge.GroupService;
|
||||||
import com.lanyuanxiaoyao.service.ai.web.service.knowledge.KnowledgeBaseService;
|
import com.lanyuanxiaoyao.service.ai.web.service.knowledge.KnowledgeBaseService;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package com.lanyuanxiaoyao.service.ai.web.service.knowledge;
|
|||||||
import club.kingon.sql.builder.SqlBuilder;
|
import club.kingon.sql.builder.SqlBuilder;
|
||||||
import club.kingon.sql.builder.entry.Alias;
|
import club.kingon.sql.builder.entry.Alias;
|
||||||
import club.kingon.sql.builder.entry.Column;
|
import club.kingon.sql.builder.entry.Column;
|
||||||
import cn.hutool.core.util.IdUtil;
|
import com.lanyuanxiaoyao.service.ai.core.configuration.SnowflakeId;
|
||||||
import com.lanyuanxiaoyao.service.ai.web.entity.Group;
|
import com.lanyuanxiaoyao.service.ai.web.entity.Group;
|
||||||
import com.lanyuanxiaoyao.service.common.Constants;
|
import com.lanyuanxiaoyao.service.common.Constants;
|
||||||
import io.qdrant.client.ConditionFactory;
|
import io.qdrant.client.ConditionFactory;
|
||||||
@@ -28,7 +28,7 @@ public class GroupService {
|
|||||||
public static final String GROUP_TABLE_NAME = Constants.DATABASE_NAME + ".service_ai_group";
|
public static final String GROUP_TABLE_NAME = Constants.DATABASE_NAME + ".service_ai_group";
|
||||||
private static final RowMapper<Group> groupMapper = (rs, row) -> {
|
private static final RowMapper<Group> groupMapper = (rs, row) -> {
|
||||||
Group vo = new Group();
|
Group vo = new Group();
|
||||||
vo.setId(String.valueOf(rs.getLong(1)));
|
vo.setId(rs.getLong(1));
|
||||||
vo.setName(rs.getString(2));
|
vo.setName(rs.getString(2));
|
||||||
vo.setStatus(rs.getString(3));
|
vo.setStatus(rs.getString(3));
|
||||||
vo.setCreatedTime(rs.getTimestamp(4).getTime());
|
vo.setCreatedTime(rs.getTimestamp(4).getTime());
|
||||||
@@ -57,7 +57,7 @@ public class GroupService {
|
|||||||
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public Long add(Long knowledgeId, String name) {
|
public Long add(Long knowledgeId, String name) {
|
||||||
long id = IdUtil.getSnowflakeNextId();
|
long id = SnowflakeId.next();
|
||||||
template.update(
|
template.update(
|
||||||
SqlBuilder.insertInto(GROUP_TABLE_NAME, "id", "knowledge_id", "name", "status")
|
SqlBuilder.insertInto(GROUP_TABLE_NAME, "id", "knowledge_id", "name", "status")
|
||||||
.values()
|
.values()
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package com.lanyuanxiaoyao.service.ai.web.service.knowledge;
|
package com.lanyuanxiaoyao.service.ai.web.service.knowledge;
|
||||||
|
|
||||||
import club.kingon.sql.builder.SqlBuilder;
|
import club.kingon.sql.builder.SqlBuilder;
|
||||||
import cn.hutool.core.util.IdUtil;
|
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.lanyuanxiaoyao.service.ai.core.configuration.SnowflakeId;
|
||||||
import com.lanyuanxiaoyao.service.ai.web.entity.Knowledge;
|
import com.lanyuanxiaoyao.service.ai.web.entity.Knowledge;
|
||||||
import com.lanyuanxiaoyao.service.ai.web.entity.vo.KnowledgeVO;
|
import com.lanyuanxiaoyao.service.ai.web.entity.vo.KnowledgeVO;
|
||||||
import com.lanyuanxiaoyao.service.common.Constants;
|
import com.lanyuanxiaoyao.service.common.Constants;
|
||||||
@@ -79,8 +79,8 @@ public class KnowledgeBaseService {
|
|||||||
throw new RuntimeException("名称已存在");
|
throw new RuntimeException("名称已存在");
|
||||||
}
|
}
|
||||||
|
|
||||||
long id = IdUtil.getSnowflakeNextId();
|
long id = SnowflakeId.next();
|
||||||
long vectorSourceId = IdUtil.getSnowflakeNextId();
|
long vectorSourceId = SnowflakeId.next();
|
||||||
template.update(
|
template.update(
|
||||||
SqlBuilder.insertInto(KNOWLEDGE_TABLE_NAME, "id", "vector_source_id", "name", "strategy")
|
SqlBuilder.insertInto(KNOWLEDGE_TABLE_NAME, "id", "vector_source_id", "name", "strategy")
|
||||||
.values()
|
.values()
|
||||||
@@ -124,8 +124,8 @@ public class KnowledgeBaseService {
|
|||||||
try {
|
try {
|
||||||
Collections.CollectionInfo info = client.getCollectionInfoAsync(String.valueOf(knowledge.getVectorSourceId())).get();
|
Collections.CollectionInfo info = client.getCollectionInfoAsync(String.valueOf(knowledge.getVectorSourceId())).get();
|
||||||
KnowledgeVO vo = new KnowledgeVO();
|
KnowledgeVO vo = new KnowledgeVO();
|
||||||
vo.setId(String.valueOf(knowledge.getId()));
|
vo.setId(knowledge.getId());
|
||||||
vo.setVectorSourceId(String.valueOf(knowledge.getVectorSourceId()));
|
vo.setVectorSourceId(knowledge.getVectorSourceId());
|
||||||
vo.setName(knowledge.getName());
|
vo.setName(knowledge.getName());
|
||||||
vo.setPoints(info.getPointsCount());
|
vo.setPoints(info.getPointsCount());
|
||||||
vo.setSegments(info.getSegmentsCount());
|
vo.setSegments(info.getSegmentsCount());
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import cn.hutool.core.io.FileUtil;
|
|||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.lanyuanxiaoyao.service.ai.web.entity.EmbeddingContext;
|
import com.lanyuanxiaoyao.service.ai.web.entity.context.EmbeddingContext;
|
||||||
import com.yomahub.liteflow.annotation.LiteflowComponent;
|
import com.yomahub.liteflow.annotation.LiteflowComponent;
|
||||||
import com.yomahub.liteflow.annotation.LiteflowMethod;
|
import com.yomahub.liteflow.annotation.LiteflowMethod;
|
||||||
import com.yomahub.liteflow.core.NodeComponent;
|
import com.yomahub.liteflow.core.NodeComponent;
|
||||||
|
|||||||
Reference in New Issue
Block a user