1. 程式人生 > >Java叢集環境下全域性唯一流水ID生成方法之一

Java叢集環境下全域性唯一流水ID生成方法之一

package com.pfq.deal.risk.util;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 生成30位唯一數: yyyyMMddHHmmssSSS+伺服器IP後5位+3位遞增序號+5位隨機數
 * 如果將系統部署到叢集上面,情況有會有不同了,不同的伺服器叢集生成的這個數字,是有重合的概率的,
 * 因此,一般情況是,將叢集中的每個機器進行IP編碼,然後將機器編碼放在這個標識中以示區分
 * 
 * @author Dabria_ly 2017年8月24日
 */
public class Uidutil {
private static final Logger LOG = LoggerFactory.getLogger(Uidutil.class);
private static String no = "0";
private static String dateValue = "";//預設精確到毫秒的比對時間
private static Random rand = new Random();


public static synchronized String next() throws UnknownHostException {
String ipStr = InetAddress.getLocalHost().getHostAddress();// 獲取本機IP
ipStr = ipStr.substring(ipStr.indexOf("." + 2)).replace(".", "");
if(ipStr.length() > 5){
ipStr = ipStr.substring(0, 5);
}
String dateStr = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
String num = new StringBuilder().append(dateStr)
                        .append(ipStr).toString();
if (!(String.valueOf(dateStr)).equals(dateValue)) {//不是同一個時段,從0開始遞增序號
no = "0";
dateValue = dateStr;
}
num += getNo(no, num);
return num;
}


/**
 * 返回當前序號+1
 */
public static String getNo(String noCount, String num) {
long i = Long.parseLong(noCount);
i += 1;
noCount = "" + i;
for (int j = noCount.length(); j < 25 - num.length(); j++) {
noCount = "0" + noCount;
}
no = noCount;
return noCount;
}


/**
 * 利用Set中不允許有重複的元素的特性,來判斷集合元素中是否有重複元素
 * 
 * @param list:被判斷的集合
 * @return false:有重複元素或list為null; true:沒有重複元素
 */
private static boolean hasSame(List<? extends Object> list) {
if (null == list)
return false;
return list.size() == new HashSet<Object>(list).size();
}

/**
 * next()+5位隨機數
 * @return
 * @throws UnknownHostException
 */
public static String getTransactionId() throws UnknownHostException{
return new StringBuilder().append(next())
.append(String.valueOf(rand.nextInt(99999 - 10000 + 1) + 10000)).toString();
}


public static void main(String[] args) {
final List<String> guidList = new ArrayList<String>();
for (int i = 0; i < 10; i++) {// 開啟10個執行緒
new Thread(new Runnable() {
@Override
public void run() {
for (int j = 0; j < 10000; j++) {// 每個執行緒迴圈1w條資料
try {
String guid = getTransactionId();
System.out.println("guid="+guid+",length="+guid.length());
guidList.add(guid);
} catch (UnknownHostException e) {
LOG.error("未知主機IP錯誤-->【{}】", e);
}
}


}


}).start();
}


try {
Thread.sleep(30000);// sleep 30秒
LOG.info("集合個數-->【{}】", guidList.size());
LOG.info("沒有重複元素-->【{}】", hasSame(guidList));
} catch (InterruptedException e) {
LOG.error("sleep error-->【{}】", e);
}
}
}

相關推薦

Java叢集環境全域性唯一流水ID生成方法之一

package com.pfq.deal.risk.util; import java.net.InetAddress; import java.net.UnknownHostException; import java.text.SimpleDateFormat; im

分散式環境全域性唯一ID生成方案

方案1:UUID 優點:能夠非常簡便地保證分散式環境中的唯一性; 缺點: 長度過長,包含32個字元和4個短線; 沒有業務含義,不便於問題排查; 原理: 機器標識(MAC地址、IP地址)+系統

web叢集全域性唯一request id生成演算法, 替代uuid等“通用”方案

如何為每一個web請求分配一個在全叢集範圍內都唯一的request id 卻又不想去實現一個複雜的集中式id序列生成器呢? UUID? 這或許是個辦法,但不覺得不太甘心麼? 下面的這個方式可能可以幫到你: package test; import java.util.concur

可實現的全域性唯一有序ID生成策略

在部落格園搜素全域性唯一有序ID,羅列出來的文章大致講述了以下幾個問題,常見的生成全域性唯一id的常見方法 :使用資料庫自動增長序列實現 ; 使用UUID實現;  使用redis實現; 使用Twitter的snowflake演算法實現;使用資料庫+本地快取實現

java生產環境找出佔用CUP較多資源執行緒 相對定位先用top命令找出佔用資源厲害的java程序id

在這裡對linux下、sun(oracle) JDK的執行緒資源佔用問題的查詢步驟做一個小結;linux環境下,當發現java程序佔用CPU資源很高,且又要想更進一步查出哪一個java執行緒佔用了CPU資源時,按照以下步驟進行查詢: 先用top命令找出佔用資源厲害的ja

MySQL分庫分表環境全域性ID生成方案

摘要 介紹來自flicker和twitter的兩種解決分散式環境下全域性ID生成方案。 在大型網際網路應用中,隨著使用者數的增加,為了提高應用的效能,我們經常需要對資料庫進行分庫分表操作。在單表時代,我們可以完全依賴於資料庫的自增ID來唯一標識一個使用者或資料物件。但是

高併發分散式環境中獲取全域性唯一ID[分散式資料庫全域性唯一主鍵生成]

需求說明 在過去單機系統中,生成唯一ID比較簡單,可以使用mysql的自增主鍵或者oracle中的sequence, 在現在的大型高併發分散式系統中,以上策略就會有問題了,因為不同的資料庫會部署到不同的機器上,一般都是多主例項,而且再加上高併發的話,就會有重複

叢集環境module載入模組與作業提交

叢集上已安裝了軟體,卻無法呼叫,許可權不足的情況下,往往管理賬戶會開放一個埠,讓我能夠只用module命令來載入相關軟體。 module使用 管理賬戶modules的安裝 sudo yum install -y environment-modules mo

java生產環境記憶體調優

Tomcat 效能監控與調優 Nginx 效能監控與調優 JVM 層 GC 調優 JAVA程式碼層調優 1.JVM的引數型別 標準引數(各版本中保持穩定) -help -server -client -version -showversion -cp -classpath

Java併發環境的佇列(Queue)概述

本文作者:王一飛,叩丁狼高階講師。原創文章,轉載請註明出處。    概念 佇列 佇列是一種特殊的線性表,是一種先進先出(FIFO)的資料結構。它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操

Redis叢集環境的-RedLock(真分散式鎖) 實踐

在不同程序需要互斥地訪問共享資源時,分散式鎖是一種非常有用的技術手段。 有很多三方庫和文章描述如何用Redis實現一個分散式鎖管理器,但是這些庫實現的方式差別很大,而且很多簡單的實現其實只需採用稍微增加一點複雜的設計就可以獲得更好的可靠性。 這篇文章的目的就是嘗試提出一種官方權威的用Redis實現分散式鎖管理

spark叢集環境使用hanlp進行中文分詞

標籤:zab table import shel – java standard mas tokenizer 1、將下載的hanlp-portable-1.6.2.jar複製到叢集spark/jar資料夾下面 2、啟動spark叢集 spark/bin/spark-shel

[JVM]Java生產環境效能監控與調優詳解_Btrace

本章關鍵詞:BTrace、攔截、注意事項 一、入門 1.做什麼的? 可以在應用程式不重啟,不修改的情況下,正在執行的情況下,動態的修改位元組碼,達到監控除錯的目的 可以動態的向目標應用程式的位元組碼注入追蹤程式碼 用到的技術 JavaComplierApi、J

[JVM]Java生產環境效能監控與調優_參考文件連結

第二章 jdk8工具集 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.html Troubleshooting https://docs.oracle.com/javase/8/doc

Java生產環境效能監控與調優詳解

第8章 JVM位元組碼與Java程式碼層調優 本章帶大家學習JVM的位元組碼指令,從位元組碼層面講解一些常見問題的底層原理(面試能回答上的話, 絕對加分),比如:i++和++i哪一種效率高?迴圈體中做字串+拼接為什麼效率低?然後會重點對String做講解,包括String常量池的變化、String字面

tomcat叢集環境實現負載均衡、session共享

一、 高可用      高可用HA(High Availability)是分散式系統穩定執行必須考慮的因素之一,它指的是通過處理減少系統不能提供服務的時間。比如說系統能夠一直正常提供服務,我們就說這個系統可用性為100%。      我們知道,單點系統是高可用的公敵,線上系統應該儘量避免

Tomcat叢集環境實現單點登入

一、問題分析 在tomcat叢集環境下,session是不能在tomcat之間共享的,所以會導致如下問題,如圖所示: 通一個瀏覽器傳送多次請求,請求可能會被nginx轉發到不同的tomcat上,因為session不能共享,可能會導致登入成功後,發起其他的請求,返回給使用者的依舊

叢集環境的一些特殊問題

1、什麼是cluster    一個cluster是由兩個或是多個獨立的、通過網路連線的servers組成的。幾個硬體供應商多年以來提供了Cluster效能的各種需求。一些Clusters僅僅為了提供高可用性的,在當前活動的node發生故障時轉移到次節點node。另一些是為了提供分散式的連線、工作的可

spring4.2.9 java專案環境ioc原始碼分析 (九)——refresh之postProcessBeanFactory方法

postProcessBeanFactory後處理beanFactory。時機是在所有的beanDenifition載入完成之後,bean例項化之前執行。比如,在beanfactory載入完成所有的bean後,想修改其中某個bean的定義,或者對beanFactory做一些其

shiro 在叢集環境用redis(叢集版)做session共享

如今叢集環境已是伺服器主流,在叢集環境中,session共享一般通過應用伺服器的session複製或者儲存在公用的快取伺服器上,本文主要介紹通過Shiro管理session,並將session快取到redis叢集版中,這樣可以在叢集中使用。 Shiro除了在管理sess