求助|这个类现在我要调用1000万次他会很耗时,求优化

简介

是一个单服务器部署的一个项目

代码介绍

这个Java类 UniqueIdGenerator 的主要目的是生成一个唯一的8位数ID。

然后通过调用 appuserMapper.selectYzaAppuserByMainnum(uniqueId+"") 来检查数据库中是否存在该ID。如果不存在,直接返回这个ID;如果存在,则递归调用 generateUniqueId() 方法重新生成。

这个类现在我要调用1000万次他会很耗时并且每一个都会查询一下数据库,这使调用数据库非常频繁,各位大佬有没有办法,帮我优化一下。给跪了

@Service
public class UniqueIdGenerator {

@Autowired
private YzaAppuserMapper appuserMapper;

private static final long START_TIMESTAMP = 1577836800000L;
private static final int BIT_SIZE = 8;
private static final long MAX_NUM = (1 << BIT_SIZE) - 1;

private static Random random = new Random();

public synchronized String generateUniqueId() {
    long currentTimestamp = System.currentTimeMillis() - START_TIMESTAMP;
    long randomNum = random.nextInt((int) MAX_NUM + 1);
    long uniqueId = (currentTimestamp << BIT_SIZE) | randomNum;
    if (uniqueId<0){
        uniqueId = uniqueId * -1L;
    }
    //查询看他有没有
    YzaAppuser appuser = appuserMapper.selectYzaAppuserByMainnum(uniqueId+"");
    if (Objects.isNull(appuser)){
        //如果为空 直接生成
        return uniqueId+"";
    }
    return generateUniqueId();
}

}

#23届找工作求助阵地##我的失利项目复盘#
全部评论
考虑使用全局的布隆过滤器过滤已有的id,或者redis来存全局id
1 回复 分享
发布于 2023-12-08 10:45 北京
单机的话直接在本地内存给一个能标识八位数的bitmap用于快速去重(大概需要10MB内存),如果要持久化的话考虑redis的bitmap
1 回复 分享
发布于 2023-12-08 10:39 广东

相关推荐

如题,只有过一段小厂实习经历,秋招会很吃亏吗?
KarlAllen:我也没大厂实习。今年大厂又扩招实习生。不知道秋招要怎么办了
点赞 评论 收藏
分享
那一天的Java_Java起来:他本来公司就是做这个的,不就是正常的游戏客户端和服务器开发,软硬件联动,有啥恶心不恶心的,提前告诉你就是怕你接受不了,接受不了就没必要再往后走流程浪费时间,虽然这公司是一坨。
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务