@Cacheable是否意识到'Thundering Herd'的问题?

时间:2011-09-01 15:19:25

标签: java spring ehcache

“雷鸣般的群体”问题发生在高度并发的环境中(通常是许多用户)。当许多用户同时向同一条数据发出请求时,如果缓存未命中(缓存中没有缓存元素的数据),则会触发雷鸣般的群体问题。

我找不到ehcache-spring-annotations正在解决这个问题的证据。

我是否要编写包装器并使用显式锁定机制?

1 个答案:

答案 0 :(得分:2)

对你的问题的简短回答是“不”。缓存注释在某种程度上是通用的,而像“雷鸣般的群体”这样的问题的解决方案是特定于实现的。

通过你的后续评论,我将假设你正在使用Ehcache作为实现。您引用的描述问题的页面提供了几个解决方案,例如使用BlockingCache作为底层缓存的装饰器。 (他们记录这些解决方案的事实暗示Ehcache默认不处理“雷鸣般的群体”问题。)

BlockingCache似乎是最直接的解决方案,所以我从这开始。以编程方式使用BlockingCache非常简单,但是通过配置使用它会使您需要做更多的工作。您需要通过扩展Ehcache的CacheDecoratorFactory来编写自己的BlockingCacheDecoratorFactory。完成后,您可以在ehcache.xml中为需要它的任何缓存配置它。但要小心这样做;不必要地将缓存转换为BlockingCache会对性能产生负面影响。

假设您编写了自己的装饰工厂org.stacker.cache.BlockingCacheDecoratorFactory,并且您有一个名为“adImages”的缓存,您想要保护其免受“雷鸣般的群体”问题的影响。您的新ehcache.xml条目可能如下所示:

<cache name="adImages"
           maxElementsInMemory="5000"
           eternal="false"
           timeToIdleSeconds="1800"
           timeToLiveSeconds="3600"
           overflowToDisk="false">
  <cacheDecoratorFactory class="org.stacker.cache.BlockingCacheDecoratorFactory" />
</cache>

查看http://ehcache.org/documentation/user-guide/cache-decorators处的用户指南,了解Ehcache中的缓存装饰器。我希望这会有所帮助。