/*** uid 生成器* uid作为数据库主键 最好有序递增*/
public class IdProvider {// id类型 0-99public enum IdType {PRINCE(1), // 皇子PRINCE_TALENT(2), // 皇子天赋PRINCE_FETTER(3), // 皇子羁绊PRINCE_FETTER_LOG(4), // 皇子羁绊记录;final int type;IdType(int type) {this.type = type;}}/*** 原子递增 保证同一时刻唯一(取值范围越大,越唯一)*/private static final AtomicInteger FLAG = new AtomicInteger(0);/*** 生成18位uid 当前保证:同小时同服同类型1000个数内必不重复 超过取决于flag&randomStr* @return hours(6) + serverId(4) + idType(2) + flag(3) + randomStr(3)*/public static long genId(IdType idType, int serverId) {int flag = FLAG.incrementAndGet();if (flag > 999) {flag = 0;FLAG.set(flag);}// 当前时间戳转换成小时数 2084年前都是6位long hours = TimeUnit.MILLISECONDS.toHours(System.currentTimeMillis());String randomStr = RandomStringUtil.generateRandomString(3, RandomStringUtil.Mode.NUMERIC);return Long.parseLong(String.format("%d%04d%02d%03d%s", hours, serverId, idType.type, flag, randomStr));}
}
public class RandomStringUtil {public enum Mode {ALPHA, ALPHANUMERIC, NUMERIC, S_ALPHANUMERIC}public static String generateRandomString(int length, Mode mode) {StringBuilder builder = new StringBuilder();String characters = "";switch (mode) {case ALPHA:characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";break;case ALPHANUMERIC:characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";break;case NUMERIC:characters = "0123456789";break;case S_ALPHANUMERIC:characters = "abcdefghijklmnopqrstuvwxyz1234567890";break;}int charactersLength = characters.length();for (int i = 0; i < length; i++) {double index = Math.random() * charactersLength;// 数字 首位不为0if (i == 0 && mode == Mode.NUMERIC && index < 1) {index++;}builder.append(characters.charAt((int) index));}return builder.toString();}
}

uid 生成器(数据区主键)相关推荐

  1. MyBatis框架——mybatis插入数据返回主键(mysql、oracle)

    向数据库中插入数据时,大多数情况都会使用自增列或者UUID做为主键.主键的值都是插入之前无法知道的,但很多情况下我们在插入数据后需要使用刚刚插入数据的主键,比如向两张关联表A.B中插入数据(A的主键是 ...

  2. oracle 导入数据时主键丢失,Oracle 插入数据 返回主键

    场景:解决getJdbcTemplate往oracle数据库中插入数据返回主键出错有关问题 解决getJdbcTemplate往oracle数据库中插入数据返回主键出错问题 我们使用Spring中的J ...

  3. DB2添加数据时主键、唯一键冲突的解决方法

    DB2添加数据时主键.唯一键冲突的解决方法 参考文章: (1)DB2添加数据时主键.唯一键冲突的解决方法 (2)https://www.cnblogs.com/equation/articles/91 ...

  4. sql新增数据返回主键

    sql新增数据返回主键 @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id&quo ...

  5. sql 清空表数据、删除表数据、主键从1开始

    清空表数据 truncate table 表; 可以清除表的数据,如果有设置主键的话,再添加数据的时候主键ID还是从1开始 delete from 表; 然后重新添加数据即可.  主键从1开始

  6. mysql 清空表数据,主键重新排序

    方法一: 效果: 清空表数据,主键重新排序(一张全新的表) truncate table table_name truncate官方解释: TRUNCATE TABLE empties a table ...

  7. 百万数据修改索引,百万数据修改主键

    当百万数据时,如果修改主键,那么会自动重建索引,所以操作会非常慢,经常会超时,错误提示类似: 超时时间已到.在操作完成之前超时时间已过或服务器未响应 解决方案:不要采用手动添加主键或者索引,而采用sq ...

  8. Mybatis-plus插入数据遇到主键没有默认值的问题

    新增数据时报 java.sql.SQLException: Field 'id' doesn't have a default value mybatis-plus的insert方法,在底层会默认生成 ...

  9. MySQL 数据表主键设计,选择自增 id 还是 UUID 还是雪花 id?

    在 MySQL 数据表的设计中,官方推荐我们不要使用 UUID 或者其他不连续不重复的 id,而是推荐使用连续自增的主键 id(auto_increment). 随着现在许多项目都涉及到了分布式或者微 ...

最新文章

  1. 一步一步学Silverlight 2系列(13):数据与通信之WebRequest
  2. 在线实时大数据平台Storm集成redis开发(分布锁)
  3. c 语言练习__去掉多余的空白字符_修正
  4. 算法题目——二次函数三分求极值(HDU-3714)
  5. 生成一个GitHub的token用于git推送本地库至远程库
  6. linux硬盘怎么分配合适,500G的硬盘,怎么分区比较合理?
  7. 我如何获得了梦想中的亚马逊工作机会?
  8. 低微漏洞处理办法记录
  9. SAS 146GB*8 RAID5数据恢复过程(HP 双循环)
  10. python爬取资源网站资源
  11. win7做ftp服务器是否稳定,win7可以做ftp服务器吗
  12. Java中学生管理系统(对分数健康查询与修改)
  13. linux 反垃圾邮件网关,反垃圾邮件神器--开源邮件网关ScrolloutF1之二--基本配置
  14. AI视觉千亿规模市场虚席以待 初创企业看好“算法决定芯片”路径
  15. 按下 Home 键后发生了什么事?
  16. HashMap底层——解决Hash冲突(链地址法)
  17. 2022秋软工实践 第一次结对编程作业
  18. STM32实战(1):搭建模板工程
  19. 吕本富:从平台经济到平台经济学
  20. Team Project Proposal: 开始页--为你的Outlook而生--By Qiaolin Xia

热门文章

  1. I/O寄存器的边际效应
  2. 翻译翻译什么叫她妈的惊喜_妈的程序员说,翻译
  3. android 横竖屏坐标转换,Android:横竖屏转换问题
  4. 安装maven时安照说明配置环境变量JAVA_HOME
  5. trackmaker翻译_水工词汇翻译
  6. 基于PCI接口的数据采集卡!(第一次做的板卡)
  7. oracle 连不上 显示socket read time out
  8. cocos2d-x之怪物系统
  9. NYT assail military militant
  10. 记一次JVM调优(Permanent Generation)