互联网数据中心(Internet Data Center)简称IDC,就是电信部门利用已有的互联网通信线路、带宽资源,建立标准化的电信专业级机房环境,为企业、政府提供服务器托管、租用以及相关增值等方面的全方位服务。
通过使用电信的IDC服务器托管业务,企业或政府单位无需再建立自己的专门机房、铺设昂贵的通信线路,也无需高薪聘请网络工程师,即可解决自己使用互联网的许多专业需求。
IDC主机托管主要应用范围是网站发布、虚拟主机和电子商务等。比如网站发布,单位通过托管主机,从电信部门分配到互联网静态IP地址后,即可发布自己的www站点,将自己的产品或服务通过互联网广泛宣传;虚拟主机是单位通过托管主机,将自己主机的海量硬盘空间出租,为其他客户提供虚拟主机服务,使自己成为ICP服务提供商;电子商务是指单位通过托管主机,建立自己的电子商务系统,通过这个商业平台来为供应商、批发商、经销商和最终用户提供完善的服务。
用雪花算法的工具类,1秒内可以生成26万不重复的值,数据库的主键不要自增,手动设置
package entityimport java.lang.management.ManagementFactory
import java.net.InetAddress
import java.net.NetworkInterface
/**
* <p>名称:IdWorker.java</p>
* <p>描述:分布式自增长ID</p>
* <pre>
* Twitter的 Snowflake JAVA实现方案
* </pre>
* 核心代码为其IdWorker这个类实现,其原理结构如下,我分别用一个0表示一位,用—分割开部分的作用:
* 1||0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---000000000000
* 在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间,
* 然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识),
* 然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。
* 这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分),
* 并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。
* <p>
* 64位ID (42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加))
*
* @author Polim
*/
public class IdWorker {
// 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动)
private final static long twepoch = 1288834974657L
// 机器标识位数
private final static long workerIdBits = 5L
// 数据中心标识位数
private final static long datacenterIdBits = 5L
// 机器ID最大值
private final static long maxWorkerId = -1L ^ (-1L << workerIdBits)
// 数据中心ID最大值
private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits)
// 毫秒内自增位
private final static long sequenceBits = 12L
// 机器ID偏左移12位
private final static long workerIdShift = sequenceBits
// 数据中心ID左移17位
private final static long datacenterIdShift = sequenceBits + workerIdBits
// 时间毫秒左移22位
private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits
private final static long sequenceMask = -1L ^ (-1L << sequenceBits)
/* 上次生产id时间戳 */
private static long lastTimestamp = -1L
// 0,并发控制
private long sequence = 0L
private final long workerId
// 数据标识id部分
private final long datacenterId
public IdWorker(){
this.datacenterId = getDatacenterId(maxDatacenterId)
this.workerId = getMaxWorkerId(datacenterId, maxWorkerId)
}
/**
* @param workerId
* 工作机器ID
* @param datacenterId
* 序列号
*/
public IdWorker(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
}
/**
* 获取下一个ID
*
* @return
*/
public synchronized long nextId() {
long timestamp = timeGen()
if (timestamp < lastTimestamp) {
throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp))
}
if (lastTimestamp == timestamp) {
// 当前毫秒内,则+1
sequence = (sequence + 1) & sequenceMask
if (sequence == 0) {
// 当前毫秒内计数满了,则等待下一秒
timestamp = tilNextMillis(lastTimestamp)
}
} else {
sequence = 0L
}
lastTimestamp = timestamp
// ID偏移组合生成最终的ID,并返回ID
long nextId = ((timestamp - twepoch) << timestampLeftShift)
| (datacenterId << datacenterIdShift)
| (workerId << workerIdShift) | sequence
return nextId
}
private long tilNextMillis(final long lastTimestamp) {
long timestamp = this.timeGen()
while (timestamp <= lastTimestamp) {
timestamp = this.timeGen()
}
return timestamp
}
private long timeGen() {
return System.currentTimeMillis()
}
/**
* <p>
* 获取 maxWorkerId
* </p>
*/
protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) {
StringBuffer mpid = new StringBuffer()
mpid.append(datacenterId)
String name = ManagementFactory.getRuntimeMXBean().getName()
if (!name.isEmpty()) {
/*
* GET jvmPid
*/
mpid.append(name.split("@")[0])
}
/*
* MAC + PID 的 hashcode 获取16个低位
*/
return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1)
}
/**
* <p>
* 数据标识id部分
* </p>
*/
protected static long getDatacenterId(long maxDatacenterId) {
long id = 0L
try {
InetAddress ip = InetAddress.getLocalHost()
NetworkInterface network = NetworkInterface.getByInetAddress(ip)
if (network == null) {
id = 1L
} else {
byte[] mac = network.getHardwareAddress()
id = ((0x000000FF & (long) mac[mac.length - 1])
| (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6
id = id % (maxDatacenterId + 1)
}
} catch (Exception e) {
System.out.println(" getDatacenterId: " + e.getMessage())
}
return id
}
public static void main(String[] args) {
//推特 26万个不重复的ID
IdWorker idWorker = new IdWorker(0,0)
for (int i = 0 i <2600 i++) {
System.out.println(idWorker.nextId())
}
}
}
身份(identification,
identity)
ID是英文IDentity的缩写,ID是身份标识号码的意思,就是一个序列号,也叫帐号,是一个编码,而且是唯一的.
用来标识事物的身份,针对某一具体事物,在同一系统中,它的ID号是不变的,至于到底用那个数字来标识
该事物,有系统设计者制定的一套规则来确定,这个规则有一定的主观性,比如员工的工号,身份证号码,
计算机的网址,端口号,运算指令,网卡的物理地址和逻辑地址,软件的注册号等等。
对于计算机来说,有两种运算方式,逻辑运算和算术运算,对应于逻辑运算,就是数字的ID功能,对于算术
运算,对应的就是数字的量化功能。正是数字的这两种基础作用,实现了计算机的所有功能。
当然,ID,在生活中是ID其实是很常见的,比如你想找个纸条分别贴在同类的事物上用以区分他们,这个就
可以叫做ID,比如,产品的型号,生产号,设备的注册号等等,不胜枚举。
工业设计的英文缩写
(industry
design)
id
Software
ID也是Adobe
InDesign软件的缩写,详细资料参见Adobe
InDesign
传染病
Infectious
Diseases
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)