0

我正在試圖用spring-memcached實現分佈式緩存。該文檔建議 使用一個對象作爲關鍵字我需要在我的域類中使用@CacheKeyMethod 註釋。如何在simple-spring-memcached中的同一個鍵對象上指定不同的緩存鍵

但問題是我在不同的場景中使用相同的域類,每種情況下生成的密鑰具有不同的邏輯。對於User類的示例,其中一種情況要求密鑰在citygender方面是唯一的,但在另一種情況下,它需要在用戶的email方面是唯一的,它基本上是您查找的基礎。

儘管用戶的電子郵件會確定城市和性別,所以我也可以在第一種情況下使用電子郵件作爲密鑰,但這意味着每個用戶需要單獨的緩存條目,而緩存的數據將與性別相同和城市是一樣的,預計這會大幅提高命中率(只要想一想你會有多少用戶可以成爲班加羅爾的男性)。

有沒有一種方法可以定義不同的鍵。如果產生密鑰的 的邏輯可以從域類本身外部化,那也是非常好的。

我閱讀了文檔,發現CacheKeyBuilder和/或CacheKeyBuilderImpl這樣的東西可以做到,但我無法理解如何繼續。

編輯.. 好..我有一個線索! CacheKeyBuliderImpl所做的是調用defaultKeyProvider實例上的generateKey方法,該方法在提供的域類的方法上查找@cachekeyannotation並執行找到的方法來獲取密鑰。

所以更換要麼CacheKeyBuilderImpl自定義默認地將Impl或者你更換KeyProvider的默認實現內CacheKeyBuilderImpl可能做的伎倆......但keyprovider參考硬連線至DefaultKeyProvider。

任何人可以幫助我實現CacheKeyBuilder(相對於什麼不同的方法做;文檔不澄清),還我怎麼把它注射到可以用來代替ususal CacheKeyBuilderImpl

回答

0

簡單的彈簧的Memcached(SSM )沒有被設計成允許這種低級定製。正如你寫的一種方法是用自己的實現替換CacheKeyBuilderImpl。默認實現是硬連線的,但可以使用自定義simplesm-context.xml配置輕鬆替換。

當我明白你的問題,你希望緩存你用戶根據不同的按鍵對象取決於使用情況。它支持開箱即用,因爲默認情況下,SSM使用方法參數來生成緩存鍵而不是結果。

實施例:

@ReadThroughMultiCache(namespace = "userslist.cityandgenre", expiration = 3600 
public List<User> getByCityAndGenre(@ParameterValueKeyProvider(order = 0) String city, @ParameterValueKeyProvider(order = 1) String genre) { 
    // implementation 
} 

@ReadThroughSingleCache(namespace = "users", expiration = 3600) 
public User getByEmail(@ParameterValueKeyProvider String email) { 
    // implementation 
} 

一般而言,@CacheKeyMethod僅用於如果包含該方法對象作爲參數的方法傳遞和參數由@ParameterValueKeyProvider註釋來生成緩存鍵

+0

我的場景有些勉強。第一種方法不是爲城市和性別尋找用戶,而是爲特定用戶尋找相關交易。返回類型是列表。 交易清單也可以通過電子郵件緩存,但交易的相關性取決於用戶的城市和性別。因此,最好將它們緩存在基於這些密鑰的密鑰上而不是電子郵件中,以便單個條目可以爲所有城市和性別用戶提供服務。目前該方法接受用戶作爲參數。一個度假勝地可能是將呼叫委託給另一個城市和gnder方法,並傳遞給方法並將它們用作鍵。 – mickeymoon

+0

它就像'public List getDealsForUser(用戶用戶){String City = user.getCity(); String gender = user.getGender(); // orm的獲取用戶的交易的呼叫 }' – mickeymoon

+0

您可以更改方法簽名而不是用戶參數使用城市和性別嗎?它將解決您的問題,並允許按城市和性別緩存交易列表。你也可以使用專用方法getDealsByCityAndGender創建一個新的bean,並從getDealsForUser調用它(自調用不被攔截,因此緩存不起作用) – ragnor

相關問題