在测试库的数据有100w左右,用的唯一ID 时间戳+6位随机数作为ID来使用的,在跑程序的时候时不时就会报key重复,毫秒容易重复还可以,六位随机数重复的可能是十万分之一,而且我也不可能一毫米就跑十万条数据呀,他为啥就这么容易重复呢。
3条回答 默认 最新
- 小P聊技术 2021-05-20 16:26关注
建议你换一种全局ID的生成方法, 建议使用推特雪花算法的 全局唯一ID
package org.n3r.idworker; import org.n3r.idworker.strategy.DefaultWorkerIdStrategy; import org.n3r.idworker.utils.Utils; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.Date; @Component public class Sid { private static WorkerIdStrategy workerIdStrategy; private static IdWorker idWorker; static { configure(DefaultWorkerIdStrategy.instance); } public static synchronized void configure(WorkerIdStrategy custom) { if (workerIdStrategy != null) workerIdStrategy.release(); workerIdStrategy = custom; idWorker = new IdWorker(workerIdStrategy.availableWorkerId()) { @Override public long getEpoch() { return Utils.midnightMillis(); } }; } /** * 一天最大毫秒86400000,最大占用27比特 * 27+10+11=48位 最大值281474976710655(15字),YK0XXHZ827(10字) * 6位(YYMMDD)+15位,共21位 * * @return 固定21位数字字符串 */ public static String next() { long id = idWorker.nextId(); String yyMMdd = new SimpleDateFormat("yyyyMMdd").format(new Date()); return yyMMdd + String.format("%014d", id); } /** * 返回固定16位的字母数字混编的字符串。 */ public String nextShort() { long id = idWorker.nextId(); String yyMMdd = new SimpleDateFormat("yyyyMMdd").format(new Date()); return yyMMdd + Utils.padLeft(Utils.encode(id), 10, '0'); } // public static void main(String[] args) { // String aa = new Sid().nextShort(); // String bb = new Sid().next(); // // System.out.println(aa); // System.out.println(bb); // } public static void main(String[] args) { Sid sid = new Sid(); System.out.println(sid.nextShort()); } }
代码我这边比较多,如果你需要的话,我可以单独发你代码
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 linux驱动,linux应用,多线程
- ¥20 我要一个分身加定位两个功能的安卓app
- ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
- ¥15 IAR程序莫名变量多重定义
- ¥15 (标签-UDP|关键词-client)
- ¥15 关于库卡officelite无法与虚拟机通讯的问题
- ¥15 目标检测项目无法读取视频
- ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
- ¥100 求采集电商背景音乐的方法
- ¥15 数学建模竞赛求指导帮助