Spring Cache 自定義注解


1.在使用spring cache注解如cacheable、cacheevict、cacheput過程中有一些問題;

比如,我們在查到一個list后,可以將list緩存到一個鍵對應的區域里;當新增、修改、刪除一個元素的時候,其實我們

需要的是只將cache的list里的元素變動就可以了,但因為只有一個鍵,沒法做到只更改一個元素,只能整個list重新加載,

對性能還是有一定的影響;

2.對spring擴展,增加自定義cache,

@MyCacheDelete:當刪除元素后,從cache里取出該key的緩存list,從list里刪除指定id的元素,再將list寫入緩存;

@MyCachePut :當新增修改元素后,從cache里找到該key對應的list,從list里找到修改的元素刪除(新增不需要刪除),然后將修改后的記錄寫入list,再將list寫入緩存;

3.具體的步驟:

1)定義注解@MyCacheDelete,@MyCachePut

2)定義注解攔截器

clip_image001[4]

該攔截器,其中最重要的一點就是解析key值,因為在緩存查詢數據時我們還是使用cacheable,所以定義的key也要和cacheable一致;

@MyCachePut( key="'"+ ConstUtil.C_CACHE_KEY_PRE+"BasicData'+#info.parentId",value = ConstUtil.C_CACHE_NAME, pid = "recid")

上面info.parentId的值, 是spring表達式運行時解析出的;所以自定義攔截器里也要和spring框架一樣算出key值;

這里重新實現了CacheAnnotationParser,讓它解析自定義的注解,這樣,可以調用spring框架里的generateKey;

clip_image002

3)有了cache的key,后面就簡單了,就是從cache里的取數據、修改數據、更新緩存操作了;

雖然這種方式,解決了單條數據影響cache的list重新加載問題;但我們在設計緩存時,還是要盡量通過細分的業務去緩存對應的數據,不要讓

緩存的list過大,過大的list對於cache的存取、序列化反序列化都有性能的影響;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM