在系统中生成业务ID的几种方法

标签: 系统 业务 id | 发表时间:2015-12-26 12:38 | 作者:lxlong
出处:http://www.iteye.com

在系统中,除了使用数据库表本身的Id,如何生成各种业务Id?一下记录几种生成Id的方式:

  1. 使用数据库表记录生成的Id,以MySQL为例:

1) 首先创建一个数据库表,来记录当前的业务Id

CREATE TABLE `global_auto_number` (
  `id` varchar(32) NOT NULL,
  `version_optimized_lock` int(11) NOT NULL,
  `business_key` varchar(255) NOT NULL COMMENT 'Can use full business class name as business key',
  `current_num` bigint(22) NOT NULL COMMENT 'current number',
  PRIMARY KEY (`id`),
  UNIQUE KEY `UK_AUTO_NUMBER` (`business_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

 2) 获取Id的方法:

int currentCount = jdbcTemplate.update("update global_auto_number set current_num = LAST_INSERT_ID(current_num + 1) where business_key = ?", new Object[] {businessKey});

if(currentCount == 0) {
     jdbcTemplate.update("insert into global_auto_number (id, version_optimized_lock, business_key, current_num) values (?, 1, ?, 0)", new Object[] {UUIDGenerator.generateUUID(),businessKey});
     jdbcTemplate.update("update global_auto_number set current_num = LAST_INSERT_ID(current_num + 1) where business_key = ?", new Object[] {businessKey});
}
return jdbcTemplate.queryForLong("select LAST_INSERT_ID()");

 3) 按照业务逻辑格式化获取的Id。例如:

String.format("SEQ%09d", 123)

 4) 注意事务需要用REQUIRES_NEW,否则在并发环境下会出现大量乐观锁问题。

 

2. 使用随机数来生成随机的Id,例如使用同一个Id来追踪后台响应用户操作的各种log

   public static String generateRandomId() {
      byte[] bytes = new byte[10];
      try {
         SecureRandom.getInstance("SHA1PRNG").nextBytes(bytes);
      }
      catch (NoSuchAlgorithmException e) {
         throw new RuntimeException(e);
      }
      return toHexString(bytes);
   }
   
   final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
   public static String toHexString(byte[] bytes) {
       char[] hexChars = new char[bytes.length * 2];
       for ( int j = 0; j < bytes.length; j++ ) {
           int v = bytes[j] & 0xFF;
           hexChars[j * 2] = hexArray[v >>> 4];
           hexChars[j * 2 + 1] = hexArray[v & 0x0F];
       }
       return new String(hexChars);
   }

 

 

 

 

 

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [系统 业务 id] 推荐:

在系统中生成业务ID的几种方法

- - 编程语言 - ITeye博客
在系统中,除了使用数据库表本身的Id,如何生成各种业务Id. 使用数据库表记录生成的Id,以MySQL为例:. 1) 首先创建一个数据库表,来记录当前的业务Id.  2) 获取Id的方法:. int currentCount = jdbcTemplate.update("update global_auto_number set current_num = LAST_INSERT_ID(current_num + 1) where business_key = ?", new Object[] {businessKey}); if(currentCount == 0) {.

Leaf——美团点评分布式ID生成系统

- - 美团点评技术团队
在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求;特别一点的如订单、骑手、优惠券也都需要有唯一ID做标识. 此时一个能够生成全局唯一ID的系统是非常必要的.

分布式系统中唯一 ID 的生成方法

- - 文章 – 伯乐在线
本文主要介绍在一个分布式系统中, 怎么样生成全局唯一的 ID. 在分布式系统存在多个 Shard 的场景中, 同时在各个 Shard 插入数据时, 怎么给这些数据生成全局的 unique ID?. 在单机系统中 (例如一个 MySQL 实例), unique ID 的生成是非常简单的, 直接利用 MySQL 自带的自增 ID 功能就可以实现..

分布式系统中, 怎么样生成全局唯一的 ID

- - zzm
在分布式系统存在多个 Shard 的场景中, 同时在各个 Shard 插入数据时, 怎么给这些数据生成全局的 unique ID?. 在单机系统中 (例如一个 MySQL 实例), unique ID 的生成是非常简单的, 直接利用 MySQL 自带的自增 ID 功能就可以实现.. 但在一个存在多个 Shards 的分布式系统 (例如多个 MySQL 实例组成一个集群, 在这个集群中插入数据), 这个问题会变得复杂, 所生成的全局的 unique ID 要满足以下需求:.

产生Id

- - 研发管理 - ITeye博客
// worker编号最大值,决定支持的部署节点数量. // 毫秒内自增位数,每毫秒最大序号支持65535. // worker编号偏移量. // 毫秒基线:2015-01-01 00:00:00. * 从环境变量中获取worker编号,每个部署环境编号不能重复. * 每个部署环境编号不能重复. * @param workerId Worker编号.

id Software发布《狂怒(Rage)》

- ArmadilloCommander - Solidot
id Software发布了容量为21GB的第一人称射击游戏《狂怒(Rage)》. 游戏基于id Tech 5引擎,背景是世界末日后的未来. 目前对它的评价好坏参半,媒体综合评分80左右,玩家评分相似或更低. 在游戏中,玩家将扮演一位小行星Apophis撞击地球后的幸存者. 在灾难发生前,全世界展开合作将包括科学家在内的精英冰冻在地下,以在灾难后重建地球.

小米手机ID简介

- miyizs - Billwang 工业设计
      小米手机是小米公司(全称北京小米科技有限责任公司)专为发烧友级手机控打造的 一款高品质智能手机. 下面我们将对其做一个简单的介绍.       小米手机的外观设计走的是简约内敛路线,直板加圆润的边角让其显得简单清爽. 小米手机配置了,1.5GHz双核处理器、1G RAM、4英寸夏普屏、800万像素摄像头以及大容量电池.

标签?ID?还是CLASS?

- - 前端观察
想谈一下几个基本的HTML问题,都是围绕着应该怎样使用HTML. 多用有语义的标签,少用div和span,避免使用没有class的div和span. 设想一下HTML的世界最初只有div和span这两个标签,其实网页依然可以写得出来. 更多标签的出现,其实是为了替代利用率高但不好书写的 
 和  来的.

设备id那些事

- - 算法之道
随着用户隐私关注度越来越高,搜广推以imei收集用户数据的方式开始被要求整改,首先是客户端不会上传imei,那么追踪用户的唯一标识没有了,那后续该怎么做. 其实除了这个唯一标识符问题,还有一些应用设置项:出现了允许关闭推荐的选项,致命一击. 先了解一下现在移动终端可以收集哪些 id. 不可逆、唯一性、不可篡改、一致性.

Linuxer:制作自己的Linux ID Card吧

- rex - Wow! Ubuntu
Super Boot Manager的作者Alessandro Lanave,又为Linuxer带来了一个web程序,制作Linux ID Card ,Card效果如图. 可以把ID Card做为论坛签名,博客签名,任何你需要的地方. 当然,如果觉得没有自己喜欢的发行版的模板,可以向Alessandro Lanave提交哦,.