Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 久久久精品麻豆,一本一道久久a久久精品综合,国产精品久久久久影院

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          前端入門學習之 JavaScript Number

          前端入門學習之 JavaScript Number 對象

          avaScript Number 對象

          JavaScript 只有一種數字類型。

          可以使用也可以不使用小數點來書寫數字。

          JavaScript 數字

          JavaScript 數字可以使用也可以不使用小數點來書寫:

          實例

          var pi=3.14;    // 使用小數點
          var x=34;       // 不使用小數點
          

          極大或極小的數字可通過科學(指數)計數法來寫:

          實例

          var y=123e5;    // 12300000
          var z=123e-5;   // 0.00123
          

          所有 JavaScript 數字均為 64 位

          JavaScript 不是類型語言。與許多其他編程語言不同,JavaScript 不定義不同類型的數字,比如整數、短、長、浮點等等。

          JavaScript 中的所有數字都存儲為根為 10 的 64 位(8 比特),浮點數。

          精度

          整數(不使用小數點或指數計數法)最多為 15 位。

          小數的最大位數是 17,但是浮點運算并不總是 100% 準確:

          實例

          var x=0.2+0.1;
          

          八進制和十六進制

          如果前綴為 0,則 JavaScript 會把數值常量解釋為八進制數,如果前綴為 0 和 "x",則解釋為十六進制數。

          實例

          var y=0377;
          var z=0xFF;
          

          提示:絕不要在數字前面寫零,除非您需要進行八進制轉換。

          數字屬性和方法

          屬性:

          • MAX VALUE
          • MIN VALUE
          • NEGATIVE INFINITIVE
          • POSITIVE INFINITIVE
          • NaN
          • prototype
          • constructor

          方法:

          • toExponential()
          • toFixed()
          • toPrecision()
          • toString()
          • valueOf()

          我建了一個【前端學習群】,【免費領取學習資料】或學習的同學可以關注我:前端學習交流 - 知乎

          、新建項目

          1、新建===web項目===輸入項目名稱====完成


          二、新建html文件

          在新建項目中新建html模板


          輸入文件名稱:


          三、認識基本格式


          聯想出基本格式:



          四、編輯html文件


          運行html,選擇瀏覽器



          五、html常用的快捷鍵

          (1)ctrl+n+w web項目創建



          (2)ctrl+n+h html文檔創建


          (3)ctrl+s 保存html頁面(頁面上如果未保存會顯示*號)



          (4)ctrl+r html運行
          (5)ctrl+z 撤回
          (6)!+tab鍵 聯想基本格式
          (7)ctrl+/ 注釋和取消注釋



          (8)ctrl+鼠標滾輪, 字體方大和縮小


          六、認識標簽

          (1)H標簽(標題標簽)



          (2)p標簽 (段落標簽)



          (3)img 標簽(圖片標簽)
          兩種:第一種widows上傳圖片,第二種:網上圖片鏈接

          第一種


          img中顯示圖片

          img中引入圖片




          第二種:網上圖片的鏈接:




          (4) 標簽(空格)



          (5)em 標簽表示斜體



          (6)i 標簽表示斜體



          (7)br 表示換行



          (8)b 標簽表示加粗



          (9) strong 標簽表示加粗



          (10)s 標簽(刪除線)




          (11)u 標簽 (下劃線)



          (12)font 顏色



          (13)sub下標
          (14)sup上標

          .訂單號生成的原則:

          1.全局的唯一性

          2.自增長

          3.長度的要求

          4.具有一定的可讀性

          5.保密,不可推測性

          6.效率性

          二.實現方案

          常見的ID生成策略。 1. 數據庫自增長序列或字段 2. UUID 3. UUID的變種*【UUID to Int64;NHibernate在其主鍵生成方式中提供了Comb算法(combined guid/timestamp)】 4. Redis生成ID 5. Twitter的snowflake算法 6. 利用zookeeper的znode生成唯一ID 7. MongoDB的ObjectId

          三.高并發下怎樣生成唯一的訂單號?

          如果沒有并發,訂單號只在一個線程內產生,那么由于程序是順序執行的,不同訂單的生成時間一定不同,因此用時間就可以區分各個訂單。

          如果存在并發,且訂單號是由一個進程中的多個線程產生的,那么只要把線程ID添加到序列號中就可以保證訂單號唯一。

          如果存在并發,且訂單號是由同一臺主機中的多個進程產生的,那么只要把進程ID添加到序列號中就可以保證訂單號唯一。

          如果存在并發,且訂單號是由不同臺主機產生的,那么MAC地址、IP地址或CPU序列號等能夠區分主機的號碼添加到序列號中就可以保證訂單號唯一。

          1. 機器碼(3位, 分布式節點),年月日分時秒(12位),遞增的序列(4位),當并發遞增序列超過4位時,秒數+1,序列從0開始計時,這樣每秒支持9999個訂單號生成,隔天序列清為0.

          2.后臺統一生成的訂單號后,推入redis,一次性推個幾十W個,檢查剩余多少后,再推,也可以保證高并發的場景。

          四.Twitter開源分布式自增ID算法snowflake

          1.snowflake簡介

          互聯網快速發展的今天,分布式應用系統已經見怪不怪,在分布式系統中,我們需要各種各樣的ID,既然是ID那么必然是要保證全局唯一,除此之外,不同當業務還需要不同的特性,比如像并發巨大的業務要求ID生成效率高,吞吐大;比如某些銀行類業務,需要按每日日期制定交易流水號;又比如我們希望用戶的ID是隨機的,無序的,純數字的,且位數長度是小于10位的。等等,不同的業務場景需要的ID特性各不一樣,于是,衍生了各種ID生成器,但大多數利用數據庫控制ID的生成,性能受數據庫并發能力限制,那么有沒有一款不需要依賴任何中間件(如數據庫,分布式緩存服務等)的ID生成器呢?本著取之于開源,用之于開源的原則,今天,特此介紹Twitter開源的一款分布式自增ID算法snowflake,并附上算法原理推導和演算過程!

          snowflake算法是一款本地生成的(ID生成過程不依賴任何中間件,無網絡通信),保證ID全局唯一,并且ID總體有序遞增,性能每秒生成300w+。

          2.snowflake算法原理

          snowflake生產的ID是一個18位的long型數字,二進制結構表示如下(每部分用-分開):

          0 - 00000000 00000000 00000000 00000000 00000000 0 - 00000 - 00000 - 00000000 0000

          第一位未使用,接下來的41位為毫秒級時間(41位的長度可以使用69年,從1970-01-01 08:00:00),然后是5位datacenterId(最大支持2^5=32個,二進制表示從00000-11111,也即是十進制0-31),和5位workerId(最大支持2^5=32個,原理同datacenterId),所以datacenterId*workerId最多支持部署1024個節點,最后12位是毫秒內的計數(12位的計數順序號支持每個節點每毫秒產生2^12=4096個ID序號).

          所有位數加起來共64位,恰好是一個Long型(轉換為字符串長度為18).

          單臺機器實例,通過時間戳保證前41位是唯一的,分布式系統多臺機器實例下,通過對每個機器實例分配不同的datacenterId和workerId避免中間的10位碰撞。最后12位每毫秒從0遞增生產ID,再提一次:每毫秒最多生成4096個ID,每秒可達4096000個。理論上,只要CPU計算能力足夠,單機每秒可生產400多萬個,實測300w+,效率之高由此可見。

          (該節改編自:http://www.cnblogs.com/relucent/p/4955340.html)

          3.snowflake算法源碼(java版)

          @ToString
          @Slf4j
          public class SnowflakeIdFactory {
           
              private final long twepoch=1288834974657L;
              private final long workerIdBits=5L;
              private final long datacenterIdBits=5L;
              private final long maxWorkerId=-1L ^ (-1L << workerIdBits);
              private final long maxDatacenterId=-1L ^ (-1L << datacenterIdBits);
              private final long sequenceBits=12L;
              private final long workerIdShift=sequenceBits;
              private final long datacenterIdShift=sequenceBits + workerIdBits;
              private final long timestampLeftShift=sequenceBits + workerIdBits + datacenterIdBits;
              private final long sequenceMask=-1L ^ (-1L << sequenceBits);
           
              private long workerId;
              private long datacenterId;
              private long sequence=0L;
              private long lastTimestamp=-1L;
           
           
           
              public SnowflakeIdFactory(long workerId, long datacenterId) {
                  if (workerId > maxWorkerId || workerId < 0) {
                      throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
                  }
                  if (datacenterId > maxDatacenterId || datacenterId < 0) {
                      throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
                  }
                  this.workerId=workerId;
                  this.datacenterId=datacenterId;
              }
           
              public synchronized long nextId() {
                  long timestamp=timeGen();
                  if (timestamp < lastTimestamp) {
                      //服務器時鐘被調整了,ID生成器停止服務.
                      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;
                  }
           
                  lastTimestamp=timestamp;
                  return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence;
              }
           
              protected long tilNextMillis(long lastTimestamp) {
                  long timestamp=timeGen();
                  while (timestamp <=lastTimestamp) {
                      timestamp=timeGen();
                  }
                  return timestamp;
              }
           
              protected long timeGen() {
                  return System.currentTimeMillis();
              }
           
              public static void testProductIdByMoreThread(int dataCenterId, int workerId, int n) throws InterruptedException {
                  List<Thread> tlist=new ArrayList<>();
                  Set<Long> setAll=new HashSet<>();
                  CountDownLatch cdLatch=new CountDownLatch(10);
                  long start=System.currentTimeMillis();
                  int threadNo=dataCenterId;
                  Map<String,SnowflakeIdFactory> idFactories=new HashMap<>();
                  for(int i=0;i<10;i++){
                      //用線程名稱做map key.
                      idFactories.put("snowflake"+i,new SnowflakeIdFactory(workerId, threadNo++));
                  }
                  for(int i=0;i<10;i++){
                      Thread temp=new Thread(new Runnable() {
                          @Override
                          public void run() {
                              Set<Long> setId=new HashSet<>();
                              SnowflakeIdFactory idWorker=idFactories.get(Thread.currentThread().getName());
                              for(int j=0;j<n;j++){
                                  setId.add(idWorker.nextId());
                              }
                              synchronized (setAll){
                                  setAll.addAll(setId);
                                  log.info("{}生產了{}個id,并成功加入到setAll中.",Thread.currentThread().getName(),n);
                              }
                              cdLatch.countDown();
                          }
                      },"snowflake"+i);
                      tlist.add(temp);
                  }
                  for(int j=0;j<10;j++){
                      tlist.get(j).start();
                  }
                  cdLatch.await();
           
                  long end1=System.currentTimeMillis() - start;
           
                  log.info("共耗時:{}毫秒,預期應該生產{}個id, 實際合并總計生成ID個數:{}",end1,10*n,setAll.size());
           
              }
           
              public static void testProductId(int dataCenterId, int workerId, int n){
                  SnowflakeIdFactory idWorker=new SnowflakeIdFactory(workerId, dataCenterId);
                  SnowflakeIdFactory idWorker2=new SnowflakeIdFactory(workerId+1, dataCenterId);
                  Set<Long> setOne=new HashSet<>();
                  Set<Long> setTow=new HashSet<>();
                  long start=System.currentTimeMillis();
                  for (int i=0; i < n; i++) {
                      setOne.add(idWorker.nextId());//加入set
                  }
                  long end1=System.currentTimeMillis() - start;
                  log.info("第一批ID預計生成{}個,實際生成{}個<<<<*>>>>共耗時:{}",n,setOne.size(),end1);
           
                  for (int i=0; i < n; i++) {
                      setTow.add(idWorker2.nextId());//加入set
                  }
                  long end2=System.currentTimeMillis() - start;
                  log.info("第二批ID預計生成{}個,實際生成{}個<<<<*>>>>共耗時:{}",n,setTow.size(),end2);
           
                  setOne.addAll(setTow);
                  log.info("合并總計生成ID個數:{}",setOne.size());
           
              }
           
              public static void testPerSecondProductIdNums(){
                  SnowflakeIdFactory idWorker=new SnowflakeIdFactory(1, 2);
                  long start=System.currentTimeMillis();
                  int count=0;
                  for (int i=0; System.currentTimeMillis()-start<1000; i++,count=i) {
                      /**  測試方法一: 此用法純粹的生產ID,每秒生產ID個數為300w+ */
                      idWorker.nextId();
                      /**  測試方法二: 在log中打印,同時獲取ID,此用法生產ID的能力受限于log.error()的吞吐能力.
                       * 每秒徘徊在10萬左右. */
                      //log.error("{}",idWorker.nextId());
                  }
                  long end=System.currentTimeMillis()-start;
                  System.out.println(end);
                  System.out.println(count);
              }
           
              public static void main(String[] args) {
                  /** case1: 測試每秒生產id個數?
                   *   結論: 每秒生產id個數300w+ */
                  //testPerSecondProductIdNums();
           
                  /** case2: 單線程-測試多個生產者同時生產N個id,驗證id是否有重復?
                   *   結論: 驗證通過,沒有重復. */
                  //testProductId(1,2,10000);//驗證通過!
                  //testProductId(1,2,20000);//驗證通過!
           
                  /** case3: 多線程-測試多個生產者同時生產N個id, 全部id在全局范圍內是否會重復?
                   *   結論: 驗證通過,沒有重復. */
                  try {
                      testProductIdByMoreThread(1,2,100000);//單機測試此場景,性能損失至少折半!
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
           
              }
          }

          測試用例

          /** case1: 測試每秒生產id個數?
           *   結論: 每秒生產id個數300w+ */
          //testPerSecondProductIdNums();
           
          /** case2: 單線程-測試多個生產者同時生產N個id,驗證id是否有重復?
           *   結論: 驗證通過,沒有重復. */
          //testProductId(1,2,10000);//驗證通過!
          //testProductId(1,2,20000);//驗證通過!
           
          /** case3: 多線程-測試多個生產者同時生產N個id, 全部id在全局范圍內是否會重復?
           *   結論: 驗證通過,沒有重復. */
          try {
              testProductIdByMoreThread(1,2,100000);//單機測試此場景,性能損失至少折半!
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
           

          4.snowflake算法推導和演算過程
          說明:
          演算使用的對象實例:SnowflakeIdFactory idWorker=new SnowflakeIdFactory(1, 2);
          運行時數據workerId=1,datacenterId=2,分別表示機器實例的生產者編號,數據中心編號;
          sequence=0表示每毫秒生產ID從0開始計數遞增;
          以下演算基于時間戳=1482394743339時刻進行推導。
          一句話描述:以下演算模擬了1482394743339這一毫秒時刻,workerId=1,datacenterId=2的id生成器,生產第一個id的過程。


          主站蜘蛛池模板: 日韩视频在线观看一区二区| 国产福利微拍精品一区二区| 成人一区专区在线观看| 一区二区三区在线免费| 无码精品不卡一区二区三区| 国产精品高清一区二区人妖| 东京热无码一区二区三区av| 日本一区二区三区精品视频| 无码中文字幕一区二区三区| 亚洲一区二区三区免费视频| 台湾无码一区二区| 果冻传媒董小宛一区二区| 亚洲国产专区一区| 精品无码人妻一区二区三区不卡| 精品视频一区二区三区在线播放| 免费无码一区二区三区蜜桃大| 亚洲中文字幕一区精品自拍| 精品午夜福利无人区乱码一区| 久久久久人妻精品一区二区三区 | 波多野结衣在线观看一区 | 视频一区二区在线观看| 国产成人高清亚洲一区久久| 韩国福利视频一区二区| 日韩三级一区二区| 精品一区二区三区无码免费直播| 精品日韩一区二区三区视频| 国产亚洲福利一区二区免费看 | 中文字幕aⅴ人妻一区二区 | 无码喷水一区二区浪潮AV| 亚洲日本va一区二区三区| 精品无码综合一区二区三区| 国产精品综合一区二区| 福利一区福利二区| 中文人妻无码一区二区三区| 亚洲视频一区二区在线观看| 国产精品视频一区麻豆| 国产在线一区二区杨幂| 果冻传媒一区二区天美传媒| 亚洲狠狠狠一区二区三区| 精品人妻少妇一区二区三区不卡| 成人精品一区二区激情|