![](/img/trans.png)
[英]How to synchronize access to ehcache, memcached & other key-value stores?
[英]Using ehcache in front of memcached
我们有一个Web应用程序从数据库加载User对象。 它是一个包含数千个并发用户的高容量应用程序,因此我们正在研究如何缓存User对象以最大限度地减少数据库负载。
目前使用ehcache但正在查看memcached以降低应用程序的内存需求,并使其更具可扩展性。
我们目前使用memcached的问题是序列化User实例带来的cpu负载。 我们正在寻找加速序列化的方法,但也考虑我们是否可以使用由memcached服务器支持的更小的ehcache缓存。
有没有人有任何使用memcached支持的ehcache的经验(即首先查看ehcache,如果用户不在那里,查看内存缓存,如果不在那里查看数据库)?
这种方法有任何缺点吗?
如果你愿意离开Ehcache,你可以考虑Infinispan ,它现在包括与memcache的集成。 比Ehcache更有效率,但不是太多。
从版本4.1开始,Infinispan发行版包含一个实现memcached文本协议的服务器模块。 这允许memcached客户端与一个或多个Infinispan支持的memcached服务器通信。 这些服务器可以独立工作,就像memcached一样,每个服务器独立运行,不与其他服务器通信,或者它们可以集群在服务器复制或分发其内容到其他Infinispan支持的memcached服务器的地方,从而为客户提供故障转移功能。
按照你的建议去做是有意义的。 我们遇到了与memcached相同的问题,因为来回序列化对象的开销不值得单独用于大批量应用程序。 拥有本地缓存可减少应用程序端的负载,而memcached可减少数据库端的负载。 缺点是编写两层缓存和维护缓存一致性的额外复杂性。 我会尽量减少你需要使用它的地方。
Infinispan可以将对象存储为实例并最大限度地减少序列化开销,而不是在每个节点上复制数据,它可以分发数据以更好地利用内存,或者可以限制要保留在内存中的条目数量。 您还可以让它在更新值时向其他节点发送失效消息,而不是发送序列化值。
此外,当它仍然需要序列化时,它使用非常高效的Marshaller而不是Java的序列化,并且从版本5开始,您可以插入自定义外部化器来自定义某些类型的线格式以给它额外的推动(通常不需要) ,但很高兴)。
如果您出于其他原因查看memcached,请注意Infinispan还“说出”memcached文本协议,因此如果您有其他客户端,您仍然可以与它集成。
您无法替换ehcache中的DiskStore,因为它是最终的。 你可以实现一个新的OffHeapStore并像这样插入它。 这就是BigMemory的工作原理。 有一个名为DirectMemory的Apache项目做同样的事情。
有关详细信息,请参阅我的帖子:
http://forums.terracotta.org/forums/posts/list/0/8833.page#40635
本文通过定义我们自己的MultiTieredCacheManager和MultiTieredCache,指定我们如何在spring应用程序中的分布式缓存前使用进程内缓存:
你可以简单地覆盖net.sf.ehcache.Cache.createDiskStore()
new Cache(..) {
protected Store createDiskStore() {
if (isDiskStore()) {
// default: return DiskStore.create(this, diskStorePath);
MemcachedStore store = new MemcachedStore(..);
getCacheConfiguration().addConfigurationListener(store);
return store;
} else {
return null;
}
}
}
MemcachedStore
是net.sf.ehcache.store.Store
的自定义实现,您必须自己完成。 这不是微不足道的,但是再一次,从DiskStore
开始应该不会太困难。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.