[英]In-memory caching objects in java
我想在內存中緩存對象。 要求如下:
這里的安全性也是一個問題,因為我們將緩存一些敏感數據。 此數據將被緩存在內存中。 我真的應該擔心安全性並加密數據嗎?
我正在尋找一個提供類似功能的Java類。
目前,我正在考慮擴展WeakHashMap
,並實現各種私有/公共方法來滿足要求。
如果您有其他任何想法,請在這里分享。
您不想使用WeakHashMap
。 SoftHashMap
會更近一些,但在標准庫中不可用。 如果您是我,我將查看Guava的緩存類以獲取提示。
但是,還有一些其他想法:
當JVM內存不足(弱引用類型)時,應按比例縮小。
你的意思是soft reference
。 但是無論如何,這個要求對我來說有點難聞。 我承認這可能是一個有效的要求,但是很少有人真正需要它。 如果可以合理地很好地預測記錄的大小,並且計划對要緩存的記錄數量進行硬性限制,則很有可能不需要這種復雜性。
不應使用第三方庫。
每個人都提到這一點,他們是對的。
在安全性方面,對緩存在內存中的數據進行加密的有效性尚不確定。 您還必須將加密密鑰存儲在內存中。 我敢打賭,除了攻擊者讀取您的內存內容之外,還有很多事情要擔心。
不,您不應該這樣做。 WeakHashMap不是緩存!
現在,很容易理解為什么WeakHashMap無法用於緩存。 首先,它無論如何都不起作用,因為它對鍵而不是對地圖值使用軟引用。 但除此之外, 垃圾收集器會主動回收僅由弱引用引用的內存 。 這意味着一旦您丟失了對在WeakHashMap中用作鍵的對象的最后一個強引用,垃圾回收器將立即回收該映射條目。
...
那么,該如何在Java中實現緩存呢?
我的建議是使用免費提供的Cache實現之一,例如JCS , OSCache 等 。 這些庫通過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.