首页新闻找找看学习计划

根据时间数生成id的问题

0
[待解决问题]

我的ID 是根据年月日时分秒还 定义的,,,,但现在 出现有二个人 在同一时间 下单,,,生成了二个一样的  ID。。。。。。怎么解决这个重复ID的问题。。

 

用户 要可以并发,不能等这个用户生成ID了 才给另一个用户生成,,,二个要 同时生成di用户

孩丿的主页 孩丿 | 初学一级 | 园豆:186
提问于:2017-09-19 14:52
< >
分享
所有回答(7)
0

1.自己搞个自增量,放数据库或者redis中都可。

2.订单号生成的时间粒度细点,放到毫秒,要是觉得再不靠谱再加个随机数拼接上

3.每台机器使用不同的生成序列,在集群中每台机器可以通过标识知道自己生成哪个数据段(类似手机号号码段),单机上随便同步下就可以了。

Daniel Cai | 园豆:10374 (专家六级) | 2017-09-19 14:55

1,2点  都行不通,,第三点 没看懂

支持(0) 反对(0) 孩丿 | 园豆:186 (初学一级) | 2017-09-20 11:18

@孩丿: redis做自增种子单实例1s 200k个还不行这不是开玩笑?12306到了最高峰期点击量也就这个量级。

时间放到毫秒+随机数不说多的1s 1000+你不行?

第三个就是snowflake的简单实现

支持(0) 反对(0) Daniel Cai | 园豆:10374 (专家六级) | 2017-09-20 12:57
0

百度:推特id算法.一个sw开头的东西.

吴瑞祥 | 园豆:28675 (高人七级) | 2017-09-19 15:01
0

只要你不怕ID长,总能解决的。

爱编程的大叔 | 园豆:29788 (高人七级) | 2017-09-19 15:05
0

 调用同一个方法,用lock锁住

jqw2009 | 园豆:1891 (小虾三级) | 2017-09-19 15:09

锁不行,,,和不加一样的 效果,

支持(0) 反对(0) 孩丿 | 园豆:186 (初学一级) | 2017-09-20 11:17

@孩丿: 谁说的?你用过吗?贴代码

支持(0) 反对(0) jqw2009 | 园豆:1891 (小虾三级) | 2017-09-20 11:29

@jqw2009:测了的 ,,,开了10个线程跑,,生成的 时间会有一样的,

支持(0) 反对(0) 孩丿 | 园豆:186 (初学一级) | 2017-09-20 12:00

线程没有返回,才不会 往下 进行,,我就生成 一个时间 字符串,,立马 有返回,,

支持(0) 反对(0) 孩丿 | 园豆:186 (初学一级) | 2017-09-20 12:05

@孩丿: 扯淡,你把代码贴出来

支持(0) 反对(0) jqw2009 | 园豆:1891 (小虾三级) | 2017-09-20 12:05

@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();
                 }
        }
支持(0) 反对(0) 孩丿 | 园豆:186 (初学一级) | 2017-09-20 12:09

@孩丿: Object thisLock = new Object();  这个声明要放到方法外面,全局变量锁住才有意义吧,你放到外面再试试

支持(0) 反对(0) jqw2009 | 园豆:1891 (小虾三级) | 2017-09-20 13:48

@jqw2009: 一样的 不行

支持(0) 反对(0) 孩丿 | 园豆:186 (初学一级) | 2017-09-20 14:16

@孩丿: 无语,只能帮到你这里了,方法已经告诉你了,你还是写不出来我也没办法了

支持(0) 反对(0) jqw2009 | 园豆:1891 (小虾三级) | 2017-09-20 14:20
0

秒不行就到ms级呗,ms再不放心,后缀加个guid

猝不及防 | 园豆:1114 (小虾三级) | 2017-09-20 10:58

高并发 毫秒级 都没有用,,guid又太长了

支持(0) 反对(0) 孩丿 | 园豆:186 (初学一级) | 2017-09-20 11:15

@孩丿: 可以参考mongodb数据库自己生成的_id方式

支持(0) 反对(0) 猝不及防 | 园豆:1114 (小虾三级) | 2017-09-20 13:10
0

ID = 用户+时间

by.Genesis | 园豆:1437 (小虾三级) | 2017-09-20 12:04
0

最简单的解决方案就是 楼上说的 用户ID + 时间 (毫秒级)+Guid 应该就可以了

IT小伙儿 | 园豆:11 (初学一级) | 2017-09-21 17:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册