uid 生成器(数据区主键)
/*** 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 生成器(数据区主键)相关推荐
- MyBatis框架——mybatis插入数据返回主键(mysql、oracle)
向数据库中插入数据时,大多数情况都会使用自增列或者UUID做为主键.主键的值都是插入之前无法知道的,但很多情况下我们在插入数据后需要使用刚刚插入数据的主键,比如向两张关联表A.B中插入数据(A的主键是 ...
- oracle 导入数据时主键丢失,Oracle 插入数据 返回主键
场景:解决getJdbcTemplate往oracle数据库中插入数据返回主键出错有关问题 解决getJdbcTemplate往oracle数据库中插入数据返回主键出错问题 我们使用Spring中的J ...
- DB2添加数据时主键、唯一键冲突的解决方法
DB2添加数据时主键.唯一键冲突的解决方法 参考文章: (1)DB2添加数据时主键.唯一键冲突的解决方法 (2)https://www.cnblogs.com/equation/articles/91 ...
- sql新增数据返回主键
sql新增数据返回主键 @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id&quo ...
- sql 清空表数据、删除表数据、主键从1开始
清空表数据 truncate table 表; 可以清除表的数据,如果有设置主键的话,再添加数据的时候主键ID还是从1开始 delete from 表; 然后重新添加数据即可. 主键从1开始
- mysql 清空表数据,主键重新排序
方法一: 效果: 清空表数据,主键重新排序(一张全新的表) truncate table table_name truncate官方解释: TRUNCATE TABLE empties a table ...
- 百万数据修改索引,百万数据修改主键
当百万数据时,如果修改主键,那么会自动重建索引,所以操作会非常慢,经常会超时,错误提示类似: 超时时间已到.在操作完成之前超时时间已过或服务器未响应 解决方案:不要采用手动添加主键或者索引,而采用sq ...
- Mybatis-plus插入数据遇到主键没有默认值的问题
新增数据时报 java.sql.SQLException: Field 'id' doesn't have a default value mybatis-plus的insert方法,在底层会默认生成 ...
- MySQL 数据表主键设计,选择自增 id 还是 UUID 还是雪花 id?
在 MySQL 数据表的设计中,官方推荐我们不要使用 UUID 或者其他不连续不重复的 id,而是推荐使用连续自增的主键 id(auto_increment). 随着现在许多项目都涉及到了分布式或者微 ...
最新文章
- 一步一步学Silverlight 2系列(13):数据与通信之WebRequest
- 在线实时大数据平台Storm集成redis开发(分布锁)
- c 语言练习__去掉多余的空白字符_修正
- 算法题目——二次函数三分求极值(HDU-3714)
- 生成一个GitHub的token用于git推送本地库至远程库
- linux硬盘怎么分配合适,500G的硬盘,怎么分区比较合理?
- 我如何获得了梦想中的亚马逊工作机会?
- 低微漏洞处理办法记录
- SAS 146GB*8 RAID5数据恢复过程(HP 双循环)
- python爬取资源网站资源
- win7做ftp服务器是否稳定,win7可以做ftp服务器吗
- Java中学生管理系统(对分数健康查询与修改)
- linux 反垃圾邮件网关,反垃圾邮件神器--开源邮件网关ScrolloutF1之二--基本配置
- AI视觉千亿规模市场虚席以待 初创企业看好“算法决定芯片”路径
- 按下 Home 键后发生了什么事?
- HashMap底层——解决Hash冲突(链地址法)
- 2022秋软工实践 第一次结对编程作业
- STM32实战(1):搭建模板工程
- 吕本富:从平台经济到平台经济学
- Team Project Proposal: 开始页--为你的Outlook而生--By Qiaolin Xia