毫秒

推特(Twitter)的Snowflake算法——用于生成唯一ID

允我心安 提交于 2019-12-22 20:52:11
1.前言   关于如何在系统中生成唯一性ID的问题(如订单号、批次号等),一直困扰了许久。因为还要考虑并发的问题,所以时间戳+随机数的组合并不可取,Java中的UUID是一种可取的方法,但它的缺点是序列号太长了,而且没有可读性,对用户来说这么一堆乱码是极不友好的。   推特的工程师snowflake也提出了一个在分布式系统中生成唯一序列的方法。SnowFlake的优点是,效率高,整体上按照时间自增排序,提高了序列号的可读性,对用户来说也比较友好,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分)。 2.SnowFlake算法的Java实现 1 /** 2 * @author Jakeylove3 3 * 2017/12/31 4 */ 5 6 /** 7 * Twitter_Snowflake 8 * SnowFlake的结构如下(每部分用-分开): 9 * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 10 * 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0 11 * 41位时间戳(毫秒级),注意,41位时间戳不是存储当前时间的时间戳,而是存储时间戳的差值(当前时间戳 -

js Date

亡梦爱人 提交于 2019-12-21 08:13:17
Date 对象用于处理日期和时间。 创建 Date 对象的语法: var myDate=new Date() Date 对象会自动把当前日期和时间保存为其初始值。 参数形式有以下5种: new Date("month dd,yyyy hh:mm:ss"); new Date("month dd,yyyy"); new Date(yyyy,mth,dd,hh,mm,ss); new Date(yyyy,mth,dd); new Date(ms); 注意最后一种形式,参数表示的是需要创建的时间和GMT时间1970年1月1日之间相差的毫秒数。各种函数的含义如下: month:用英文表示月份名称,从January到December mth:用整数表示月份,从(1月)到11(12月) dd:表示一个月中的第几天,从1到31 yyyy:四位数表示的年份 hh:小时数,从0(午夜)到23(晚11点) mm:分钟数,从0到59的整数 ss:秒数,从0到59的整数 ms:毫秒数,为大于等于0的整数 如: new Date("January 12,2006 22:19:35"); new Date("January 12,2006"); new Date(2006,0,12,22,19,35); new Date(2006,0,12); new Date(1137075575000); Date()

JS 取当前日期、时间的代码

五迷三道 提交于 2019-12-19 00:25:01
<SCRIPT LANGUAGE="JavaScript"> <!-- var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-????) myDate.getMonth(); //获取当前月份(0-11,0代表1月) myDate.getDate(); //获取当前日(1-31) myDate.getDay(); //获取当前星期X(0-6,0代表星期天) myDate.getTime(); //获取当前时间(从1970.1.1开始的毫秒数) myDate.getHours(); //获取当前小时数(0-23) myDate.getMinutes(); //获取当前分钟数(0-59) myDate.getSeconds(); //获取当前秒数(0-59) myDate.getMilliseconds(); //获取当前毫秒数(0-999) myDate.toLocaleDateString(); //获取当前日期 var mytime=myDate.toLocaleTimeString(); //获取当前时间 myDate.toLocaleString( ); //获取日期与时间 if (mytime<"23:30:00") { alert

javascript中Date常用方法

混江龙づ霸主 提交于 2019-12-17 10:10:02
一、Date的构造函数 有四种形式的Date构造函数: //1.构造函数没有参数,则返回当前日期的Date对象 var now=new Date(); //2.构造函数的参数为日期的毫秒数,返回距离1970年1月1日经过该毫秒后对应的日期 var date=new Date(1222233); //3.构造函数的参数为对应的日期字符串,返回对应的日期对象,其中年,月,日是必须的,时分秒可选 //实际上,上面这种直接将表示日期的字符串传递给Date构造函数,会在后台调用Date.parse var date1=new Date('2016-01-01'); var date2=new Date('2016/01/01 12:00:00'); //4.构造函数的参数分别为年份,基于0的月份(0-11),月中的哪一天(1-31),小时数(0-23),分钟,秒以及毫秒。 //在这些参数中,只有前两个参数(年和月)是必需的。如果没有提供月中的天数,则假设天数为1,如果省略其他参数,则统统假设为0 //实际上,上面这种情况的构造函数,在后台调用了Date.UTC var date2=new Date(2016,4,5,17,55,55); 二、返回日期对应的毫秒数 1.Date.parse() Date.parse()接收一个日期字符串,返回该日期对应的毫秒数。 2.Date.UTC()

分布式ID生成方法

痞子三分冷 提交于 2019-12-17 09:12:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id (2)订单标识:order-id (3)帖子标识:tiezi-id 这个记录标识往往就是数据库中的唯一主键,数据库上会建立聚集索引(cluster index),即在物理存储上以这个字段排序。 这个记录标识上的查询,往往又有分页或者排序的业务需求,例如: (1)拉取最新的一页消息:selectmessage-id/ order by time/ limit 100 (2)拉取最新的一页订单:selectorder-id/ order by time/ limit 100 (3)拉取最新的一页帖子:selecttiezi-id/ order by time/ limit 100 所以往往要有一个time字段,并且在time字段上建立普通索引(non-cluster index)。 我们都知道普通索引存储的是实际记录的指针,其访问效率会比聚集索引慢,如果记录标识在生成时能够基本按照时间有序,则可以省去这个time字段的索引查询: select message-id/ (order by message-id)/limit 100 再次强调,能这么做的前提是,message-id的生成基本是趋势时间递增的。

JavaScript 获取当前时间戳

感情迁移 提交于 2019-12-17 03:28:01
JavaScript 获取当前时间戳: 第一种方法: var timestamp = Date.parse(new Date()); 结果:1280977330000 第二种方法: var timestamp = (new Date()).valueOf(); 结果:1280977330748 第三种方法: var timestamp=new Date().getTime(); 结果:1280977330748 以上代码将获取从 1970年1月1日午夜开始的毫秒数。二者的区别是,第一种方法的毫秒位上为全零,即只是精确到秒的毫秒数,第二和第三种方法得到的结果一样 来源: https://www.cnblogs.com/vaiyanzi/archive/2010/08/05/1792931.html

分布式ID生成 - 雪花算法

廉价感情. 提交于 2019-12-16 13:20:25
雪花算法是一种生成分布式全局唯一ID的经典算法,关于雪花算法的解读网上多如牛毛,大多抄来抄去,这里请参考耕耘的小象大神的博客ID生成器,Twitter的雪花算法(Java) 网上的教程一般存在两个问题: 1. 机器ID(5位)和数据中心ID(5位)配置没有解决,分布式部署的时候会使用相同的配置,任然有ID重复的风险。 2. 使用的时候需要实例化对象,没有形成开箱即用的工具类。 本文针对上面两个问题进行解决,笔者的解决方案是,workId使用服务器hostName生成,dataCenterId使用IP生成,这样可以最大限度防止10位机器码重复,但是由于两个ID都不能超过32,只能取余数,还是难免产生重复,但是实际使用中,hostName和IP的配置一般连续或相近,只要不是刚好相隔32位,就不会有问题,况且,hostName和IP同时相隔32的情况更加是几乎不可能的事,平时做的分布式部署,一般也不会超过10台容器。 使用上面的方法可以零配置使用雪花算法,雪花算法10位机器码的设定理论上可以有1024个节点,生产上使用docker配置一般是一次编译,然后分布式部署到不同容器,不会有不同的配置,这里不知道其他公司是如何解决的,即使有方法使用一套配置,然后运行时根据不同容器读取不同的配置,但是给每个容器编配ID,1024个(大部分情况下没有这么多),似乎也不太可能

ActiveMQ的作用总结(应用场景及优势)

馋奶兔 提交于 2019-12-16 03:36:59
业务场景说明 : 消息队列在大型电子商务类网站,如京东、淘宝、去哪儿等网站有着深入的应用, 队列的 主要作用 是 消除高并发访问高峰 , 加快网站的响应速度 。 在不使用消息队列的情况下,用户的请求数据直接写入数据库,在高并发的情况下,会对数据库造成巨大的压力,同时也使得系统响应延迟加剧。 在使用队列后,用户的 请求发给队列 后立即返回, (例如: 当然不能直接给用户提示订单提交成功,京东上提示:您“您提交了订单,请等待系统确认”), 再由消息队列的 消费者 进程 从消息队列 中 获取数据 , 异步写入数据库 。 由于消息队列的服务处理速度 远快于数据库 ,因此用户的 响应延迟可得到有效改善 。 图解说明: 1. 消息队列说明 消息队列中间件是 分布式系统中重要的组件 ,主要解决应用耦合,异步消息,流量削锋等问题。 实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。 目前在生产环境,使用较多的消息队列有 ActiveMQ , RabbitMQ , ZeroMQ , Kafka , MetaMQ , RocketMQ 等。 2. 消息队列应用场景 消息队列在实际应用中常用的使用场景。 异步处理,应用解耦,流量削锋和消息通讯四个场景 。 2.1. 异步处理 场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种 1. 串行的方式; 2. 并行方式。

格式化日期,日期转化

社会主义新天地 提交于 2019-12-15 00:51:22
let date = new Date ( ) ; var timestamp1 = Date.parse ( new Date ( )) ; //转化成毫秒数 console.log ( timestamp1, "data" ) ; var myDate = new Date ( ) ; console.log ( myDate.getFullYear ( )) ; //获取完整的年份 ( 4位,1970-???? ) console.log ( myDate.getMonth ( )) ; //获取当前月份 ( 0-11,0代表1月 ) console.log ( myDate.getDate ( )) ; //获取当前日 ( 1-31 ) console.log ( myDate.getDay ( )) ; //获取当前星期X ( 0-6,0代表星期天 ) console.log ( myDate.getTime ( )) ; //获取当前时间 ( 从1970.1.1开始的毫秒数 ) console.log ( myDate.getHours ( )) ; //获取当前小时数 ( 0-23 ) console.log ( myDate.getMinutes ( )) ; //获取当前分钟数 ( 0-59 ) console.log ( myDate.getSeconds (

JS---BOM---定时器

隐身守侯 提交于 2019-12-11 20:40:09
定时器 参数1:函数 参数2:时间---毫秒---1000毫秒--1秒 执行过程: 页面加载完毕后, 过了1秒, 执行一次函数的代码, 又过了1秒再执行函数..... 返回值就是定时器的id值 var timeId = setInterval(function () { alert("hello"); }, 2000); //点击按钮,停止定时器 //参数:要清理的定时的id的值 document.getElementById("btn").onclick = function () { window.clearInterval(timeId); }; 来源: https://www.cnblogs.com/jane-panyiyun/p/12024943.html