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

天门市网站建设_网站建设公司_H5网站_seo优化

网站301和302,一起学网站培训心得,张店免费做网站,阿里云个人网站建设转载自 漫画#xff1a;什么是SnowFlake算法方法一#xff1a;UUIDUUID是通用唯一识别码 (Universally Unique Identifier)#xff0c;在其他语言中也叫GUID#xff0c;可以生成一个长度32位的全局唯一识别码。String uuid UUID.randomUUID().toString()结果示例#xff…转载自 漫画什么是SnowFlake算法方法一UUIDUUID是通用唯一识别码 (Universally Unique Identifier)在其他语言中也叫GUID可以生成一个长度32位的全局唯一识别码。String uuid UUID.randomUUID().toString()结果示例046b6c7f-0b8a-43b9-b35d-6489e6daee91为什么无序的UUID会导致入库性能变差呢这就涉及到 B树索引的分裂众所周知关系型数据库的索引大都是B树的结构拿ID字段来举例索引树的每一个节点都存储着若干个ID。如果我们的ID按递增的顺序来插入比如陆续插入8910新的ID都只会插入到最后一个节点当中。当最后一个节点满了会裂变出新的节点。这样的插入是性能比较高的插入因为这样节点的分裂次数最少而且充分利用了每一个节点的空间。但是如果我们的插入完全无序不但会导致一些中间节点产生分裂也会白白创造出很多不饱和的节点这样大大降低了数据库插入的性能。方法二数据库自增主键假设名为table的表有如下结构id        feild 35        a每一次生成ID的时候访问数据库执行下面的语句begin; REPLACE INTO table ( feild )  VALUES ( a ); SELECT LAST_INSERT_ID(); commit; REPLACE INTO 的含义是插入一条记录如果表中唯一索引的值遇到冲突则替换老数据。这样一来每次都可以得到一个递增的ID。为了提高性能在分布式系统中可以用DB proxy请求不同的分库每个分库设置不同的初始值步长和分库数量相等这样一来DB1生成的ID是1,4,7,10,13....DB2生成的ID是2,5,8,11,14.....————————————初识SnowFlakesnowflake算法所生成的ID结构是什么样子呢我们来看看下图SnowFlake所生成的ID一共分成四部分1.第一位 占用1bit其值始终是0没有实际作用。2.时间戳 占用41bit精确到毫秒总共可以容纳约69 年的时间。3.工作机器id 占用10bit其中高位5bit是数据中心IDdatacenterId低位5bit是工作节点IDworkerId做多可以容纳1024个节点。4.序列号 占用12bit这个值在同一毫秒同一节点上从0开始不断累加最多可以累加到4095。SnowFlake算法在同一毫秒内最多可以生成多少个全局唯一ID呢只需要做一个简单的乘法同一毫秒的ID数量 1024 X 4096   4194304这个数字在绝大多数并发场景下都是够用的。SnowFlake的代码实现//初始时间截 (2017-01-01) private static final long INITIAL_TIME_STAMP 1483200000000L;//机器id所占的位数 private static final long WORKER_ID_BITS 5L;//数据标识id所占的位数 private static final long DATACENTER_ID_BITS 5L;//支持的最大机器id结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) private static final long MAX_WORKER_ID ~(-1L WORKER_ID_BITS);//支持的最大数据标识id结果是31 private static final long MAX_DATACENTER_ID ~(-1L DATACENTER_ID_BITS);//序列在id中占的位数 private final long SEQUENCE_BITS 12L;//机器ID的偏移量(12) private final long WORKERID_OFFSET SEQUENCE_BITS;//数据中心ID的偏移量(125) private final long DATACENTERID_OFFSET SEQUENCE_BITS SEQUENCE_BITS;//时间截的偏移量(5512) private final long TIMESTAMP_OFFSET SEQUENCE_BITS WORKER_ID_BITS DATACENTER_ID_BITS;//生成序列的掩码这里为4095 (0b1111111111110xfff4095) private final long SEQUENCE_MASK ~(-1L SEQUENCE_BITS);//工作节点ID(0~31) private long workerId;//数据中心ID(0~31) private long datacenterId;//毫秒内序列(0~4095) private long sequence 0L;//上次生成ID的时间截 private long lastTimestamp -1L;/*** 构造函数** param workerId 工作ID (0~31)* param datacenterId 数据中心ID (0~31)*/ public SnowFlakeIdGenerator(long workerId, long datacenterId) {if (workerId MAX_WORKER_ID || workerId 0) {throw new IllegalArgumentException(String.format(WorkerID 不能大于 %d 或小于 0, MAX_WORKER_ID));}if (datacenterId MAX_DATACENTER_ID || datacenterId 0) {throw new IllegalArgumentException(String.format(DataCenterID 不能大于 %d 或小于 0, MAX_DATACENTER_ID));}this.workerId workerId;this.datacenterId datacenterId; }/*** 获得下一个ID (用同步锁保证线程安全)** return SnowflakeId*/ public synchronized long nextId() {long timestamp System.currentTimeMillis();//如果当前时间小于上一次ID生成的时间戳说明系统时钟回退过这个时候应当抛出异常if (timestamp lastTimestamp) {throw new RuntimeException(当前时间小于上一次记录的时间戳);}//如果是同一时间生成的则进行毫秒内序列if (lastTimestamp timestamp) {sequence (sequence 1) SEQUENCE_MASK;//sequence等于0说明毫秒内序列已经增长到最大值if (sequence 0) {//阻塞到下一个毫秒,获得新的时间戳timestamp tilNextMillis(lastTimestamp);}}//时间戳改变毫秒内序列重置else {sequence 0L;}//上次生成ID的时间截lastTimestamp timestamp;//移位并通过或运算拼到一起组成64位的IDreturn ((timestamp - INITIAL_TIME_STAMP) TIMESTAMP_OFFSET)| (datacenterId DATACENTERID_OFFSET)| (workerId WORKERID_OFFSET)| sequence; }/*** 阻塞到下一个毫秒直到获得新的时间戳** param lastTimestamp 上次生成ID的时间截* return 当前时间戳*/ protected long tilNextMillis(long lastTimestamp) {long timestamp System.currentTimeMillis();while (timestamp lastTimestamp) {timestamp System.currentTimeMillis();}return timestamp; }public static void main(String[] args) {final SnowFlakeIdGenerator idGenerator new SnowFlakeIdGenerator(1, 1);//线程池并行执行10000次ID生成ExecutorService executorService Executors.newCachedThreadPool();;for (int i 0; i 10000; i) {executorService.execute(new Runnable() {Overridepublic void run() {long id idGenerator.nextId();System.out.println(id);}});}executorService.shutdown(); } 这段代码改写自网上的SnowFlake算法实现有几点需要解释一下1.获得单一机器的下一个序列号使用Synchronized控制并发而非CAS的方式是因为CAS不适合并发量非常高的场景。2.如果当前毫秒在一台机器的序列号已经增长到最大值4095则使用while循环等待直到下一毫秒。3.如果当前时间小于记录的上一个毫秒值则说明这台机器的时间回拨了抛出异常。但如果这台机器的系统时间在启动之前回拨过那么有可能出现ID重复的危险。SnowFlake的优势和劣势SnowFlake算法的优点1.生成ID时不依赖于DB完全在内存生成高性能高可用。2.ID呈趋势递增后续插入索引树的时候性能较好。SnowFlake算法的缺点依赖于系统时钟的一致性。如果某台机器的系统时钟回拨有可能造成ID冲突或者ID乱序。
http://www.ihoyoo.com/news/71922.html

相关文章:

  • 义乌门户网站建设天门市网站建设seo
  • 淘客优惠券网站怎么做wordpress实现图片全屏代码
  • 培训机构网站源码福田网站建设运营费用
  • 兰州网站排名优化公司北京app制作
  • 邢台开发区网站微网站制作网站开发
  • 用asp做网站需要什么软件策划推广公司
  • 农业网站建设方案网络营销产品策略分析
  • seo网站优化方案书免费聊天不充值软件
  • 做网站怎么让字居右网站制作价格 上海
  • 枣庄市建设局网站wordpress有什么数据库引擎
  • 温州做网站定制网站换空间上怎么办啊
  • 网站推广软件费用是多少织梦本地做网站
  • 如何制作购物网站网站仿制公司
  • 上海哪个网站最好用电子商务基础网站建设
  • 进口网站建设在线A视频网站l一级A做爰片
  • 学做网站用谁的书网站新建网页
  • aspcms手机网站怎么做网站建设整体方案论文
  • 云商网站建设成都比较好的网站制作公司
  • 交易网站开发有没有专门做老年婚介的网站
  • 网站开发实习总结在百度上做广告推广要多少钱
  • 仿购物网站目录网站营销方式
  • 销售案例网站怎么查询域名
  • 任县网站制作手机app网页制作
  • 源码超市网站源码前潮网络网站建设
  • 吴家山网站建设公司重庆建设摩托车股份有限公司官网
  • 凡科删除建设的网站windows2008 iis网站 指定域名
  • 郑州交易网站建设关于网站建设征求意见
  • 嘉禾县网站建设推广公司江门网站推广设计
  • 企业做网站需要在通管局备案开广告公司需要学什么技术
  • 网站首页怎么做手机电影网站怎么做