Java memcached与性能

Java memcached与性能,java,performance,caching,memcached,spymemcached,Java,Performance,Caching,Memcached,Spymemcached,我可能会问一个非常基本的问题,但通过谷歌搜索找不到一个明确的答案,所以把它放在这里 Memcached在单独的进程中缓存信息。因此,为了获得缓存的信息,需要进程间通信(在java中通常是序列化)。这意味着,一般来说,要获取缓存对象,我们需要获取一个序列化对象,并将其传输到网络 序列化和网络通信都是成本高昂的操作。如果memcached需要同时使用这两种功能(一般来说,可能不需要网络通信),那么memcached的速度有多快?复制不是更好的解决方案吗 或者这是在分发/平台独立性/可扩展性与性能之间

我可能会问一个非常基本的问题,但通过谷歌搜索找不到一个明确的答案,所以把它放在这里

Memcached在单独的进程中缓存信息。因此,为了获得缓存的信息,需要进程间通信(在java中通常是序列化)。这意味着,一般来说,要获取缓存对象,我们需要获取一个序列化对象,并将其传输到网络

序列化和网络通信都是成本高昂的操作。如果memcached需要同时使用这两种功能(一般来说,可能不需要网络通信),那么memcached的速度有多快?复制不是更好的解决方案吗


或者这是在分发/平台独立性/可扩展性与性能之间的权衡?

您忽略了磁盘i/o的成本,这通常是任何流程中最慢的部分,并且是IMO使用内存缓存(如memcached)的主要驱动程序。

内存缓存通过网络使用ram内存。复制使用ram内存和持久磁盘内存来获取数据。他们的目的大不相同

如果您只考虑使用Memcached来存储易于获取的数据,例如表记录的1-1映射:you-re-good-have-abad-time:

另一方面,如果您的数据是复杂SQL查询的整个结果集,甚至可能会流入SQL内存池(并且需要临时写入磁盘以获取),那么您将看到一个巨大的速度提升

上一个示例提到需要将数据写入磁盘以执行读取操作-是的,如果结果集对于内存来说太大(想象一个
交叉连接
),则会发生这种情况,这意味着您同时对该驱动器进行读取和写入(想到了抖动)


例如,在用C编写的高度优化的应用程序中,总处理时间可能为1微秒,并且可能需要等待联网和/或序列化/反序列化(封送/解封送)的时间比应用程序执行时间长得多。这时,您也会开始感受到网络内存缓存的局限性。

在共享缓存(如memcached)中查找某些内容比在本地缓存(我认为您所说的“复制”)中查找要慢,这是正确的

但是,共享缓存的优点是它是共享的,这意味着缓存的每个用户都可以访问比本地缓存使用内存更多的缓存

考虑一个有50 GB数据库的应用程序,它有十个应用程序服务器,每个服务器都有1 GB的内存用于缓存。如果使用本地缓存,则每台计算机将有1GB的缓存,相当于数据库总大小的2%。如果使用共享缓存,则有10GB的缓存,相当于数据库总大小的20%。使用本地缓存时,缓存命中率会快一些,但使用共享缓存时,缓存命中率会高得多。由于缓存未命中比任何一种缓存命中都要昂贵得多,因此稍微慢一点的命中是减少未命中次数值得付出的代价

现在,确切的权衡确实取决于本地命中、共享命中和未命中的成本的确切比率,还取决于数据库上的访问分布。例如,如果所有访问都是对一组小于1GB的“热”记录的访问,那么本地缓存的命中率将达到100%,与共享缓存一样好。不太极端的分布仍可能使天平倾斜


在实践中,最佳配置通常是(IMHO!)为最热的数据提供一个小但非常快的本地缓存,然后为长尾数据提供一个更大、更慢的缓存。您可能会认识到,作为其他高速缓存层次结构的形状:考虑处理器对于每个内核具有小的、快速的L1高速缓存的方式,然后较慢的L2/L3高速缓存在单个芯片上的所有内核之间共享,然后可能是系统中所有芯片共享的较低的片外高速缓存。(当前的处理器是否实际使用片外缓存?).

AFAIK,它在单独的进程中保存一个主副本。它也在本地保存缓存副本。@PeterLawrey,我假设“它”是指客户端。是的,客户端可以在本地存储缓存,但它可能会增加失效的复杂性,不是吗?这意味着,即使客户端也必须维护缓存策略,包括失效、大小等。这就是说真的。拥有一个一致的分布式缓存不是一个简单的问题。我同意磁盘I/O的成本高于网络I/O和序列化,但1.缓存将涉及维护缓存策略的额外成本(失效等).2.复制似乎更好,因为客户端只与RAM通信。网络I/O将发生在幕后,不应影响可见的性能。@Sandepjindal如果您专门谈论访问数据库资源,那么在加速数据读取方面,一种技术肯定优于另一种技术。Replicatio但是,n确实会由于复制延迟而出现数据一致性问题。因此,归根结底,这实际上取决于对于特定应用程序,什么是最佳解决方案。感谢您的精彩解释!感谢所有人的回答。我无法将多个答案标记为可接受的答案,但将所有答案混合在一起可以消除很多疑问。我Memcached和传统缓存(如EHCache等)并不是互补的。两者都有折衷之处,可能适合不同的应用程序。前提是“缓存未命中比任何一种缓存命中都要昂贵得多”如果您的数据库模式、索引和查询针对您的应用程序进行了很好的优化,则是错误的。在这种情况下,memcached可能会降低您的网站速度。这是通过艰苦的方式了解到的。@Seunoswa:有趣的一点。您能再说一点吗?是因为您的memcached命中率很高,还是错过率很低?错过率是h吗