【问题标题】:Spring Cache: Using memcached as a distributed cacheSpring Cache:使用 memcached 作为分布式缓存
【发布时间】: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() 方法以缓存名称作为前缀。

所以我的问题是:

  1. 我是否正确理解这里发生了什么?
  2. 是否可以使用 spymemcached 进行配置以使其按预期方式运行?

另外,任何其他想法都可以理解!谢谢!

【问题讨论】:

  • 你得到的Type2是什么,它与原始Type1List有什么关系? Cache1Cache2 是什么(的实现),它们的设置是什么?
  • Type1 和 Type 2 只是 POJO,它们没有直接关系。配置最少(一些到期时间)...
  • 对我来说,它表示某些东西正在使用相同的键存储不同的(类型)数据。这是对分布式缓存的错误使用。
  • 好吧,我们正在使用许多缓存,我希望一个缓存的缓存键不应该影响另一个缓存的键。 Spring 和 spymemcached 应该解决这个问题,在我看来,应用程序应该像以前一样工作......
  • 如果该键在缓存服务器的所有实例之间不是唯一的,您如何期望分布式缓存(应该处理所有请求的接口)处理通过该键获取某些内容的请求?如果您使用put(key, data, dataType) 允许缓存决定在哪里存储对象,那么您应该有类似的get(key, dataType) 以允许进行相同的决定。我希望get(key) 返回第一个可用的数据实例

标签: java memcached amazon-elasticache spring-cache


【解决方案1】:

好的,我发现这是simple-spring-memcached 版本 3.2.0 的问题。 3.3.0 版本修复了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 2017-03-29
    相关资源
    最近更新 更多