ID生成器

ID生成器


资料


如果单表,可以借助于mysql自带的id生成器每次自增+1的方式来生成主键id。

如果分库分表,需要提前在外部生成id,然后将记录插入到对应的分表中。

其实原理很简单,只需实现一个id批量生成查询器即可,大概步骤:

a)本地引入一个client二方包,当有记录要插入数据库表时,调用nextId方法生成一个id,由于是提前分配的,大多数情况下从本地cache取,如果分配完了,需要从服务器再次申请。

 private final ConcurrentHashMap<CacheKey, CachedRange> cache = new ConcurrentHashMap<CacheKey, CachedRange>();
 
 CacheKey:业务场景
 CachedRange:当前批次可用的id区间范围
 public long nextId(String app, String key) {
       synchronized (this){
           CacheKey cacheKey = new CacheKey(app, key);
           CachedRange cachedRange = this.cache.get(cacheKey);
           if (cachedRange == null || cachedRange.range.getEnd() < cachedRange.pos) {
               IDRange range = this.service.getNextRange(app, key, this.size);
               cachedRange = new CachedRange(range, range.getStart()) ;
           }
           long pos = cachedRange.pos;
           cachedRange.pos += 1;
           this.cache.put(cacheKey, cachedRange);
           return pos;
       }
   }
   
size:表示一次获取id的区间长度
   

b)初始化时或者分配的区间段用完,此时需要从远程服务器申请

获取一个可用的IDRange, 结果为闭区间[a, b]

public IDRange getNextRange(String app, String key, int size) {

        synchronized (this) {
            IDRange result = new IDRange();
            IDRange range = this.get4Update(app, key, size * this.PRE_ALOCATE_BATCH_NUM);
            result.setApp(app);
            result.setKey(key);
            result.setStart(range.getStart());
            result.setEnd(range.getEnd());

            this.logger.info("return range: {}", result);
            return result;
        }
    }
// 数据库查询

 @Transactional(value="crtTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public IDRange get4Update(String app, String key, int size) {
        Map<String, String> params = new HashMap<String, String>();
        params.put("app", app);
        params.put("key", key);
        SqlSession sqlSession = this.commonSqlSessionTemplate.getSqlSessionFactory()
                .openSession();
        UniversalId universalId = sqlSession.selectOne("select4Update", params);
        if (universalId == null) {
            return null;
        }

        IDRange range = new IDRange();
        range.setApp(app);
        range.setKey(key);
        range.setStart(universalId.getValue() + 1);
        range.setEnd(universalId.getValue() + size - 1);

        universalId.setValue(universalId.getValue() + size);
        sqlSession.update("updateValue", universalId);
        return range;
    }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
客户端ID生成器是一种用于生成独一无二标识符的工具,该标识符用于标识和区分不同的客户端。在计算机系统和网络应用中,客户端ID通常用于识别和跟踪特定的用户或设备。 客户端ID生成器的作用是根据一定的规则和算法生成唯一的ID。这个ID可以是数字、字母、符号的组合,通常是一个字符串形式的值。生成的ID应该具备唯一性,并且不易被猜测或重复。这样可以有效地避免冲突和混淆,确保系统的正常运行和数据的准确性。 通常情况下,客户端ID生成器会采用一些特定的规则和方法来生成ID。例如,可以使用时间戳、随机数、设备信息等作为生成ID的依据,经过一定的计算和处理,生成一个唯一的标识符。生成的ID可以被存储在数据库或者其他数据结构中,用于后续的识别和验证。 客户端ID生成器在实际应用中有着广泛的用途。例如,在网络应用中,通过生成唯一的客户端ID可以实现用户行为的跟踪和记录,用于统计和分析用户的访问情况;在分布式系统中,通过生成唯一的客户端ID可以实现资源的分配和管理,用于确保每个客户端的正常运行。 总之,客户端ID生成器是一种用于生成独一无二标识符的工具,它具备唯一性、不易重复和不易猜测的特点。通过生成唯一的客户端ID,可以实现用户的识别和跟踪,确保系统的正常运行和数据的准确性。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值