KV鍵值對存儲大家都很熟悉了,Java 中的 map 都是在堆內存儲,如果我們遇到一種情況是map特別大,每次GC我們不想釋放這些空間,那么這一部分緩存數據又該如何處理呢?當然大家說可以使用第三方緩存組件:Redis,HBase,MongoDB,今天給大家多一種選擇:堆外內存。
今天要給大家介紹的是一款使用堆外內存構建本地緩存行的工具:Chronicle-Map 。官網上給出該工具的特性:
-
高吞吐量,低延遲,跨進程,持久鍵值存儲;
-
堆外數據存儲,延遲時間為微秒;
-
基於ConcurrentHashMap;
-
TCP連接;
-
彈性寫入,如果進程終止,則最后一次寫入不會丟失;
-
僅復制最新值即可支持很高的更新率;
-
超低延遲:在某些測試中,Chronicle Map的目標是讀取和寫入查詢的平均延遲小於1微秒;
-
高並發性:寫查詢可以很好地擴展到服務器中硬件執行線程的數量。讀取查詢永遠不會互相阻塞;
-
磁盤持久性 -(可選);
-
多主復制 -(可選,商業功能)-最終一致的,完全冗余的服務器間異步復制,默認情況下“最后寫入勝出”策略允許實現基於狀態的自定義CRDT策略。
下面說一下使用方式:
<dependency>
<groupId>net.openhft</groupId>
<artifactId>chronicle-map</artifactId>
<version>3.17.2</version>
</dependency>
創建一個普通的KV存儲:
ChronicleMap<Long, String> userMap = ChronicleMap
.of(Long.class, String.class)
.name("user-map")
.entries(50)
.create();
userMap.put(1122L,"xiaming");
創建一個String 類型的 map,初始值為50個空間。
創建可持久化的KV存儲:
try {
ChronicleMap<Long, String> persistedUserMap = ChronicleMap
.of(Long.class, String.class)
.name("user-map")
.entries(50)
.createPersistedTo(new File(System.getProperty("user.home") + "/user.data"));
} catch (IOException e) {
e.printStackTrace();
}