Hammerspace ... 是一個粉絲想像的超次元、可立即存取的儲存區域,在虛構故事中用來解釋動畫、漫畫和遊戲角色如何憑空變出物體。
這個 gem 提供持久、可並行存取的非堆積字串儲存,並具有熟悉的類雜湊介面。它針對批量寫入和隨機讀取進行了優化。
應用程式經常使用永遠不會改變或很少改變的資料。在許多情況下,存取這些資料時可以接受一些延遲。例如,使用者的個人資料可以從網路服務、資料庫或像 memcache 這樣的外部共享快取載入。在其他情況下,延遲則敏感得多。例如,翻譯可能會被多次使用,而從外部快取存取它們時,即使產生 ~2 毫秒的延遲,速度也會慢得令人無法接受。
為了解決效能問題,這種類型的資料通常在應用程式啟動時載入到應用程式中。不幸的是,這意味著資料儲存在堆積上,垃圾收集器必須在每次執行時掃描這些物件(至少在 Ruby MRI 的情況下)。此外,對於使用多個進程的應用程式伺服器,每個進程都有自己的資料副本,這是記憶體使用的低效率方式。
Hammerspace 通過將資料從堆積移動到磁碟來解決這些問題。利用針對批量寫入和隨機讀取優化的程式庫和資料結構,可以維持可接受的效能水準。由於資料是持久的,因此除非資料已更改,否則無需在應用程式啟動時從外部快取或服務重新載入資料。
不幸的是,這些底層程式庫並不總是支援並行寫入。Hammerspace 添加了並行控制,允許多個進程安全地更新和讀取單一共享的資料副本。最後,Hammerspace 的介面設計成模仿 Ruby 的 Hash
,以簡化與現有應用程式的整合。通過實作使用程式庫的新後端,可以使用不同的底層程式庫。(目前,僅支援 Sparkey。)後端只需要實作一小組方法([]
、[]=
、close
、delete
、each
、uid
),但如果底層程式庫支援更有效率的實作,則可以覆蓋其他方法的預設實作。