uuid生成代码(Skuid生成器 简单易用 高性能 高可用的id生成系统)

ID是数据的唯一标识,传统的做法是利用UUID和数据库的自增ID,在互联网企业中,大部分公司使用的都是Mysql,并且因为需要事务支持,所以通常会使用Innodb存储引擎,UUID太长以及无序,所以并不适合在Innodb中来作为主键,自增ID比较合适,但是随着公司的业务发展,数据量将越来越大,需要对数据进行分表,而分表后,每个表中的数据都会按自己的节奏进行自增,很有可能出现ID冲突。这时就需要一个单独的机制来负责生成唯一ID,生成出来的ID也可以叫做分布式ID,或全局ID

下面来是各个生成分布式ID的机制。

图片1

下面是我想到的一套策略: 类似滴滴的TinyId生成类似

/** *【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目@author : * @program:es-server * @description: 生成唯一码 <br> * @create:2019-10-09 15-42 * @return: */ public interface SequenceService { /** * 方法: generateUniqueKey <br> * 描述: 根据指定key生成唯一自增值 <br> * 作者: * 时间: 2019-10-09 15-42 * @paramk【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目ey 系统标识 *@param limit * @return */ public Long generateUniqueKey(CommonGenerateKey key, long limit) ; }

//系统标识key 枚举

package com.ouyue.xiwen.esserver.common.enums; import lombok.Getter; public enum CommonGenerateKey { API_ACCESS_KEY(“API_ACCESS_KEY”, “ACCESS_KEY,系统自动生成”), ACCOUNTBILLNO(“A【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目CCOUNTBILLNO”, “账单编号序列”), PAYROLLREQUISITIONNO(“PAYROLLREQUISITIONNO”,“请款单号序列”), WAY_BILL_NO(“WAY_BILL_NO”,“运输单号序列”), ; @Getter private String key; @Getter private String des; CommonGenerateKey(String intValue, String des) { this.key = intValue; this.des = des; } publicString toString() {【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目return this.des; } } /** * @author : * @program:es-server * @description:生成唯一码 <br> * @create:2019-10-09 15-44 */ public class SequenceServiceImpl implements SequenceService { protected static final Logger logger = LoggerFactory.getLogger(SequenceServiceImpl.class); @Re【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目source private SequenceDao sequenceDao; private final ConcurrentHashMap<String, Map.Entry<Long, Long>> keyMap = new ConcurrentHashMap<>(); /** * 方法: updateBySkuId <br> * 描述: 根据sku全量更新 <br> * @author : * @create:2019-10-09 15-44 * * @return */ public LonggenerateUniq【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目ueKey(CommonGenerateKey key, long limit) {// 默认缓存到本地的key域 if (limit <= 3) { limit = 10; } synchronized (key.getKey()) { Map.Entry<Long, Long> entry = keyMap.get(key.getKey()); if (entry == null) { LonggenerateUniqueKey = sequenceDao.generateUniqueKey(key, limit); keyMap.put(key.getKey(), 【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目Maps.immutableEntry(generateUniqueKey, generateUniqueKey + limit –1)); logger.info(“击穿db:” + (generateUniqueKey)); return generateUniqueKey; } else { Long start = entry.getKey(); Long end = entry.getValue(); Long result = start + 1; if (end – start < 2) { keyMap.remove(key.getKey()); } else{ key【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目Map.put(key.getKey(), Maps.immutableEntry(result, end)); } logger.info(“走缓存:” + result); return result; } } } } /** * @author : * @program:es-server * @description: * @create:2019-10-09 15-45 */ @Component public class SequenceDao { protected static fi【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目nal Logger logger = LoggerFactory.getLogger(SequenceDao.class); @Resource private DBSequenceMapper dbSequenceMapper; /** * 方法: updateBySkuId <br> * 描述: 根据sku全量更新 <br> * 作者: * 时间: 2019年10月9日 * * @return */ @Transactional(propagation = Propagation.REQUIRES_NEW) p【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目ublic Long generateUniqueKey(CommonGenerateKey key, long limit) { for (int i = 0; i < 20; i++) { DBSequence oldSequence = selectByKey(key.getKey()); if (oldSequence == null) { oldSequence = createSequence(key.getKey()); boolean insert = insert(oldSequence); if(!insert) { ExceptionUtil.serviceE【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目xception(“创建seq失败”); } } oldSequence.setNewValue(oldSequence.getSeqValue() + limit); boolean result = update(oldSequence); if (!result) { try { logger.error(“Sequence.generateKey fail sleep {}”, i * 10); Thread.sleep(i * 10); } catch (InterruptedException e) { logger.error(“S【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目equence.generateKey sleep {}”, key, e); } continue; } DBSequence newsequence = selectByKey(key.getKey()); if (NumberUtils.compare(newsequence.getSeqValue(), oldSequence.getNewValue()) == 0) { logger.info(“击穿db:” + (oldSequence.getSeqValue() + 1)); return oldSequence.getSeqValue() + 1; } 【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目 } ExceptionUtil.serviceException(“数据库异常”); return1l; } /** * 方法: updateBySkuId <br> * 描述: 根据sku全量更新 <br> * 作者: * 时间: 2019年10月9日 * * @return */ public boolean insert(DBSequence squence) { try{ squence.setDbUpdateTime(new Date()); int update【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目 = dbSequenceMapper.insertSelective(squence);return update > 0; } catch (Exception e) { logger.error(“Sequence.update error {}”, JSONObject.toJSONString(squence), e); ExceptionUtil.serviceException(ExceptionCode.DB_ERROR); return false; } } /** * 方法: updateBySkuId <br> *【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目 描述: 根据sku全量更新 <br> * 作者: * 时间: 2019年10月9日 *@return */ public boolean update(DBSequence squence) { try { int update = dbSequenceMapper.updateByPrimaryKeySelective(squence); return update > 0; } catch (Exception e) { logger.error(“Sequence.update error {}”, JSONObject.toJSON【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目String(squence), e); ExceptionUtil.serviceException(ExceptionCode.DB_ERROR);return false; } } /** * 方法: updateBySkuIdSelective <br> * 描述: 根据sku更新 <br> * 作者: * 时间: 2019年10月9日 * * @return */ public DBSequence selectByKey(String key) { try { returndbSe【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目quenceMapper.selectBySeqKey(key); }catch (Exception e) { logger.error(“Sequence.selectByKey error {}”, key, e); ExceptionUtil.serviceException(ExceptionCode.DB_ERROR); return null; } } privateDBSequence createSequence(String key) { DBSequence seq = new DBSequence(); seq.setSe【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目qKey(key); seq.setSeqValue(1l); seq.setRemark(“system创建”); seq.setDbCreateTime(new Date()); return seq; } } 数据库表字段值 CREATE TABLE `db_sequence` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键, `seq_key` varchar(50) NOT NULL COMMENT 序号键, `seq_value` bigint【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目(20) DEFAULT 0 COMMENT 序号值, `remark` varchar(100) DEFAULT COMMENT 备注, `new_value` bigint(20) DEFAULT 0 COMMENT 新的序列值, `db_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 修改时间, `db_create_time` timestamp NOT NULL DEFAULT 2000-01-01 00:00:00 COMMENT 【我爱线报网】52线报网-专注分享活动首码线报优惠券零投网赚项目建时间, PRIMARY KEY (`id`), UNIQUE KEY `unique_key` (`seq_key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT=自增序号表/* BF=seq_key, POLICY=ims_single, STARTID=1, ASSIGNIDTYPE=USB */; 备注 /* BF=seq_key, POLICY=ims_single, STARTID=1, ASSIGNIDTYPE=USB */ 标识是 分布式数据库id 主键

推荐阅读

给力项目线报网会员可免费下载 加入会员
友情提醒: 请尽量登录购买,防止付款了不发货!
QQ交流群:226333560 站长微信:qgzmt2
温馨提示:本站提供的一切软件、教程和内容信息都来自网络收集整理,仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负,版权争议与本站无关。用户必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。如果您喜欢该程序和内容,请支持正版,购买注册,得到更好的正版服务。我们非常重视版权问题,如有侵权请邮件与我们联系处理。敬请谅解!

给TA打赏
共{{data.count}}人
人已打赏
行业资讯

河南省科协电话(河南省科协直属事业单位2023年公开招聘工作人员6名)

2024-5-10 14:39:10

行业资讯

急招大龄工300元一天 以下厂子在那个城市?(福清又有一波单位招人啦!有合适你的么?)

2024-5-10 14:59:43

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索