0

我正在尝试使用spring-memcached. 文档建议使用对象作为键,我需要在我的域类中有一个带有 @CacheKeyMethod 注释的方法。

但问题是我在不同场景中使用相同的域类,并且在每种情况下生成的密钥具有不同的逻辑。例如,User其中一个场景的类要求键在cityand方面是唯一的gender,但在另一种情况下,它要求在用户方面是唯一的email,它本质上是您的查找所基于的。

虽然用户的电子邮件将决定城市和性别,所以我也可以在第一种情况下使用电子邮件作为键,但这意味着每个用户都有单独的缓存条目,而缓存的数据将相同,只要性别和城市相同,这有望大幅提高命中率(想想你可以期望有多少用户是来自班加罗尔的男性)。

有没有办法可以定义不同的键。如果生成密钥的逻辑可以从域类本身外部化,那就太好了。

我阅读了文档并发现某些东西称为CacheKeyBuilder和/或CacheKeyBuilderImpl可以解决问题,但我不明白如何继续。

编辑.. 好的..我有一个线索!CacheKeyBuliderImpl 所做的是,它调用 defaultKeyProvider 实例上的 generateKey 方法,该方法在提供的域类的方法上查找 @cachekeyannotation 并执行找到的方法以获取密钥。

因此,CacheKeyBuilderImpl用自定义 Impl 替换 或用KeyProvider你的替换 CacheKeyBuilderImpl 中的默认实现可能会解决问题……但是 keyprovider 引用是硬连线到 DefaultKeyProvider 的。

任何人都可以帮助我实现 CacheKeyBuilder(关于不同方法的作用;文档没有说明)以及如何注入它以代替通常的 CacheKeyBuilderImpl

4

1 回答 1

0

简单的 Spring 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 注释时才用于生成缓存

于 2013-07-16T07:11:43.977 回答