网上作业网站怎么做的优秀平面设计网站
web/
2025/9/28 16:23:06/
文章来源:
网上作业网站怎么做的,优秀平面设计网站,个人网站页脚设计,北京网站制作设计公司排名背景在复杂分布式系统中#xff0c;往往需要对大量的数据和消息进行唯一标识。如在支付流水号、订单号等#xff0c;随者业务数据日渐增长#xff0c;对数据分库分表后需要有一个唯一ID来标识一条数据或消息#xff0c;数据库的自增ID显然不能满足需求#xff0c;此时一个…背景在复杂分布式系统中往往需要对大量的数据和消息进行唯一标识。如在支付流水号、订单号等随者业务数据日渐增长对数据分库分表后需要有一个唯一ID来标识一条数据或消息数据库的自增ID显然不能满足需求此时一个能够生成全局唯一ID的系统是非常必要的。生成的唯一id需要具备哪些条件全局唯一性不能出现重复的ID号既然是唯一标识这是最基本的要求。趋势递增在MySQL InnoDB引擎中使用的是聚集索引由于多数RDBMS使用B-tree的数据结构来存储索引数据在主键的选择上面我们应该尽量使用有序的主键保证写入性能。单调递增保证下一个ID一定大于上一个ID例如事务版本号、IM增量消息、排序等特殊需求。信息安全如果ID是连续的恶意用户的扒取工作就非常容易做了直接按照顺序下载指定URL即可如果是订单号就更危险了竞对可以直接知道我们一天的单量。所以在一些应用场景下会需要ID无规则、不规则。UUID关于分布式id,很多人会想到使用UUIDUUID在唯一性上确实可以达到这个目的但它也存在很大的缺陷优点性能非常高本地生成没有网络消耗。缺点不易于存储UUID太长16字节128位通常以36长度的字符串表示很多场景不适用。信息不安全基于MAC地址生成UUID的算法可能会造成MAC地址泄露这个漏洞曾被用于寻找梅丽莎病毒的制作者位置。ID作为主键时在特定的环境会存在一些问题比如做DB主键的场景下UUID就非常不适用。(MySQL官方有明确的建议主键要尽量越短越好36个字符长度的UUID不符合要求。对MySQL索引不利如果作为数据库主键在InnoDB引擎下UUID的无序性可能会引起数据位置频繁变动严重影响性能。)snowflake世界上没有一片雪花是相同的这大概是snowflake名字的由来吧。SnowFlake算法是Twitter设计的一个可以在分布式系统中生成唯一的ID的算法它可以满足Twitter每秒上万条消息ID分配的请求这些消息ID是唯一的且有大致的递增顺序。snowflake算法的原理SnowFlake算法产生的ID是一个64位的整型结构如下(每一部分用“-”符号分隔)snowflake.png需要注意的是64位是二进制2的64次方 18446744073709551616这就是能表示的id的范围范围可以通过扩展序列号或则工作机器id来增加id的上限。1位标识部分在java中由于long的最高位是符号位正数是0负数是1一般生成的ID为正数所以为041位时间戳部分这个是毫秒级的时间一般实现上不会存储当前的时间戳而是时间戳的差值(当前时间-固定的开始时间)这样可以使产生的ID从更小值开始41位的时间戳可以使用69年(1L 41) / (1000L * 60 * 60 * 24 * 365) 69年10位节点部分Twitter实现中使用前5位作为数据中心标识后5位作为机器标识可以部署1024个节点在Spring Cloud中可以为每一个实例生成唯一的机器识别码这样就能保证每个实例中生成的id都不一样。12位序列号部分支持同一毫秒内同一个节点可以生成4096(2的12次方)个ID这个同样可以扩展但其实每毫秒生成4096个id已经能满足大部分场景了。算法的java代码/*** twitter的snowflake算法 -- java实现** author beyond* date 2016/11/26*/public class SnowFlake {/*** 起始的时间戳(最后的时间 当前时间戳 - 起始的时间戳)*/private final static long START_STMP 1480166465631L;/*** 每一部分占用的位数*/private final static long SEQUENCE_BIT 12; //序列号占用的位数private final static long MACHINE_BIT 5; //机器标识占用的位数private final static long DATACENTER_BIT 5;//数据中心占用的位数/*** 每一部分的最大值*/private final static long MAX_DATACENTER_NUM -1L ^ (-1L DATACENTER_BIT);private final static long MAX_MACHINE_NUM -1L ^ (-1L MACHINE_BIT);private final static long MAX_SEQUENCE -1L ^ (-1L SEQUENCE_BIT);/*** 每一部分向左的位移*/private final static long MACHINE_LEFT SEQUENCE_BIT;private final static long DATACENTER_LEFT SEQUENCE_BIT MACHINE_BIT;private final static long TIMESTMP_LEFT DATACENTER_LEFT DATACENTER_BIT;private long datacenterId; //数据中心private long machineId; //机器标识private long sequence 0L; //序列号private long lastStmp -1L;//上一次时间戳public SnowFlake(long datacenterId, long machineId) {// 校验datacenterId长度超过范围就抛异常if (datacenterId MAX_DATACENTER_NUM || datacenterId 0) {throw new IllegalArgumentException(datacenterId cant be greater than MAX_DATACENTER_NUM or less than 0);}// 校验machineId长度超过范围就抛异常if (machineId MAX_MACHINE_NUM || machineId 0) {throw new IllegalArgumentException(machineId cant be greater than MAX_MACHINE_NUM or less than 0);}this.datacenterId datacenterId;this.machineId machineId;}/*** 产生下一个ID** return*/public synchronized long nextId() {long currStmp getNewstmp();if (currStmp lastStmp) {throw new RuntimeException(Clock moved backwards. Refusing to generate id);}if (currStmp lastStmp) {//相同毫秒内序列号自增sequence (sequence 1) MAX_SEQUENCE;//同一毫秒的序列数已经达到最大if (sequence 0L) {currStmp getNextMill();}} else {//不同毫秒内序列号置为0sequence 0L;}lastStmp currStmp;//使用二进制的|运算符将4部分的值整合成我们需要的idreturn (currStmp - START_STMP) TIMESTMP_LEFT //时间戳部分| datacenterId DATACENTER_LEFT //数据中心部分| machineId MACHINE_LEFT //机器标识部分| sequence; //序列号部分}//如果当前毫秒值下的序列号用完就循环获取下个毫秒值如果没有获取到下个毫秒值就//一直循环下去private long getNextMill() {long mill getNewstmp();while (mill lastStmp) {mill getNewstmp();}return mill;}private long getNewstmp() {return System.currentTimeMillis();}public static void main(String[] args) {SnowFlake snowFlake new SnowFlake(2, 3);for (int i 0; i (1 12); i) {System.out.println(snowFlake.nextId());}}}总结10位节点部分在代码中分成了两个5位节点看具体需求也可以用一个10位节点代替。snowflake更多的是提供一种算法思想具体的id生成逻辑可以在此基础上进一步的优化。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83420.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!