分代缓存和转换
當(dāng)然,對于每個(gè)請求,我們都必須知道版本號,這就是為什么必須將其存儲在全局緩存中(但根據(jù)我們的一致性要求,它也可以異步地分布在整個(gè)集群中)。 但是,數(shù)據(jù)本身可以存儲在本地緩存中。 因此,如果我們的系統(tǒng)是只讀的,那么每個(gè)請求唯一要做的“昂貴”操作就是檢索我們感興趣的實(shí)體的版本號。這通常是非常簡單的信息,可以完全保留在-記憶。
根據(jù)數(shù)據(jù)類型和使用模式,您可以緩存單個(gè)實(shí)體(例如,對于Person實(shí)體,緩存鍵可以是person-9128-123是id,123是版本號)或整個(gè)批次(例如,對于一個(gè)Countries實(shí)體,緩存密鑰可以是countries-8 ,版本號是8。 此外,在全局緩存中,您可以按ID或按實(shí)體保存最新的版本號。 意味著當(dāng)版本更改時(shí),您會使特定實(shí)體或所有實(shí)體無效。
在編寫了大部分Envers之后 ,我很自然地想到可以將實(shí)體修訂號用作緩存版本 。 隨后的Envers修訂版是單調(diào)遞增的數(shù)字,對于每筆交易,您都會獲得下一個(gè)。 因此,每當(dāng)緩存的實(shí)體發(fā)生更改時(shí),您都必須使用最新的修訂版號填充全局緩存。
Envers提供了幾種獲取修訂號的方法。 在交易期間,您可以調(diào)用AuditReader .getCurrentRevision()方法,該方法將為您提供修訂元數(shù)據(jù),包括修訂號。 如果您想要更細(xì)粒度的控制,則可以實(shí)現(xiàn)自己的偵聽器( EntityTrackingRevisionListener ),請參閱docs ,并在實(shí)體更改時(shí)得到通知,并在那里更新全局緩存。 您還可以注冊交易完成后的回調(diào),并在事務(wù)邊界之外更新緩存。 或者,如果您知道實(shí)體ID,則可以使用AuditReader.getRevisions或AuditQueryCreator查找最大修訂版本號。
由于您可以在事務(wù)處理過程中獲取當(dāng)前的修訂版本號,因此,如果使用事務(wù)性緩存(例如Infinispan) ,甚至可以原子地更新全局緩存中的版本/修訂版。
當(dāng)然,除了審計(jì)之外,所有這些仍然是Envers的主要目的:)
參考: Adam Warski博客的Blog中來自JCG合作伙伴 Adam Warski的分代緩存和Envers 。
翻譯自: https://www.javacodegeeks.com/2012/07/generational-caching-and-envers.html
總結(jié)
- 上一篇: 引入Spring集成
- 下一篇: 微信渐变国旗头像怎么弄