java - @Cacheable 是否知道 'Thundering Herd' 问题?

标签 java spring ehcache

“雷霆万钧”问题发生在高度并发的环境中(通常是很多用户)。当多个用户同时请求同一条数据,出现缓存未命中(缓存元素的数据不在缓存中)时,就会触发雷群问题。

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

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

最佳答案

对您的问题的简短回答是“否”。缓存注解旨在具有一定的通用性,而解决诸如“雷霆万钧”之类的问题是特定于实现的。

根据您的后续评论,我假设您正在使用 Ehcache 作为实现。您引用的描述问题的页面提供了几个解决方案,例如使用 BlockingCache 作为底层缓存的装饰器。 (他们记录此类解决方案的事实意味着 Ehcache 默认不处理“惊群”问题。)

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

假设您编写了自己的装饰器工厂 org.stacker.cache.BlockingCacheDecoratorFactory 并且您有一个名为“adImages”的缓存,您希望保护它免受“thundering herd”问题。您的新 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 中的缓存装饰器。我希望这会有所帮助。

关于java - @Cacheable 是否知道 'Thundering Herd' 问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7272487/

相关文章:

java - 无法将invokeAndWait中的值分配给全局字符串变量

java - 如何使用 jerseytest 的 @Configuration 类覆盖在 xml 中定义的 spring bean 定义

Spring Security - 基本 HTTP 身份验证 - 更改服务器消息

java - Hazelcast 通过共享内存快速恢复

java - defaultMethodEndpointAdapter bean 创建错误

java - Java中methodName(Params...params)是什么意思

java - 如何在 session 中提取 vector ?

java - org.springframework.web.bind.MissingServletRequestParameterException : Required Date parameter 'startTime' is not present

spring - Spring Cache Abstraction 和 Hibernate EHCache 哪个最好?

cluster-computing - ehcache 不在 liferay 集群中复制