我正在尝试使用spring-memcached
实现分布式缓存。文档表明
使用一个对象作为键我需要在我的域类中使用@CacheKeyMethod的方法
注释。
但问题是我在不同的场景中使用相同的域类,并且在每种情况下生成的键具有不同的逻辑。对于User
类的示例,其中一个方案要求密钥在city
和gender
方面是唯一的,但在另一种情况下,它要求在用户方面是唯一的email
,它基本上就是您的查找基础。
虽然用户的电子邮件会确定城市和性别,但我也可以在第一种情况下使用电子邮件作为密钥,但这意味着每个用户都有单独的缓存条目,而缓存的数据只要性别和城市是相同的,预计会大幅增加命中率(只要想想你可以期待有多少用户来自班加罗尔)。
有没有办法可以定义不同的键。如果是逻辑的,它也会很棒 生成密钥可以从域类本身外部化。
我阅读了文档,并发现名为CacheKeyBuilder
和/或CacheKeyBuilderImpl
的内容可以解决问题,但我无法理解如何继续。
修改.. 好的..我有一个线索! CacheKeyBuliderImpl的作用是,它调用defaultKeyProvider实例上的generateKey方法,该方法在提供的域类的方法上查找@cachekeyannotation,并执行找到的方法来获取密钥。
因此,用自定义Impl替换CacheKeyBuilderImpl
或者用你的替换{CM}内部的KeyProvider
默认实现可能会有所帮助......但是keyprovider引用是硬连线到DefaultKeyProvider。
任何人都可以帮我实现CacheKeyBuilder(关于不同的方法做什么;文档没有说明)以及如何注入它来代替使用CacheKeyBuilderImpl
答案 0 :(得分:0)
简单的Spring Memcached(SSM)并未设计为允许这种低级别的自定义。正如您所写的那样,一种方法是用自己的实现替换 CacheKeyBuilderImpl 。默认实现是硬连线的,但可以使用自定义 simplesm-context.xml 配置轻松替换。
根据我的理解,您希望根据用例在不同的密钥下缓存用户对象。它支持开箱即用,因为默认情况下SSM使用method参数来生成缓存键而不是结果。
示例:
@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