【发布时间】:2014-05-01 17:41:56
【问题描述】:
对于许多 java 服务,我们使用 AWS ElastiCache 作为由 Spring Cache 抽象和 spymemcached 集成的分布式缓存。
在一项服务中,我看到我得到的结果类型与我预期的不同,从而导致 ClassCastException。准确地说:我有一个缓存键,因此我期望一个列表,但我得到的是 Type2 的结果。
我们定义了多个缓存,其中一些使用相同的缓存键:
Cache1:
cacheKey -> List<Type1>
Cache2:
cacheKey -> Type2
由于它们位于不同的缓存中,因此当我们使用基于简单哈希图的缓存时,这很有效。但是,对于 ElastiCache/Memcached,我们似乎并没有真正的不同缓存(从我对 memcached 的了解来看,这很有意义 - 这并不多)。
我希望 spymemcached 会通过操作缓存键来处理这个问题,这样应用程序就不需要知道实际的缓存实现(这可以通过操作缓存键并在它们前面加上缓存名称 ie 来完成)。
从一些调试会话和我看到的错误来看,情况似乎并非如此。
我专门研究过这个类:
com.google.code.ssm.spring.SSMCache
L82: value = cache.get(getKey(key), null);
L154: private String getKey(final Object key) {
L155: return key.toString();
L156: }
我本来希望 getKey() 方法以缓存名称作为前缀。
所以我的问题是:
- 我是否正确理解这里发生了什么?
- 是否可以使用 spymemcached 进行配置以使其按预期方式运行?
另外,任何其他想法都可以理解!谢谢!
【问题讨论】:
-
你得到的
Type2是什么,它与原始Type1和List有什么关系?Cache1和Cache2是什么(的实现),它们的设置是什么? -
Type1 和 Type 2 只是 POJO,它们没有直接关系。配置最少(一些到期时间)...
-
对我来说,它表示某些东西正在使用相同的键存储不同的(类型)数据。这是对分布式缓存的错误使用。
-
好吧,我们正在使用许多缓存,我希望一个缓存的缓存键不应该影响另一个缓存的键。 Spring 和 spymemcached 应该解决这个问题,在我看来,应用程序应该像以前一样工作......
-
如果该键在缓存服务器的所有实例之间不是唯一的,您如何期望分布式缓存(应该处理所有请求的接口)处理通过该键获取某些内容的请求?如果您使用
put(key, data, dataType)允许缓存决定在哪里存储对象,那么您应该有类似的get(key, dataType)以允许进行相同的决定。我希望get(key)返回第一个可用的数据实例
标签: java memcached amazon-elasticache spring-cache