所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

javaWeb 在系统高并发的情况下生成有序流水号?

发布时间:2020-04-15 16:13:57

资讯分类:流水号  javaweb  并发  有序  有序  数据库  序号
javaWeb 在系统高并发的情况下生成有序流水号?

根据问题描述,其实,有一个比较简单的思路,可以保证唯一切高效,那就是根据分布系统对序号进行分组,比如,一个一共10个分系统,每个系统的序号尾数分别是:0,1,2……9,每次在原来的基础上加10就可以了。每个系统只需要维护自己的序号就可以了。具体操作时,可以用取模的方式分组。多少系统都能分。

这个方法效率、唯一性肯定没有问题的。但只能算一般意义的有序,并不是严格意义的有序。不知道能否满足你们业务要求。

如果要保证严格有序,因为计算机精度问题,在保证时间同步的基础上,算法最多控制到一定级别(一般是毫秒)的有序,所以绝对有序必须得有总控制,无论是数据库,还是单独的服务。效率上肯定会有所损失。

如果,仅是生成序号,单独的服务效率要远高于数据库。

至于具体服务,或者数据库操作倒是并不复杂。比如,单写一个快速启动servlet,因为没有任何别的业务,仅仅是序数累计,效率应该是比较高的。数据库方式需所有的子系统都到统一的数据库获取值,如果不考虑别的业务,直接数据库自增字段即可。即,插入的同时获取自增值。

javaWeb 在系统高并发的情况下生成有序流水号?

1. 如果题主不要求ID是数字,建议使用最简单的,也就是UUID,包含了机器码,时间戳,随机数等,不过UUID最后生成的是全局唯一的字符串,不是整数,并且看起来是无序的。

2. MySQL自增ID的,使用一张表存放各种业务id,然后每个分布式系统插入一条id之后,生成一千万条局部的数字与这个id拼接,那么每个系统取到一个id,就相当于生成了一千万条id,足够使用很长一段时间。这一千万条id可以事先定义好,在系统启动时就放入内存中,由于只是id,并不会占用多大的内存,MySQL可以搭建成集群,并不影响自增id的使用。

3. 与MySQL自增ID类似,使用Redis的incr实现自增。每个分布式系统像Redis使用incr插入一条id之后,生成一千万条局部的数字与这个id拼接,那么每个系统取到一个id,就相当于生成了一千万条id,足够使用很长一段时间。这一千万条id可以事先定义好,在系统启动时就放入内存中。由于只是id,并不会占用多大的内存,Redis也可以搭建成集群,并不影响自增id的使用。

4. twitter的snowflake算法,与UUID类似,包含了机器码,时间戳,随机数等,不过最后生成的是64位的整数,可以满足很多分布式系统的要求。如果要求id是整数的话,建议不要使用UUID而用snowflake。

javaWeb 在系统高并发的情况下生成有序流水号?

1,建一个第三方id生成服务器,用 rpc调用得到id

2,数据库存一个id种子,每次取出种子,然后把种子及其之后1000条id放入内存,种子加1000后马上回写数据库,

这样做的话,如果各服务器在同一时刻用完1000条Id,同时又来取1000条id的时候可能会有并发问题。但是可能性不大。

3,捕获id重复异常,碰到异常后再去取一次id

javaWeb 在系统高并发的情况下生成有序流水号?

1. 最原始的办法: 做一个SequenceId的数据库表,表中字段可以有两个,一个保存SequenceId的类型,如obj_type,另一个保存最新的SequenceId, obj_id。然后自己写一个类专门读写这张表。

2. 用数据库提供的Sequence对象,MySQL, Oracle等都有。由于你的规则有些复杂,可能需要写存储过程或者自定义函数来做。

3. 使用snowflake试试

不知道你的高并发到底有多大,但是以上每种方案都有优化的空间,具体得看你的业务逻辑了。

javaWeb 在系统高并发的情况下生成有序流水号?

1.可以用redis试试 利用redis队列的性质每次自增1获取全局id,可以建两套redis服务,留一个做备用

2.不用nosql的话,可以建多张表,每张表只有一行数据,就是各自表的当前id值,用业务id哈希到特定表上,id+步长 取出来作为全局id,相当于把原来单张表的压力分散开来

javaWeb 在系统高并发的情况下生成有序流水号?

这个要看是怎样的具体业务了,一般是下单,秒杀,则可以用队列形式。这样减少数据库的压力,保证平台稳定性。因此,采用自增就可以实现。

javaWeb 在系统高并发的情况下生成有序流水号?

感谢邀请!对这个问题不是太懂!以下查询希望可以帮到你!提高并发量这个东西是在系统架构层面上的,不是一个业务所能处理的,这时候要看你出现的是什么bug,在提高并发量这放方面,或者是把此功能禁用,如果是很严重的bug,可以事后再进行处理,启用通常会采用数据库集群,防止引发更多的用户问题,说明你的程序正在被大量用户使用,应用集群,负载均衡的方式进行提高1。

2,或者是当即处理,例如银行转账的时候会多转给别人钱、在高访问期间 如果出现了bug。如果是普通的bug,这时候当然要把服务给终止掉

留言与评论(共有 0 条评论)
   
验证码:
Top