JanusGraph — 緩存(janusgraph caching)

  • 2019 年 10 月 4 日
  • 筆記

13.1 Caching

JanusGraph採用多層數據緩存來促進快速圖形遍歷。這裡按照從JanusGraph事務中訪問它們的順序列出了緩存層。緩存越接近事務,緩存訪問越快,內存佔用和維護開銷就越高。

13.2 Transaction-Level 緩存

在一個打開的事務中,JanusGraph維護着兩個緩存:

  • Vertex 緩存:緩存訪問的頂點及其鄰接列表(或其子集),以便後續訪問在同一事務中明顯更快。因此,該緩存加速了迭代遍歷。
  • Index 緩存:緩存索引查詢的結果,以便後續索引調用可以從內存中提供,而不是調用索引後端,並且(通常)等待一次或多次網絡往返。

這兩者的大小由 transaction cache size決定。事務緩存大小可以通過緩存配置 cache.tx-cache-size配置。通過事務構建器graph.buildTransaction()打開事務並使用setVertexCacheSize(int)方法,可以根據每個事務打開一個事務。

13.2.1 Vertex 緩存

頂點緩存包含頂點及其在特定事務中檢索的鄰接列表的子集。此高速緩存中維護的最大頂點數等於事務高速緩存大小。如果事務工作負載是迭代遍歷,則頂點緩存將顯着加快速度。如果在事務中不再訪問相同的頂點,則事務級緩存將沒有區別。

請注意,堆上頂點緩存的大小不僅取決於它可以容納的頂點數量,還取決於它們的鄰接列表的大小。換句話說,具有大鄰接列表(即許多入射邊緣)的頂點將比具有較小列表的頂點消耗更多空間。

此外,請注意,修改後的頂點固定在緩存中,這意味着它們無法被驅逐,因為這將導致失去其更改。因此,包含大量修改的事務最終可能會使用大於配置的頂點緩存。

13.2.2 Index緩存

索引緩存包含在此事務的上下文中執行的索引查詢的結果。隨後的相同索引調用將從此緩存提供,因此明顯更便宜。如果同一個索引調用在同一個事務中永遠不會發生兩次,則索引緩存沒有區別。

索引高速緩存中的每個條目的權重等於,2 + result set size並且高速緩存的總權重不會超過事務高速緩存大小的一半。

13.3 Database Level 緩存

數據庫級高速緩存在多個事務中並且在單個事務的持續時間之外保留鄰接列表(或其子集)。數據庫級緩存由數據庫中的所有事務共享。它比事務級別緩存更節省空間,但訪問速度也稍慢。與事務級別緩存相比,數據庫級緩存在關閉事務後不會立即過期。因此,數據庫級緩存顯着加快了跨越事務的讀取繁重工作負載的圖形遍歷。

第15章,配置參考列出了與JanusGraph的數據庫級緩存有關的所有配置選項。此頁面解釋了它們的用法。

最重要的是,默認情況下,在當前版本的JanusGraph中禁用數據庫級緩存。要啟用它,請設置cache.db-cache=true。

13.3.1 緩存到期時間

性能和查詢行為最重要的設置是通過配置的緩存過期時間cache.db-cache-time。緩存將保存圖形元素最多幾毫秒。如果元素到期,則在下次訪問時將從存儲後端重新讀取數據。

如果只有一個JanusGraph實例訪問存儲後端,或者此實例是唯一修改圖形的實例,則緩存過期可以設置為0,從而禁用緩存過期。這允許緩存無限期地保存元素(除非它們由於空間限制或更新而被逐出),這提供了最佳的緩存性能。由於沒有其他JanusGraph實例正在修改圖形,因此不存在保持過時數據的危險。

如果有多個JanusGraph實例訪問存儲後端,則應將時間設置為修改圖形的另一個 JanusGraph實例與查看數據的JanusGraph實例之間允許的最長時間。如果所有JanusGraph實例都應立即看到任何更改,則應在分佈式設置中禁用數據庫級緩存。但是,對於大多數應用程序來說,特定的JanusGraph實例可以通過一些延遲看到遠程修改。最大允許延遲越大,緩存性能越好。請注意,無論配置的緩存過期時間如何,給定的JanusGraph實例將始終立即看到自己對圖形的修改。

13.3.2 緩存大小

配置選項cache.db-cache-size控制允許JanusGraph的數據庫級緩存消耗多少堆空間。緩存越大,它就越有效。但是,較大的高速緩存大小可能導致GC過多和性能不佳。

高速緩存大小可以配置為運行JanusGraph的JVM可用的總堆空間的百分比(表示為0到1之間的小數)或絕對位元組數。

請注意,緩存大小是指緩存專用的堆空間量。JanusGraph的其他數據結構和每個打開的事務都將佔用額外的堆空間。如果其他軟件層在同一JVM中運行,那麼這些軟件層也可能佔用大量的堆空間(例如Gremlin Server,嵌入式Cassandra等)。保守堆內存估計。配置太大的緩存可能導致內存不足異常和過多的GC。

13.3.3 清理等待時間

當本地修改頂點(例如添加邊)時,所有頂點的相關數據庫級緩存條目都被標記為已過期並最終被逐出。這將導致JanusGraph在下次訪問時從存儲後端刷新頂點數據並重新填充緩存。

但是,當存儲後端最終一致時,觸發驅逐的修改可能尚不可見。通過配置cache.db-cache-clean-wait,緩存將在使用從存儲後端檢索的條目重新填充緩存之前至少等待這麼多毫秒。

如果JanusGraph在本地運行或針對存儲後端運行,以確保立即可見修改,則此值可以設置為0。

13.4 Storage Backend 緩存

每個存儲後端都維護自己的數據緩存層。這些緩存受益於壓縮,數據緊湊性,協調過期,並且通常在堆外維護,這意味着可以使用大型緩存而不會遇到垃圾收集問題。雖然這些緩存可能比數據庫級緩存大得多,但它們訪問速度也較慢。

如果轉載此博文,請附上本文鏈接https://blog.csdn.net/csdn___lyy,謝謝合作~ 如果感覺這篇文章對您有所幫助,請點擊一下「喜歡」或者「關注」博主,您的喜歡和關注將是我前進的最大動力!=.=