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)定義注解攔截器
該攔截器,其中最重要的一點就是解析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;
3)有了cache的key,后面就簡單了,就是從cache里的取數據、修改數據、更新緩存操作了;
雖然這種方式,解決了單條數據影響cache的list重新加載問題;但我們在設計緩存時,還是要盡量通過細分的業務去緩存對應的數據,不要讓
緩存的list過大,過大的list對於cache的存取、序列化反序列化都有性能的影響;