当前位置: 首页 > news >正文

dede的网站地图微信小程序注册流程

dede的网站地图,微信小程序注册流程,做婚庆网站图片下载,外贸网站建设推广雪花算法#xff08;Twitter_Snowflake#xff09; 我们知道#xff0c;分布式全局唯一id的生成#xff0c;一般是以下几种#xff1a; 基于雪花算法生成基于数据库基于redis基于zookeeper 本文说下雪花算法#xff0c;后面附源码以及测试代码。 如下图#xff1a; …雪花算法Twitter_Snowflake 我们知道分布式全局唯一id的生成一般是以下几种 基于雪花算法生成基于数据库基于redis基于zookeeper 本文说下雪花算法后面附源码以及测试代码。 如下图 如上图雪花算法生成的id总共64位 第一位作为保留位默认0 中间41位用来存放时间戳是当前时间与初始时间的差值(1L 41) / (1000L * 60 * 60 * 24 * 365) 69年 后10位是机器id可满足同时(1L 10) 1024个机器同时生成id 最后12位作为随机序列每个机器每毫秒可生成(1L 12) 4096个不同的值 改进 其实雪花算法就是把id按位打散然后再分成上面这几块用位来表示状态这其实就是一种思想。 所以咱们实际在用的时候也不必非得按照上面这种分割只需保证总位数在64位即可 如果你的业务不需要69年这么长或者需要更长时间 用42位存储时间戳(1L 42) / (1000L * 60 * 60 * 24 * 365) 139年 用41位存储时间戳(1L 41) / (1000L * 60 * 60 * 24 * 365) 69年 用40位存储时间戳(1L 40) / (1000L * 60 * 60 * 24 * 365) 34年 用39位存储时间戳(1L 39) / (1000L * 60 * 60 * 24 * 365) 17年 用38位存储时间戳(1L 38) / (1000L * 60 * 60 * 24 * 365) 8年 用37位存储时间戳(1L 37) / (1000L * 60 * 60 * 24 * 365) 4年 如果你的机器没有那么1024个这么多或者比1024还多 用7位存储机器id(1L 7) 128 用8位存储机器id(1L 8) 256 用9位存储机器id(1L 9) 512 用10位存储机器id(1L 10) 1024 用11位存储机器id(1L 11) 2048 用12位存储机器id(1L 12) 4096 用13位存储机器id(1L 13) 8192 如果你的业务每个机器每毫秒最多也不会4096个id要生成或者比这个还多 用8位存储随机序列(1L 8) 256 用9位存储随机序列(1L 9) 512 用10位存储随机序列(1L 10) 1024 用11位存储随机序列(1L 11) 2048 用12位存储随机序列(1L 12) 4096 用13位存储随机序列(1L 13) 8192 用14位存储随机序列(1L 14) 16384 用15位存储随机序列(1L 15) 32768 注意随机序列建议不要太大一般业务每毫秒要是能产生这么多id建议在机器id上增加位 如果你的业务量很小比如一般情况下每毫秒生成不到1个id此时可以将随机序列设置成随机开始自增 比如从0到48随机开始自增算是一种优化建议 如果你有多个业务也可以拿出来几位来表示业务比如用最后4位支持16种业务的区分 如果你的业务特别复杂可以考虑128位存储不过这样的话也可以考虑使用uuid了但uuid无序这个有序 如果你的业务很简单甚至可以考虑32位存储时间戳改成秒为单位… 总结 合理的根据自己的实际情况去设计各个唯一条件的组合雪花算法只是提供了一种相对合理的方式。雪花算法这种用位来表示状态的我们还可以用在其他方面比如数据库存储可以用更小的空间去表示不同的状态位 包括各种底层的比如序列化也是有用到拆解位充分利用存储 源码 package com.zs.common;/*** Twitter_Snowflakebr* SnowFlake的结构如下(每部分用-分开):br* 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 br* 1位标识由于long基本类型在Java中是带符号的最高位是符号位正数是0负数是1所以id一般是正数最高位是0br* 41位时间截(毫秒级)注意41位时间截不是存储当前时间的时间截而是存储时间截的差值当前时间截 - 开始时间截)* 得到的值这里的的开始时间截一般是我们的id生成器开始使用的时间由我们程序来指定的如下下面程序IdWorker类的startTime属性。41位的时间截可以使用69年年T (1L 41) / (1000L * 60 * 60 * 24 * 365) 69br* 10位的数据机器位可以部署在1024个节点包括5位datacenterId和5位workerIdbr* 12位序列毫秒内的计数12位的计数顺序号支持每个节点每毫秒(同一机器同一时间截)产生4096个ID序号br* 加起来刚好64位为一个Long型。br* SnowFlake的优点是整体上按照时间自增排序并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分)并且效率较高经测试SnowFlake每秒能够产生26万ID左右。*/ public class SnowflakeIdWorker {// Fields/*** 开始时间截 (2015-01-01)*/private final long twepoch 1420041600000L;/*** 机器id所占的位数*/private final long workerIdBits 5L;/*** 数据标识id所占的位数*/private final long datacenterIdBits 5L;/*** 支持的最大机器id结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)*/private final long maxWorkerId -1L ^ (-1L workerIdBits);/*** 支持的最大数据标识id结果是31*/private final long maxDatacenterId -1L ^ (-1L datacenterIdBits);/*** 序列在id中占的位数*/private final long sequenceBits 12L;/*** 机器ID向左移12位*/private final long workerIdShift sequenceBits;/*** 数据标识id向左移17位(125)*/private final long datacenterIdShift sequenceBits workerIdBits;/*** 时间截向左移22位(5512)*/private final long timestampLeftShift sequenceBits workerIdBits datacenterIdBits;/*** 生成序列的掩码这里为4095 (0b1111111111110xfff4095)*/private final long sequenceMask -1L ^ (-1L sequenceBits);/*** 工作机器ID(0~31)*/private long workerId;/*** 数据中心ID(0~31)*/private long datacenterId;/*** 毫秒内序列(0~4095)*/private long sequence 0L;/*** 上次生成ID的时间截*/private long lastTimestamp -1L;//Constructors/*** 构造函数** param workerId 工作ID (0~31)* param datacenterId 数据中心ID (0~31)*/public SnowflakeIdWorker(long workerId, long datacenterId) {if (workerId maxWorkerId || workerId 0) {throw new IllegalArgumentException(String.format(worker Id cant be greater than %d or less than 0, maxWorkerId));}if (datacenterId maxDatacenterId || datacenterId 0) {throw new IllegalArgumentException(String.format(datacenter Id cant be greater than %d or less than 0, maxDatacenterId));}this.workerId workerId;this.datacenterId datacenterId;}// Methods/*** 获得下一个ID (该方法是线程安全的)** return SnowflakeId*/public synchronized long nextId() {long timestamp timeGen();//如果当前时间小于上一次ID生成的时间戳说明系统时钟回退过这个时候应当抛出异常if (timestamp lastTimestamp) {throw new RuntimeException(String.format(Clock moved backwards. Refusing to generate id for %d milliseconds, lastTimestamp - timestamp));}//如果是同一时间生成的则进行毫秒内序列if (lastTimestamp timestamp) {sequence (sequence 1) sequenceMask;//毫秒内序列溢出if (sequence 0) {//阻塞到下一个毫秒,获得新的时间戳timestamp tilNextMillis(lastTimestamp);}}//时间戳改变毫秒内序列重置else {sequence 0L;}//上次生成ID的时间截lastTimestamp timestamp;//移位并通过或运算拼到一起组成64位的IDreturn ((timestamp - twepoch) timestampLeftShift) //| (datacenterId datacenterIdShift) //| (workerId workerIdShift) //| sequence;}/*** 阻塞到下一个毫秒直到获得新的时间戳** param lastTimestamp 上次生成ID的时间截* return 当前时间戳*/protected long tilNextMillis(long lastTimestamp) {long timestamp timeGen();while (timestamp lastTimestamp) {timestamp timeGen();}return timestamp;}/*** 返回以毫秒为单位的当前时间** return 当前时间(毫秒)*/protected long timeGen() {return System.currentTimeMillis();}//Test/*** 测试*/public static void main(String[] args) {long start System.currentTimeMillis();SnowflakeIdWorker idWorker new SnowflakeIdWorker(1, 3);for (int i 0; i 50; i) {long id idWorker.nextId();System.out.println(Long.toBinaryString(id));System.out.println(id);}long end System.currentTimeMillis();System.out.println(end - start);} }
http://www.huolong8.cn/news/282893/

相关文章:

  • aje网站润色深圳网络seo优化
  • 福田做棋牌网站建设哪家技术好平台网站建设调研报告
  • 天津城市建设招标网站建设网站需要什么知识
  • 海口市住房和城乡建设局 网站网站设计制作行业排行
  • 镇巴作风建设网站八桂在线建设
  • 如何建设内网网站宿舍网站建设目的
  • 怎么给自己的网站做优化郑州网站推广招聘
  • 我想创建一个网站企业宣传册设计
  • 万荣网站seoseo现在还有前景吗
  • 电子商务网站建设方案的总结网站建设收费标准新闻
  • 浙江微信网站建设报价网页设计师工资一般多少钱一个月
  • 重庆网站排名优化公司产品网络推广
  • 扬州网站制作服务平台官网
  • 网站备案审核状态查询官网网站备案流程
  • 网站建设类岗位杭州wordpress 配置说明
  • 深圳福田住房和建设局网站网站建设验收意见
  • 公司做网站开发流程wordpress 手机 模板制作
  • 做互联网小程序 和网站有没有前景怎么在虚拟空间做两个网站
  • 网站申请流程全国企业信用信息公示系统广东
  • 如何创建手机网站wordpress单选框
  • 如何让网站显示404河南建网站 优帮云
  • 做网站贵么做房地产用什么网站好
  • 网站开发环境有哪些php互联网公司经营范围
  • 湖南网站建设公司速来磐石网络wordpress 模拟登陆
  • 两性做受技巧视频网站企业组织架构图
  • 网站开发图片存哪里wordpress 登录地址
  • 个人可以做哪些有意思的网站网站建设公司的小程序选择什么
  • 北京电脑培训网站网页设计美食范例简约
  • 企业公司网站嘉兴网站如何制作
  • pc网站建设建站模板陕西住房和城乡建设部网站