#独家
random是个伪随机数,不能跟时间戳共用

2025-04-17 0 3,621

故事背景

今天合作方K反馈没有收到微信解约信息,我感觉大概是系统报错了,或者是连接超时之类的错误,结果一排查发现这个解约消息回调到合作方B了……我记得逻辑是根据签约号查询数据库的签约信息,签约信息有渠道号,根据渠道去通知到对应的url请求,怎么会弄混了呢,百思不得其解。

问题排查

首先是看有多少数据是这种情况,通过查日志和数据库都确认了只有这一条数据发送到错误的渠道,对业务影响不大。然后仔细看代码逻辑发现了蹊跷的地方,查询渠道的时候居然是通过序列号去查询,不是通过协议号,下面是序列号的生成规则。

一开始我只是以为刚好这么巧,在同一个时间戳+同一个随机数刚好冲突了,上线了快半年,一天可能有上万的签约记录,只出现了一次。

我跟兄弟说这个事情后,他说听说Random是伪随机数,后面证实了确实如此,传入了种子后,得到的数字都是一样的…

当创建Random的实例对象时,没有指定种子,系统会以当前时间戳作为种子,产生随机数。当指定种子后,两次产生的随机数序列就会一样了。

所以这个随机数不管传不传种子,如果是时间戳一样,random的数字肯定是一样的…..怪不得说他是伪随机,大概的算法就是根据时间戳做一个计算处理。

方案处理

其实在这个业务中处理还挺简单的,不用这个“唯一”序列号做查询条件,使用有唯一索引的订单号作为查询条件就解决了。另外除了数据库唯一索引校验,还有其他几种分布式id生成方式。

1、UUID

缺点:字段太长占用空间,无序性,插入数据库时可能导致页分裂,降低写入效率。一般不推荐使用

2、redis分布式id

优点:性能较高,ID持续递增

缺点:依赖redis,redis挂了服务会异常

我们服务有用过redis这种生成方式

3、雪花算法

雪花算法是由时间戳 + 数据中心ID + 机器ID + 序列号组成。如果时间戳一样,就会在本地保存一个序列号,依次递增。

优点:本地生成,无网络开销。

缺点:时钟回拨问题:机器时钟不同步可能导致ID重复。

其实我们也算是半个雪花算法,我们用的是时间戳+random随机数,只不过时间戳跟random随机数是绑定关系,时间戳一样,random随机数就不随机了- –

4、Leaf(号段模式)

美团开源的分布式ID服务,批量从数据库获取号段(如1-1000),内存分配。

优点:高吞吐:减少数据库访问频率。

缺点:需等待新号段获取,存在短暂阻塞风险。

我们也用过这种号段方式,不过是用的redis版本。

总结

random是个伪随机数,不能跟时间戳共用。一般可以用时间戳+redis分布式id,或者时间戳+mysql的号段方式比较好~

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

1. JK下载官网所有资源来源于开发团队,加入会员即可下载使用!如有问题请联系右下角在线客服!
2. JK下载官方保障所有软件都通过人工亲测,为每位会员用户提供安全可靠的应用软件、游戏资源下载及程序开发服务。
3. JK开发团队针对会员诉求,历经多年拥有现今开发成果, 每款应用程序上线前都经过人工测试无误后提供安装使用,只为会员提供安全原创的应用。
4. PC/移动端应用下载后如遇安装使用问题请联系右下角在线客服或提交工单,一对一指导解决疑难。

JK软件下载官网 技术分享 random是个伪随机数,不能跟时间戳共用 https://www.jkxiazai.com/4145.html

JK软件应用商店是经过官方安全认证,保障正版软件平台

random是个伪随机数,不能跟时间戳共用
下一篇:

已经没有下一篇了!

相关资源

官方客服团队

为您解决烦忧 - 24小时在线 专业服务