我正在試圖用spring-memcached
實現分佈式緩存。該文檔建議 使用一個對象作爲關鍵字我需要在我的域類中使用@CacheKeyMethod 註釋。如何在simple-spring-memcached中的同一個鍵對象上指定不同的緩存鍵
但問題是我在不同的場景中使用相同的域類,每種情況下生成的密鑰具有不同的邏輯。對於User
類的示例,其中一種情況要求密鑰在city
和gender
方面是唯一的,但在另一種情況下,它需要在用戶的email
方面是唯一的,它基本上是您查找的基礎。
儘管用戶的電子郵件會確定城市和性別,所以我也可以在第一種情況下使用電子郵件作爲密鑰,但這意味着每個用戶需要單獨的緩存條目,而緩存的數據將與性別相同和城市是一樣的,預計這會大幅提高命中率(只要想一想你會有多少用戶可以成爲班加羅爾的男性)。
有沒有一種方法可以定義不同的鍵。如果產生密鑰的 的邏輯可以從域類本身外部化,那也是非常好的。
我閱讀了文檔,發現CacheKeyBuilder
和/或CacheKeyBuilderImpl
這樣的東西可以做到,但我無法理解如何繼續。
編輯.. 好..我有一個線索! CacheKeyBuliderImpl所做的是調用defaultKeyProvider實例上的generateKey方法,該方法在提供的域類的方法上查找@cachekeyannotation並執行找到的方法來獲取密鑰。
所以更換要麼CacheKeyBuilderImpl
自定義默認地將Impl或者你更換KeyProvider
的默認實現內CacheKeyBuilderImpl可能做的伎倆......但keyprovider參考硬連線至DefaultKeyProvider。
任何人可以幫助我實現CacheKeyBuilder(相對於什麼不同的方法做;文檔不澄清),還我怎麼把它注射到可以用來代替ususal CacheKeyBuilderImpl
我的場景有些勉強。第一種方法不是爲城市和性別尋找用戶,而是爲特定用戶尋找相關交易。返回類型是列表。 交易清單也可以通過電子郵件緩存,但交易的相關性取決於用戶的城市和性別。因此,最好將它們緩存在基於這些密鑰的密鑰上而不是電子郵件中,以便單個條目可以爲所有城市和性別用戶提供服務。目前該方法接受用戶作爲參數。一個度假勝地可能是將呼叫委託給另一個城市和gnder方法,並傳遞給方法並將它們用作鍵。 –
mickeymoon
它就像'public List getDealsForUser(用戶用戶){String City = user.getCity(); String gender = user.getGender(); // orm的獲取用戶的交易的呼叫 }' –
mickeymoon
您可以更改方法簽名而不是用戶參數使用城市和性別嗎?它將解決您的問題,並允許按城市和性別緩存交易列表。你也可以使用專用方法getDealsByCityAndGender創建一個新的bean,並從getDealsForUser調用它(自調用不被攔截,因此緩存不起作用) – ragnor