envers_分代缓存和Envers
envers
Konrad最近在我們公司的技術室中分享了有關如何完成緩存的有趣文章,這是一個大型的波蘭社交網絡nk.pl。 算法中的核心概念之一是分代緩存 (請參閱此處或此處 )。 基本思想是,對于緩存鍵,您使用一些特定于實體的字符串+版本號。 每當數據更改時,版本號都會增加,從而使所有舊的緩存條目無效,并防止讀取過時的數據。 這假設緩存具有一些垃圾回收,例如它可能只是LRU緩存。當然,對于每個請求,我們都必須知道版本號–這就是為什么必須將其存儲在全局緩存中(但根據我們的一致性要求,它也可以異步分布在整個集群中)。 但是,數據本身可以存儲在本地緩存中。 因此,如果我們的系統是只讀的,那么每個請求唯一要做的“昂貴”操作就是檢索我們感興趣的實體的版本號。這通常是非常簡單的信息,可以完全保留在-記憶。
根據數據類型和使用模式,您可以緩存單個實體(例如,對于Person實體,緩存鍵可以是person-9128-123是id,版本號123)或全部(例如,對于一個Countries實體,緩存密鑰可以是countries-8 ,版本號是8。 此外,在全局緩存中,您可以按ID或按實體保存最新的版本號; 意味著當版本更改時,您會使特定實體或所有實體無效。
編寫了大部分Envers之后 ,我自然就可以將實體修訂號用作緩存版本 。 隨后的Envers修訂版是單調遞增的數字,對于每個事務,您都會獲得下一個。 因此,每當緩存的實體發生更改時,您都必須使用最新的修訂版號填充全局緩存。
Envers提供了幾種獲取修訂號的方法。 在事務期間,您可以調用AuditReader .getCurrentRevision()方法,該方法將為您提供修訂元數據,包括修訂號。 如果您想要更細粒度的控制,則可以實現自己的偵聽器( EntityTrackingRevisionListener ),請參閱docs ,并在實體更改時得到通知,并在那里更新全局緩存。 您還可以注冊交易完成后的回調,并在事務邊界之外更新緩存。 或者,如果您知道實體ID,則可以使用AuditReader.getRevisions或AuditQueryCreator查找最大修訂版本號。
由于您可以在事務處理過程中獲取當前的修訂版本號,因此,如果使用事務性緩存(例如Infinispan) ,甚至可以原子地更新全局緩存中的版本/修訂版。
當然,除了審計之外,所有這些仍然是Envers的主要目的:)
參考: Adam Warski博客的Blog中來自JCG合作伙伴 Adam Warski的分代緩存和Envers 。
翻譯自: https://www.javacodegeeks.com/2012/07/generational-caching-and-envers.html
envers
總結
以上是生活随笔為你收集整理的envers_分代缓存和Envers的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java A的新本地变量类型推断
- 下一篇: 在Hibernate中启用实体和查询缓存