我的ID 是根据年月日时分秒还 定义的,,,,但现在 出现有二个人 在同一时间 下单,,,生成了二个一样的 ID。。。。。。怎么解决这个重复ID的问题。。
用户 要可以并发,不能等这个用户生成ID了 才给另一个用户生成,,,二个要 同时生成di用户
1.自己搞个自增量,放数据库或者redis中都可。
2.订单号生成的时间粒度细点,放到毫秒,要是觉得再不靠谱再加个随机数拼接上
3.每台机器使用不同的生成序列,在集群中每台机器可以通过标识知道自己生成哪个数据段(类似手机号号码段),单机上随便同步下就可以了。
1,2点 都行不通,,第三点 没看懂
@孩丿: redis做自增种子单实例1s 200k个还不行这不是开玩笑?12306到了最高峰期点击量也就这个量级。
时间放到毫秒+随机数不说多的1s 1000+你不行?
第三个就是snowflake的简单实现
百度:推特id算法.一个sw开头的东西.
只要你不怕ID长,总能解决的。
调用同一个方法,用lock锁住
锁不行,,,和不加一样的 效果,
@孩丿: 谁说的?你用过吗?贴代码
@jqw2009:测了的 ,,,开了10个线程跑,,生成的 时间会有一样的,
线程没有返回,才不会 往下 进行,,我就生成 一个时间 字符串,,立马 有返回,,
@孩丿: 扯淡,你把代码贴出来
@jqw2009:
for (int i = 0; i < 10; i++) { bool b = false; Thread t = new Thread(delegate() { while (true) { try { A++; string S = GetNo(); string ISS = ""; ISS=SS.Find(X => X == S); SS.Add(S); if (!string.IsNullOrWhiteSpace(ISS)) { Console.WriteLine(S+"有重复"+"-------------"+A); b = true; Console.Read(); } else { Console.WriteLine(S+"没有重复" + "----------" + A); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } }); t.IsBackground = true; t.Start(); public static string GetNo() { Object thisLock = new Object(); lock (thisLock) { //随机数 System.Random random = new System.Random(); return System.DateTime.Now.ToString("yyyyMMddHHmmss") + random.Next(1000, 10000).ToString(); } }
@孩丿: Object thisLock = new Object(); 这个声明要放到方法外面,全局变量锁住才有意义吧,你放到外面再试试
@jqw2009: 一样的 不行
@孩丿: 无语,只能帮到你这里了,方法已经告诉你了,你还是写不出来我也没办法了
秒不行就到ms级呗,ms再不放心,后缀加个guid
高并发 毫秒级 都没有用,,guid又太长了
@孩丿: 可以参考mongodb数据库自己生成的_id方式
ID = 用户+时间
最简单的解决方案就是 楼上说的 用户ID + 时间 (毫秒级)+Guid 应该就可以了