如何在simple-spring-memcached中的同一个键对象上指定不同的缓存键

时间:2013-07-10 10:39:11

标签: memcached distributed-caching spymemcached simple-spring-memcached

我正在尝试使用spring-memcached实现分布式缓存。文档表明 使用一个对象作为键我需要在我的域类中使用@CacheKeyMethod的方法 注释。

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

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

有没有办法可以定义不同的键。如果是逻辑的,它也会很棒 生成密钥可以从域类本身外部化。

我阅读了文档,并发现名为CacheKeyBuilder和/或CacheKeyBuilderImpl的内容可以解决问题,但我无法理解如何继续。

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

因此,用自定义Impl替换CacheKeyBuilderImpl或者用你的替换{CM}内部的KeyProvider默认实现可能会有所帮助......但是keyprovider引用是硬连线到DefaultKeyProvider。

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

1 个答案:

答案 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