我可能会问非常基本的问题,但无法通过谷歌搜索找到明确的答案,所以把它放在这里。
Memcached 在单独的进程中缓存信息。因此为了获取缓存的信息需要进程间通信(java中一般是序列化)。这意味着,通常,要获取缓存的对象,我们需要获取序列化的对象并将其传输到网络。
序列化和网络通信都是昂贵的操作。如果memcached需要同时使用这两个(一般来说,可能存在不需要网络通信的情况),那么Memcached有多快呢?复制不是更好的解决方案吗?
或者这是分发/平台独立性/可扩展性与性能的权衡?
最佳答案
您是对的,在共享缓存(如 memcached)中查找某些内容比在本地缓存中查找要慢(我认为这就是您所说的“复制”的意思)。
但是,共享缓存的优点在于它是共享的,这意味着缓存的每个用户都可以访问比本地缓存使用的内存更多的缓存。
考虑一个具有 50 GB 数据库的应用程序,具有十个应用服务器,每个服务器专用 1 GB 内存用于缓存。如果使用本地缓存,则每台计算机将有 1 GB 缓存,相当于数据库总大小的 2%。如果您使用共享缓存,则您拥有 10 GB 缓存,相当于数据库总大小的 20%。本地缓存的缓存命中率会稍快一些,但共享缓存的缓存命中率会高得多。由于缓存未命中比任何一种缓存命中都要昂贵,因此稍微慢一点的命中对于减少未命中次数来说是值得付出的代价。
现在,确切的权衡确实取决于本地命中、共享命中和未命中成本的确切比率,以及数据库上的访问分布。例如,如果所有访问都是针对大小小于 1 GB 的一组“热”记录,则本地缓存将提供 100% 的命中率,并且与共享缓存一样好。不太极端的分布仍然可能会倾斜平衡。
在实践中,最佳配置通常(恕我直言!)是为 HitTest 的数据提供一个小但非常快的本地缓存,然后为长尾数据提供一个更大且更慢的缓存。您可能会认识到,这是其他缓存层次结构的形式:考虑处理器为每个内核提供小型、快速的 L1 缓存的方式,然后在单个芯片上的所有内核之间共享较慢的 L2/L3 缓存,然后可能是较慢的关闭 -系统中所有芯片共享的芯片缓存(当前的处理器实际上使用片外缓存吗?)。
关于java - 内存缓存和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11938420/