成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一種高效的唯一標(biāo)識符

開發(fā) 前端
唯一標(biāo)識符可用于與一條信息相關(guān)聯(lián),以便以后可以明確地引用信息。它可以是事件、請求、訂單 ID 或客戶 ID。

程序中的唯一標(biāo)識符對于跟蹤非常有用。當(dāng)這些 id 包含高分辨率時(shí)間戳?xí)r,它們會更加有用。

唯一標(biāo)識符不僅記錄事件的時(shí)間,而且是唯一可以幫助跟蹤通過系統(tǒng)的事件。

這種獨(dú)特的時(shí)間戳根據(jù)實(shí)現(xiàn)方式的不一樣,所需要的成本會比較高。

接下來我們探討了一種輕量級的方法,可以在我們研發(fā)中生成一個(gè)獨(dú)特的、單調(diào)遞增的納秒分辨率時(shí)間戳。

唯一標(biāo)識符的用途

唯一標(biāo)識符可用于與一條信息相關(guān)聯(lián),以便以后可以明確地引用信息。它可以是事件、請求、訂單 ID 或客戶 ID。

它們的業(yè)務(wù)可以用作數(shù)據(jù)庫或鍵/值存儲中的主鍵,以便后面檢索辨識該信息。

生成這些標(biāo)識符的挑戰(zhàn)之一是在不增加成本的同時(shí)避免創(chuàng)建重復(fù)項(xiàng)。

我們可以記錄在數(shù)據(jù)庫中創(chuàng)建的每個(gè)標(biāo)識符,但是我們要添加更多標(biāo)識符時(shí),這會使用 O(n) 存儲。

您可以生成一個(gè)隨機(jī)標(biāo)識符,例如不太可能重復(fù)的 UUID,但是,這會創(chuàng)建比較大 id(不要看只是一個(gè)字符串,當(dāng)量大時(shí),就非常龐大了),否則不包含任何信息。例如,UUID 可能看起來像

d85686f5-7a53-4682-9177-0b64037af336。

此 UUID 可以存儲為 16 個(gè)字節(jié),但通常存儲為占用 40 個(gè)字節(jié)內(nèi)存的對象。

使用 256 位可降低重復(fù)標(biāo)識符的風(fēng)險(xiǎn),但會使內(nèi)存增加一倍。

時(shí)間戳作為唯一標(biāo)識符

使用時(shí)間戳有兩個(gè)好處。您不需要存儲太多信息,因?yàn)闀r(shí)鐘是驅(qū)動程序的。您只需要檢查兩個(gè)不同時(shí)間的線程,缺點(diǎn)是在重新啟動時(shí)丟失,例如,時(shí)鐘時(shí)間應(yīng)該已經(jīng)足夠長,仍然不會得到重復(fù)的時(shí)間戳。

這樣的標(biāo)識符也更容易閱讀,并提供對跟蹤有用的附加信息。基于時(shí)間戳的唯一標(biāo)識符可能類似于2021-12-20T23:30:51.8453925。

這個(gè)時(shí)間戳可以存儲在 LocalDateTime 對象中,可以存儲為 8 個(gè)字節(jié)長。

MappedUniqueTimeProvider 代碼

這是GitHub 上提供的MappedUniqueTimeProvider的精簡版

/**
* Timestamps are unique across threads/processes on a single machine.
*/
public enum MappedUniqueTimeProvider implements TimeProvider {
INSTANCE;
private final Bytes bytes;
private TimeProvider provider = SystemTimeProvider.INSTANCE;
MappedUniqueTimeProvider() {
String user = System.getProperty("user.name", "unknown");
MappedFile file = MappedFile.mappedFile(OS.TMP + "/.time-stamp." + user + ".dat", OS.pageSize(), 0);
bytes = file.acquireBytesForWrite(mumtp, 0);
}
@Override
public long currentTimeNanos() throws IllegalStateException {
long time = provider.currentTimeNanos(), time5 = time >>> 5;
long time0 = bytes.readVolatileLong(LAST_TIME), timeNanos5 = time0 >>> 5;

if (time5 > timeNanos5 && bytes.compareAndSwapLong(LAST_TIME, time0, time))
return time;
while (true) {
time0 = bytes.readVolatileLong(LAST_TIME);
long next = (time0 + 0x20) & ~0x1f;
if (bytes.compareAndSwapLong(LAST_TIME, time0, next))
return next;
Jvm.nanoPause();
}
}
}

以下技術(shù)已用于確保時(shí)間戳的唯一性和效率

內(nèi)存共享

TimeProvider 使用共享內(nèi)存來確保納秒分辨率時(shí)間是唯一的。內(nèi)存映射文件以線程安全的方式訪問,以確保時(shí)間戳單調(diào)遞增。Chronicle Bytes有一個(gè)庫支持對內(nèi)存映射文件的線程安全訪問。

讀取內(nèi)存映射文件中的值并嘗試在循環(huán)中更新。CAS 或compare-and-swap操作是原子的,并檢查先前的值沒有被另一個(gè)線程更改。當(dāng)然,這是在同一臺服務(wù)上的一個(gè)線程上操作。

存儲一個(gè)納秒的時(shí)間戳

我們使用原始的 long 來存儲時(shí)間戳可以提高效率,但這可更難使用,我們支持print和解析稱為。

NanoTimestampLongConverter的長時(shí)間戳,我們也將這些時(shí)間戳解析并隱式呈現(xiàn)為文本使其更容易打印、調(diào)試和創(chuàng)建單元測試。

public class Event extends SelfDescribingMarshallable {
@LongConversion(NanoTimestampLongConverter.class)
long time;
}
Event e = new Event();
e.time = CLOCK.currentTimeNanos();
String str = e.toString();
Event e2 = Marshallable.fromString(str);
System.out.println(e2);
Prints
!net.openhft.chronicle.wire.Event {
time: 2021-12-20T23:30:51.8453925
}

由于納秒時(shí)間戳是一種高分辨率格式,它只會持續(xù)到 2262 年作為有符號長整數(shù)或 2554 年,值溢出之前,可以假設(shè)它是無符號長整數(shù)。

我們已經(jīng)將時(shí)間戳中的額外位置用于其他目的,例如存儲主機(jī)標(biāo)識符或源 ID。出于這個(gè)原因,我們還確保時(shí)間戳對于 32 ns 的倍數(shù)是唯一的,我們?nèi)绻敢猓梢詫⒌?5 位用于其他目的。

效果

在正常操作下,在服務(wù)器上獲得唯一的納秒時(shí)間戳需要不到 50 ns。在繁重的多線程負(fù)載下,可能需要幾百納秒。

MappedUniqueTimeProvider 應(yīng)用程序可以維持超過 3000 萬/秒的生成。

可重啟性

只要時(shí)間不倒退,這種策略就可以丟失所有狀態(tài),但仍能確保僅從時(shí)鐘上的唯一性。如果時(shí)鐘時(shí)間確實(shí)倒退了一個(gè)小時(shí),那么狀態(tài)將確保沒有重復(fù),但是,在時(shí)鐘趕上之前,時(shí)間戳不會與時(shí)鐘匹配。

結(jié)論

可以有一個(gè)輕量級的、唯一的標(biāo)識符生成器來保存納秒時(shí)間戳。

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2023-05-28 00:09:21

2009-12-08 19:29:10

PHP生成唯一標(biāo)識符

2024-04-07 00:00:02

Android設(shè)備標(biāo)識符

2009-07-21 12:59:25

Scala標(biāo)識符

2024-03-13 08:23:08

分布式系統(tǒng)隨機(jī)

2009-09-23 10:41:10

對象標(biāo)識符Hibernate

2012-02-08 14:01:18

HibernateJava

2009-08-26 14:01:18

C#標(biāo)識符

2023-03-07 15:08:57

2020-12-23 10:10:23

Pythonweb代碼

2022-06-22 09:44:41

Python文件代碼

2022-07-07 10:33:27

Python姿勢代碼

2020-12-09 10:15:34

Pythonweb代碼

2024-01-18 15:38:17

語言模型大型語言模型

2009-04-16 18:52:43

Vmware虛擬化虛擬機(jī)

2024-05-09 08:00:00

2011-04-27 09:17:30

程序員

2009-10-27 14:20:37

VB.NET動態(tài)標(biāo)識符

2017-02-08 08:40:21

C++固定內(nèi)存塊

2024-11-01 08:00:00

順序劃分算法循環(huán)劃分算法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧产日产国产精品视频 | av在线免费观看网站 | 91美女在线观看 | 日本中文字幕一区 | 怡红院怡春院一级毛片 | 日韩欧美中文在线 | 男人天堂av网站 | 精品中文字幕一区二区 | 亚洲成人毛片 | 狠狠色综合久久婷婷 | 伊大人久久 | 日韩在线观看网站 | 亚洲精品91 | 国产伦精品一区二区 | 国产美女视频一区 | 国产色网 | 免费视频一区二区 | 高清亚洲 | 亚洲福利一区 | 久久久久国产精品午夜一区 | 久久99久久| 另类一区| 日本中文字幕在线观看 | 天天艹天天干天天 | aaa一区 | www.99热这里只有精品 | 中文字幕在线观看第一页 | 一二区视频 | 欧美日本一区二区 | 亚洲国产精品久久人人爱 | 中文字幕日韩欧美 | 性视频网| 综合精品久久久 | 黄色香蕉视频在线观看 | 国产精品观看 | 狠狠干影院 | 亚洲a毛片| 99久久免费精品国产男女高不卡 | 成年人在线视频 | 黄色网址在线免费观看 | 欧美一区视频 |