簡體   English   中英

Java中的內存中緩存對象

[英]In-memory caching objects in java

我想在內存中緩存對象。 要求如下:

  1. 每個記錄/對象都與唯一鍵相關聯。
  2. 400-500條記錄/要存儲的對象。 如果記錄數增加到超過指定的限制,則應將較舊的記錄逐出。
  3. 記錄不應保存超過2分鍾。
  4. 當JVM內存不足(弱引用類型)時,應縮小比例。
  5. 無法使用第三方庫,因為它的模塊很小,目的只是為了減少不必要的網絡訪問。
  6. 寫入次數多,讀取次數少

這里的安全性也是一個問題,因為我們將緩存一些敏感數據。 此數據將被緩存在內存中。 我真的應該擔心安全性並加密數據嗎?

我正在尋找一個提供類似功能的Java類。

目前,我正在考慮擴展WeakHashMap ,並實現各種私有/公共方法來滿足要求。

如果您有其他任何想法,請在這里分享。

您不想使用WeakHashMap SoftHashMap會更近一些,但在標准庫中不可用。 如果您是我,我將查看Guava的緩存類以獲取提示。

但是,還有一些其他想法:

當JVM內存不足(弱引用類型)時,應按比例縮小。

你的意思是soft reference 但是無論如何,這個要求對我來說有點難聞。 我承認這可能是一個有效的要求,但是很少有人真正需要它。 如果可以合理地很好地預測記錄的大小,並且計划對要緩存的記錄數量進行硬性限制,則很有可能不需要這種復雜性。

不應使用第三方庫。

每個人都提到這一點,他們是對的。

在安全性方面,對緩存在內存中的數據進行加密的有效性尚不確定。 您還必須將加密密鑰存儲在內存中。 我敢打賭,除了攻擊者讀取您的內存內容之外,還有很多事情要擔心。

不,您不應該這樣做。 WeakHashMap不是緩存!

現在,很容易理解為什么WeakHashMap無法用於緩存。 首先,它無論如何都不起作用,因為它對鍵而不是對地圖值使用軟引用。 但除此之外, 垃圾收集器會主動回收僅由弱引用引用的內存 這意味着一旦您丟失了對在WeakHashMap中用作鍵的對象的最后一個強引用,垃圾回收器將立即回收該映射條目。

...

那么,該如何在Java中實現緩存呢?

我的建議是使用免費提供的Cache實現之一,例如JCSOSCache 這些庫通過LRU和FIFO策略,磁盤溢出,數據到期和許多其他可選的高級功能提供了更好的內存管理。

正如@ user463324所提到的,您應該只使用已經實現了此功能的庫,例如Google Guava ,它已獲得Apache 2.0許可,沒有理智的業務會遇到問題。 在此處未發明不是忽略解決方案的充分理由。

您有兩個選擇:JCS或Memcache / EHCache

這兩個選項在功能上是等效的,但有一些關鍵的區別。 使用JCS時,緩存的對象不會序列化/反序列化。 它們保留為Java對象,因此存儲和檢索它們非常快。 但是,這意味着您的緩存位於JVM內部,因此使用了JVM的堆,並且其他JVM也無法訪問。 [JCS作為附件提供了某種類型的分布式功能]。

另一方面,Memcache / Ehcache是​​外部緩存,可在執行放置/獲取操作時執行序列化/反序列化。 在某些極端情況下,這可能會抵消緩存的好處。 因此基准測試速度至關重要。 如果合適,它是分布式的,它使用自己的內存,可能在另一個盒子上。 但這也意味着,您必須考慮JVM和外部緩存之間的數據安全性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM